如何为不同的图层添加线条

56
我有一份数据,研究两种不同物种在单一生长条件和混合生长条件下的生长差异。此外,我绘制了一张图表以更清晰地展示数据。
我想要一个带误差棒的条形图,当然整个数据集比这个图表更大,但是对于这个图表,这是用于条形图平均值的 data.frame。
plant           species     means
Mixed culture   Elytrigia   0.886625
Monoculture     Elytrigia   1.022667
Monoculture     Festuca     0.314375
Mixed culture   Festuca     0.078125

使用这些数据,我在ggplot2中制作了一个图表,其中植物位于x轴上,平均值位于y轴上,并使用分面将物种分开。

这是我的代码:

    limits <- aes(ymax = meansS$means + eS$se, ymin=meansS$means - eS$se)
    dodge <- position_dodge(width=0.9)

    myplot <- ggplot(data=meansS, aes(x=plant, y=means, fill=plant)) + facet_grid(. ~ species) 
    myplot <- myplot + geom_bar(position=dodge) + geom_errorbar(limits, position=dodge, width=0.25)
    myplot <- myplot + scale_fill_manual(values=c("#6495ED","#FF7F50"))
    myplot <- myplot + labs(x = "Plant treatment", y = "Shoot biomass (gr)")  
    myplot <- myplot + opts(title="Plant competition")
    myplot <- myplot + opts(legend.position = "none")
    myplot <- myplot + opts(panel.grid.minor=theme_blank(), panel.grid.major=theme_blank())

目前为止还不错。但是,我想在两个面板中添加两条不同的水平线。为此,我使用了以下代码:
    hline.data <- data.frame(z = c(0.511,0.157), species = c("Elytrigia","Festuca")) 
    myplot <- myplot + geom_hline(aes(yintercept = z), hline.data)

然而,如果我这样做,就会得到一个绘制了两个额外分面的图形,其中绘制了两条水平线。相反,我希望在具有条形图的分面中绘制水平线,而不是创建两个新分面。 有人知道如何解决这个问题吗?
我认为,如果我现在放出我创建的图形,这将使其更清晰:

enter image description here


abline 是你要找的吗? - Pop
不,我只想要一条水平线,在给定的y坐标处。然而,每个分面的值都不同,例如Elytrigia分面在0.511处有一条水平线,而Festuca分面在0.157处有一条水平线。 - Marinka
3
我可以建议您从控制台粘贴您的数据集,或使用 dput(means) 将数据提供给我们。 - Tyler Rinker
2个回答

85

确保变量“species”在两个数据集中是相同的。 如果它在其中一个数据集中是因子,则在另一个数据集中也必须是因子

library(ggplot2)
dummy1 <- expand.grid(X = factor(c("A", "B")), Y = rnorm(10))
dummy1$D <- rnorm(nrow(dummy1))
dummy2 <- data.frame(X = c("A", "B"), Z = c(1, 0))
ggplot(dummy1, aes(x = D, y = Y)) + geom_point() + facet_grid(~X) + 
    geom_hline(data = dummy2, aes(yintercept = Z))

输入图像描述

dummy2$X <- factor(dummy2$X)
ggplot(dummy1, aes(x = D, y = Y)) + geom_point() + facet_grid(~X) + 
    geom_hline(data = dummy2, aes(yintercept = Z))

在此输入图片描述


哦,是啊,我现在想起来了,我的物种名称后面有一个空格,真烦人。至少我的代码没有问题。 - Marinka
geom_abline 似乎不起作用,或者我弄错了什么?请参阅我的问题 http://stackoverflow.com/questions/43696806/r-ggplot-different-geom-ablines-in-facets - Boern
你需要在 geom_line 中指定 data = dummy2。否则你会得到错误信息 Error: mapping must be created by aes() - user3507584

0

另一种选项是使用geom_abline,您可以将intercept指定为水平线的位置,并确保您的美学中slope为0。这里是一些可重现的代码(稍作调整自@Thierry):

library(ggplot2)
dummy1 <- expand.grid(X = factor(c("A", "B")), Y = rnorm(10))
dummy1$D <- rnorm(nrow(dummy1))
dummy2 <- data.frame(X = c("A", "B"), Z = c(1, 0))
ggplot(dummy1, aes(x = D, y = Y)) + 
  geom_point() + 
  facet_grid(~X) + 
  geom_abline(data = dummy2, aes(intercept = Z, slope = 0)) 

使用 reprex v2.0.2 在2023-04-02创建

如您所见,使用 geom_hline 时结果相同。


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