转换不会转换ggplot2中的线段

时间:2013-02-20 15:48:53

标签: r ggplot2

我正在尝试使用一些线段来注释一个图。通过对数转换最好地显示x轴。我正在使用处理转换的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式的解决方案!

黑客解决方案:

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 个答案:

答案 0 :(得分: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,而不是log

T <- scale_x_continuous(trans = "log10")

现在,如果您绘制B + S1 + S2 + T

ggplot2_aes

更进一步:将您的B+S1+S2+TS1以及S2与我修改后的版本进行比较:

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

看到美学会相应地转变。

相关问题