R ggplot2:如何用数字标记y轴上的水平线

44

我在 ggplot 中有一条水平线,我想在 y 轴上标记它的值(7.1)。

library(ggplot2)
df <- data.frame(y=c(1:10),x=c(1:10))
h <- 7.1
plot1 <- ggplot(df, aes(x=x,y=y)) + geom_point() 
plot2 <- plot1+ geom_hline(aes(yintercept=h))

谢谢您的帮助。


刚刚在这里提了一个相关问题,关于如何以程序方式为多个abline加标签。如果将来有人寻找这个问题(就像我发现这个问题时一样)。 - Hendy
4个回答

83

不清楚你想要7.1成为y轴的一部分,还是只需要给线条添加标签。假设你想要前者,你可以使用scale_y_continuous()来定义自己的间断点。下面的代码可能能够实现你想要的效果(很可能需要微调):

plot1+ geom_hline(aes(yintercept=h)) + 
  scale_y_continuous(breaks = sort(c(seq(min(df$y), max(df$y), length.out=5), h)))

enter image description here

假设是后者,这可能更符合您的需求:
plot1 + geom_hline(aes(yintercept=h)) +
  geom_text(aes(0,h,label = h, vjust = -1))

enter image description here


1
非常感谢您提供的scale_y_continuous解决方案。 - adam.888
1
如果您的线图是在柱状图上叠加显示,且具有因子 x 值,您该怎么办? - Nicholas Hamilton
4
标签是否可以显示在纵轴上,但位于绘图的右侧? - NWT Adam
3
如何更改特定轴标签的字体颜色,例如“7.1”? - elarry

8

与Chase的解决方案类似,但使用现有标签进行更改。


ggplot_build(plot1)$layout$panel_ranges[[1]]$y.major_source可用于提取现有标签并添加新标签h

plot1 + geom_hline(aes(yintercept=h)) + 
  scale_y_continuous(breaks = sort(c(ggplot_build(plot1)$layout$panel_ranges[[1]]$y.major_source, h)))

enter image description here


8
这个怎么样?
plot1 + geom_hline(aes(yintercept=h), colour="#BB0000", linetype="dashed") + 
 geom_text(aes( 0, h, label = h, vjust = -1), size = 3)

除非你已经决定在坐标轴本身上进行标记,否则请不要这样做。你可以增加刻度线的间距,使得7.1处有一个刻度线,但这会让你的图表过于繁忙。 - Maiasaura

5
这是对Prradep的回答的跟进。
我认为Prradep的回答适用于ggplot2的旧版本。我正在使用ggplot2版本3.1.0,为了提取该版本中plot1的现有标签,您必须使用:
ggplot_build(plot1)$layout$panel_params[[1]]$y.major

这仅适用于线性坐标轴!如果您有一个非线性的y轴(例如对数),那么ggplot2会将刻度线在线性轴上的位置存储在$y.major中。实际的刻度线标签存储为字符向量在$y.labels中。因此,对于非线性y轴,您需要使用:

as.numeric(ggplot_build(cl.plot.log)$layout$panel_params[[1]]$y.labels)

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