Сегментная аннотация в масштабе 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()
делает преобразования... но в этом случае преобразования на оси х должны быть равномерными (хорошо, log10), верно?
Я работаю над:
R version 3.0.0 (2013-04-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)
ggplot2_0.9.3.1
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)