【问题标题】:Shapes on line graph using stat_summary使用 stat_summary 的折线图上的形状
【发布时间】:2016-04-23 07:50:26
【问题描述】:

我确信答案很简单,但目前我还没有意识到。我想使用stat_summary() 制作一个折线图,在每个 x 轴刻度(代表一个单独的时间点)处每个组(代表一个实验条件)具有不同的形状。

这是数据

set.seed(124)
ID <- rep(1:12, times = 3)
Group <- rep(c("A", "B", "C"), times = 12)
score <- rnorm(36, 25, 3)
session <- rep(c("s1","s2", "s3"), each = 12)

df <- data.frame(ID, Group, session, score)

现在我可以通过为每个时间点制作一张均值表来实现这一目标。像这样。

gMeans <- aggregate(score ~ session + Group, data = df, mean)

然后像这样绘制它。

pMeans <- ggplot(data = gMeans, aes(x = session, y = score, group = Group, shape = Group)) +
  geom_line(aes(linetype = Group), size = 1) +
  geom_point(size = 5, fill = "white") +
  scale_color_hue(name = "Group", l = 30) +
  scale_shape_manual(name = "Group", values = c(23,22, 21)) +
  scale_linetype_discrete(name = "Group") +
  theme_bw() 

pMeans

但是,我希望能够跳过必须使用stat_summary() 制作均值表的步骤。我可以得到一个具有不同线型的类似图表,但我不知道如何在每个轴刻度上为每个组获取不同的形状。我尝试了下面的代码以及geom_point()geom_line() 的许多不同排列,但无济于事。如何更改下面的代码以获得看起来像从上面的代码派生的输出?

pline <- ggplot(df, aes(x=session, y=score, group = Group, shape = Group)) +
                stat_summary(fun.y="mean", geom="line", size=1.1, aes(linetype=Group, shape = Group)) +
                scale_shape_manual(values=c(1:3)) 

pline

【问题讨论】:

  • 一种快速的方法是将函数添加到您的 _point 和 _line 调用中:ggplot(data = df, aes(x = session, y = score, group = Group, shape = Group)) + geom_line(aes(linetype = Group), size = 1, stat="summary", fun.y=mean) + geom_point(size = 5, fill = "white", stat="summary", fun.y=mean)
  • 感谢@user20650 的提示。这很有帮助,它添加了形状,但尽管在您的geom_point 图层中调用了fill = white,但形状还是带有黑色填充。知道为什么会这样吗?
  • 你需要像你的例子一样添加 scale_shape (scale_shape_manual(name = "Group", values = c(23,22, 21)))
  • 我希望 所有 的 SO 问题都如此彻底、格式良好,并且付出了同样的努力来制作可重现的示例。这太棒了@llewmills。
  • 再次感谢 user20650。感谢您注意到@hrbrmstr。我试图让可能有同样问题的其他人理解它。我也很早就发现它增加了我得到答案的机会:)

标签: r ggplot2


【解决方案1】:

这应该有助于清理图例:

library(ggplot2)

set.seed(124)
ID <- rep(1:12, times = 3)
Group <- rep(c("A", "B", "C"), times = 12)
score <- rnorm(36, 25, 3)
session <- rep(c("s1","s2", "s3"), each = 12)

df <- data.frame(ID, Group, session, score)

gg <- ggplot(df, aes(x=session, y=score, group = Group, shape = Group))
gg <- gg + stat_summary(fun.y="mean", geom="line", size=1.1, 
                        aes(linetype = Group), show.legend=FALSE)
gg <- gg + stat_summary(fun.y="mean", geom="point", size=5, 
                        aes(shape = Group), fill="white")
gg <- gg + scale_shape_manual(name = "Group", values = c(23, 22, 21))
gg <- gg + theme_bw() 
gg <- gg + theme(legend.key=element_blank())
gg

线条被遮盖了,因此将它们保留在图例中毫无意义。由于您使用stat_summary() 表示该行(与嵌入stat="summary"geom_line() 相比,最好保留点几何的习语以及IMO)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多