如何使用日志刻度

时间:2017-04-20 12:16:59

标签: r ggplot2

我通常在ggplot文本对象的位置美学中使用无限值​​,使标签出现在图的角落,而不管数据比例如何。我主要在制作多面板图形时使用它,每个面板中应该有字母来标识图例中的每个面板。但是,如果我希望标签出现在左侧或底部,这似乎不适用于日志比例,因为显然转换日志(-Inf)会返回NaN。这有一个简单的解决方案吗?我可以做一个长期的解决方法,但我希望有一些更容易的事情。示例如下:

notlogdata <- data.frame(x = 1:3,y = 1:3)
ggplot(notlogdata, aes(x = x,y = y)) +
  geom_point() +
  geom_text(data = data.frame(x = -Inf, y = Inf, l = 'a'), aes(label = l), hjust = -0.5, vjust = 1)

logdata <- data.frame(x = 10^(1:3), y = 10^(1:3))
ggplot(logdata, aes(x = x,y = y)) +
  geom_point() +
  geom_text(data = data.frame(x = -Inf, y = Inf, l = 'a'), aes(label = l), hjust = -0.5, vjust = 1) +
  scale_x_log10() +
  scale_y_log10()

第一张未转换轴的图表显示正常: plot with untransformed axes

第二个图没有标签并返回警告:

  

警告讯息:
  1:在自我$ trans $ transform(x)中:NaNs产生了   2:删除了包含缺失值的1行(geom_text)。

2 个答案:

答案 0 :(得分:1)

annotation_custom(gTree(children=gList(textGrob("a", hjust=0,x=0,vjust=1,y=1))))

enter image description here

答案 1 :(得分:0)

似乎不可能在对数转换轴上使用负定位美学,包括-Inf。这是一个使用牛皮图的解决方案,如zx8754

所示
library(cowplot)

notlogdata <- data.frame(x = 1:3,y = 1:3)
notlogplot <- ggplot(notlogdata, aes(x = x,y = y)) +
  geom_point() 

logdata <- data.frame(x = 10^(1:3), y = 10^(1:3))
logplot <- ggplot(logdata, aes(x = x,y = y)) +
  geom_point() +
  scale_x_log10() +
  scale_y_log10()

plot_grid(notlogplot, logplot, labels=c('a','b'), hjust=-8)

这将输出以下图表:

cowplot image