2013-02-20 3 views
2

Я пытаюсь аннотировать сюжет, используя некоторые сегменты линии. Ось оси лучше всего отображается с помощью преобразования журнала. Я использую ggplot2, который обрабатывает преобразования, что также означает, что мне не нужно преобразовывать в местоположение моих сегментов линии. Но когда я применяю преобразование, сегменты линии исчезают (ну - они больше не «вписываются» в окно графика из-за преобразования). Любые предложения о том, как заставить их «следить» за трансформацией?Преобразование не пересекает сегменты линии в ggplot2

Минимальный пример:

library(ggplot2) 
## Base plot: 
B <- ggplot(data = data.frame(X = 10^(1:10), Y = 1:10), 
      aes(x = X, y = Y)) + geom_point() 
## Generate segments: 
S1 <- geom_segment(x = 1000, xend = 1000, 
        y = 3, yend = 5) 
S2 <- geom_segment(x = 20, xend = 2.5e9, 
        y = 8, yend = 7) 
## Generate transformation: 
T <- scale_x_continuous(trans = "log") 

Сравните следующие:

B    # Basic plot 
B + T   # Basic plot, transformed 
B + S1 + S2  # Basic, untransformed, with segments 
B + S1 + S2 + T # Should be transformed with segments: segments missing 

Я знаю, что я мог бы просто превратить расположение сегментов, но я на самом деле, а найти более ggplot2 -style решение !

Hack Решение:

S3 <- geom_segment(x = log(1000), xend = log(1000), 
        y = 3, yend = 5) 
S4 <- geom_segment(x = log(20), xend = log(2.5e9), 
        y = 8, yend = 7) 
B + S1 + S2 
B + S3 + S4 + T #Fine, but not elegant. 

Спасибо!

ответ

1

Не уверен, что сюжет, который я показал, является тем, что вы ожидаете. Но если это так, приведенное ниже объяснение действительно.

В ggplot2 трансформации выполняются на aesthetics. И данные сначала преобразуются перед графикой (или делают что-то вроде фитинга, ex: geom_smooth и т. Д. Делается на преобразованных данных).

Итак, если вы хотите преобразование журнала должны быть отражены в вашем сегменте, вам придется обернуть вокруг с aes как:

S1 <- geom_segment(aes(x=1000, xend=1000, y=3, yend=5)) 
S2 <- geom_segment(aes(x=20, xend=2.5e9, y=8, yend=7)) 

И, кстати, ваша трансформация должна быть log10, НЕ войти:

T <- scale_x_continuous(trans = "log10") 

Теперь, если участок B + S1 + S2 + T:

ggplot2_aes

один шаг дальше: Сравните ваш B+S1+S2+T и один с S1 и S2 модифицирована с моей помощью:

ggplot_build(B+S1+S2)$data # and 
ggplot_build(B+S1+S2+T)$data 

, чтобы увидеть, что эстетика трансформируются соответственно.

+0

Спасибо, очень полезно! Правда о 'log10' - просто пытался свести к минимуму мой минимальный пример, но я зашел слишком далеко. – dynamo

Смежные вопросы