如何在使用对数刻度时添加垂直线?

5
如何在纵坐标是对数刻度的 ggplot 图中添加一条垂直线?例如:
ggplot(data.frame(x=1:2, y=c(10,20)), aes(x,y)) + 
  geom_line() + 
  geom_vline(xintercept = 1.5)

正常情况下,它的工作效果是符合预期的。如果将纵轴转换为对数刻度:

ggplot(data.frame(x=1:2, y=c(10,20)), aes(x,y)) +
  geom_line() + 
  geom_vline(xintercept = 1.5) + 
  coord_trans(y = 'log')

然后垂直线就消失了。也许相关的是,如果稍微修改一下数据:

ggplot(data.frame(x=1:2, y=c(1,20)), aes(x,y)) + # y[1] is now different
  geom_line() + 
  geom_vline(xintercept = 1.5) + 
  coord_trans(y = 'log')

然后垂直线仍然缺失,但会发出警告信息:

Warning messages:
1: In self$trans$y$transform(y) : NaNs produced
2: In trans$transform(value) : NaNs produced

有可能是因为试图对0取对数(得到-Infinity而没有警告)或负数(得到NaN和一个警告)导致了缺失的行。

(sessionInfo() 显示 R版本3.3.1 (2016-06-21) and ggplot2_2.2.0。)


1
可能与此问题有关(已关闭,但未修复):geom_h/vline draws incomplete or no lines with coord_trans() - Henrik
1
这是一个长期存在的问题。 - Axeman
1个回答

2

我认为你的直觉是正确的,问题在于geom_vline试图对截距取零的对数。您可以改用geom_line来绘制不穿过零的线段。

ggplot(data.frame(x=1:2, y=c(10,20)), aes(x,y)) +
  geom_line() + 
  geom_line(aes(x=c(1.5,1.5), y=c(0.1,200))) + 
  coord_trans(y = 'log', limy = c(10,20))

enter image description here


谢谢!您认为这应该报告为ggplot的错误吗? - banbh
有没有想法如何使用离散的x轴和参数化的y轴限制来实现它? - TobiO
@TobiO - 我不完全理解你的问题。如果当前的答案对你没有用,我可以建议你提出一个新的问题,在其中提供一个可重现的例子来说明你的“轴和参数化y限制”。你可以链接回这个问题来解释为什么你的问题是不同的。 - dww
当我有一个离散的x轴和对数刻度的y轴时,我遇到了多个问题。后来我发现,geoms的书写顺序很重要。如果vline应该到达底部,则在其前面加上geom_blank()可以帮助解决问题。我在SO的某个地方找到了这个提示,但现在找不到答案来链接它。 - TobiO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接