Аннотация сегмента в масштабе log10 работает по-разному для конца и начала сегмента?

Я обнаружил довольно запутанную функцию в ggplot, пытаясь аннотировать сегменты в масштабе log10. Следующий код создает график ниже:

library(ggplot2)
dat <- data.frame(x = x <- 1:1000, y = log(x)) 
ggplot(dat, aes(x = x, y = y)) +
geom_line(size = 2) + scale_x_log10() +
annotate("segment", x = 0, xend = log10(100), y = log(100), yend = log(100), linetype = 2) +
annotate("segment", x = log10(100), xend = log10(100), y = 0, yend = log(100), linetype = 2)

введите здесь описание изображения

Принимая во внимание, что это то, что я после:

ggplot(dat, aes(x = x, y = y)) +
geom_line(size = 2) + scale_x_log10() +
annotate("segment", x = 0, xend = log10(100), y = log(100), yend = log(100), linetype = 2) +
annotate("segment", x = 100, xend = log10(100), y = 0, yend = log(100), linetype = 2)

введите здесь описание изображения

Другими словами, мне нужно log10 преобразовать конечную точку сегмента по оси X, но не начало. Есть ли у такого поведения логическое объяснение? Я понимаю, что aes() выполняет преобразования... но в этом случае , преобразования по оси X должны быть равномерными (ну, log10), верно?

Я работаю над:

R version 3.0.0 (2013-04-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)
ggplot2_0.9.3.1 

person Mikko    schedule 25.04.2013    source источник


Ответы (1)


Обнаружено, что это ошибка scales() (не только для scale_x_log10()), когда он используется с annotate() и предоставляется значение xend (это уже заполнен как проблема W.Chang). В этом случае преобразование xend производится только в одном направлении - log10 значения не берется, а вычисляется мощность.

scale_x_log10() работает без проблем, если, например, "rect" используется в annotate() и xmin, xmax указаны значения.

ggplot(dat,aes(x,y))+geom_line()+
  scale_x_log10()+
  annotate("rect",xmin=100,xmax=1000,ymin=log(10),ymax=log(200))

введите здесь описание изображения

Обходным решением этой проблемы может быть использование geom_segment() с data=NULL и всеми остальными значениями, помещенными в aes().

ggplot(dat, aes(x = x, y = y)) +
  geom_line(size = 2) + scale_x_log10() +
  geom_segment(data=NULL,aes(x = 100, xend = 100, y = 0, yend = log(100)), 
                                                             linetype = 2)

введите здесь описание изображения

person Didzis Elferts    schedule 25.04.2013