7

我在 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)

在此处输入图像描述

换句话说,我必须在 x 轴上对线段的端点进行 log10 转换,而不是开始。这种行为有合乎逻辑的解释吗?我知道aes()转换是否......但在这种情况下,x 轴上的转换应该是统一的(嗯,log10),对吧?

我正在研究:

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

1 回答 1

1

发现这是一个错误scales()(不仅适用于scale_x_log10()),当它与它一起使用annotate()xend提供值时(它已经被 W.Chang填充为问题)。在这种情况下,xend仅在一个方向上进行转换 - 不采用 log10 的值,但会计算功率。

scale_x_log10()例如,如果"rect"annotate()和中使用,则可以正常工作xminxmax提供值。

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

在此处输入图像描述

此问题的解决方法是使用geom_segment()withdata=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)

在此处输入图像描述

于 2013-04-25T10:43:06.500 回答