ggplot2:如何使geom_vline()的颜色不同

20

我有五条geom_vline()线条在我的图表中,我希望它们有不同的颜色。有没有办法实现这个需求?

这是我的代码:

library(ggplot2)

x <- seq(-7, 8, length = 90)
tvalues <- dt(x,15)

qplot(x, tvalues) + geom_polygon(fill = "purple", colour = "purple", alpha = 0.5) + 
  geom_point(fill = "purple", colour = "purple", alpha = 0.2, pch = 21) +
  geom_vline(xintercept = c(a <- c(-2.27685371,  0.01661155,  
  0.33598194,  1.92426022), mean(a)), linetype = "dashed", colour = "red") + theme_bw() + xlab(bquote(bold('Average Tensile Strength (lb/in'^'2'*')'))) +
  ylab(expression(bold(P(x)))) +
  opts(title = expression(bold("Student t Distribution")), plot.title = theme_text(size = 20, colour = "darkblue"),
       panel.border = theme_rect(size = 2, colour = "red"))

以下是输出结果:

enter image description here

请注意图中的五条垂直线,我希望每条线都有不同的颜色。

我尝试了以下方法:

library(colorRamps)
geom_vline(xintercept = c(a <- c(-2.27685371,  0.01661155,  
   0.33598194,  1.92426022), mean(a)), linetype = "dashed", colour = matlab.like(5)) 

但是没有起作用,另一次尝试

geom_vline(xintercept = c(a <- c(-2.27685371,  0.01661155,  
   0.33598194,  1.92426022), mean(a)), linetype = "dashed", colour = c("red","blue","green","yellow","orange"))

并且仍然没有成功。
提前感谢!
2个回答

38

你似乎没有理解 ggplot2 的基本思想,那就是将所有数据放入一个 data.frame,并且你映射的每个美学都对应着数据框中的一个变量。

你可以通过五次独立调用 geom_vline 来获得五条不同颜色的垂直线,但这违背了整个包的设计思想。相反,你需要创建一个数据框:

a <- c(-2.27685371,0.01661155,0.33598194,1.92426022)
vlines <- data.frame(xint = c(a,mean(a)),grp = letters[1:5])

我已经明确创建了一个分组变量grp来映射到colour。然后我们添加图层,并使用aes将美学映射到这些变量:

qplot(x, tvalues) + 
  geom_polygon(fill = "purple", colour = "purple", alpha = 0.5) + 
  geom_point(fill = "purple", colour = "purple", alpha = 0.2, pch = 21) +
  geom_vline(data = vlines,aes(xintercept = xint,colour = grp), linetype = "dashed") + 
  theme_bw() + 
  xlab(bquote(bold('Average Tensile Strength (lb/in'^'2'*')'))) +
  ylab(expression(bold(P(x)))) +
  opts(title = expression(bold("Student t Distribution")), 
       plot.title = theme_text(size = 20, colour = "darkblue"),
       panel.border = theme_rect(size = 2, colour = "red"))

(这些颜色很难区分,因为它们是虚线,并且其中两条几乎重叠在一起。)

如果你从qplot转向ggplot()并开始将数据放入数据帧而不是向量中,则可以更好地使用ggplot2


好的,谢谢你提醒我 :) 我应该想到的。非常感谢!你节省了我的时间 :) - Al-Ahmadgaid Asaad
这是一个很好的答案,它给了我在做类似事情时正确的方向。我需要将geom_hlines添加到具有不同组的图的平均值中。我按组计算了平均值,并像您描述的那样使用了geom_hline。不同之处在于,我使用了"linetype = grp"来获得不同的线型,并且它在aes调用内部,而不是像这里所示的外部。 - Eduardo

9
如果你只想添加一条线,可以加入以下的geom,它会在x=1处添加一条红色虚线垂直线。
+ geom_vline(aes(xintercept=1), colour="#BB0000", linetype="dashed")

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