【问题标题】:Add a sumtotal line to a area plot in ggplot将总和线添加到 ggplot 中的面积图
【发布时间】:2017-05-31 08:24:00
【问题描述】:

我有一张我很满意的面积图。我试图在面积图顶部覆盖一条粗实线。

该图是按频道划分的网站会话,其中每个频道都是区域图中的组(填充)。我的想法是显示总会话的实线图表,其中包含非常重的 alpha 显示这些会话的来源。

按数据看是这样的(因为ggplot函数依赖于数据结构)

> str(dataset)
'data.frame':   144 obs. of  5 variables:
 $ Month       : Factor w/ 24 levels "May-2015","Jun-2015",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Channel     : Factor w/ 6 levels "Facebook","Youtube",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Sessions    : num  5065 4226 4779 5736 6350 ...

> head(dataset, n = 20)
      Month  Channel Sessions
1  May-2015 Facebook     5065
2  Jun-2015 Facebook     4226
3  Jul-2015 Facebook     4779
4  Aug-2015 Facebook     5736
5  Sep-2015 Facebook     6350
6  Oct-2015 Facebook     6199
7  Nov-2015 Facebook     8474
8  Dec-2015 Facebook     8340
9  Jan-2016 Facebook    11376
10 Feb-2016 Facebook    11290
11 Mar-2016 Facebook    13255
12 Apr-2016 Facebook    16693
13 May-2016 Facebook    14618
14 Jun-2016 Facebook    14208
15 Jul-2016 Facebook    14016
16 Aug-2016 Facebook    14978
17 Sep-2016 Facebook    14559
18 Oct-2016 Facebook    10583
19 Nov-2016 Facebook     6930
20 Dec-2016 Facebook     8918

我的面积图:

timeline <- ggplot(dataset, aes(x = Month, y = Sessions,fill = Channel, group = Channel)) +
  geom_area(alpha = 0.7) +

# This piece right here is where I tried to add a solid line
  geom_line(data = dataset, inherit.aes = FALSE, aes(x = Month, y = Sessions, group = Month)) +

  theme(axis.text.x=element_text(angle=90, hjust=1))

我在geom_area(alpha = 0.7) 之前取得了成功,包括geom_area(alpha = 0.7),因为这产生了一个漂亮的面积图。

但下一行会导致意外行为:

geom_line(data = dataset, inherit.aes = FALSE, aes(x = Month, y = Sessions, group = Month))

我希望看到一条连续的线覆盖在顶部,但却得到了一系列断开的垂直条。查看输出底部的黑线。我尝试添加/删除命令 group = Month 但这并没有改变任何东西:

如何在堆叠面积图的最顶部通过折线图添加实线来表示总会话数?

【问题讨论】:

  • 换句话说,当前图表的最顶部应该有一条实心粗线表示总流量,因为下面的区域是堆叠的
  • @Axeman 谢谢,我试了一下,但没有任何改变timeline &lt;- ggplot(dataset, aes(x = Month, y = Sessions,fill = Channel, group = Channel)) + geom_area(alpha = 0.3) + + stat_summary(aes(group = 1), fun.y = sum, geom = 'line')
  • 天啊!我有两个加号++,它有效。谢谢!
  • 在这种情况下,aes 中的“group = 1”是什么?

标签: r ggplot2


【解决方案1】:

虽然您在那里展示了一些不错的数据,但它实际上是不可重现的。从帮助文件中我们可以做到:

series <- data.frame(
  time = c(rep(1, 4),rep(2, 4), rep(3, 4), rep(4, 4)),
  type = rep(c('a', 'b', 'c', 'd'), 4),
  value = rpois(16, 10)
)
ggplot(series, aes(time, value)) +
  geom_area(aes(fill = type))

要计算总和,我们必须对这些区域进行实际求和,这可以通过 stat_summary 完成:

ggplot(series, aes(time, value)) +
  geom_area(aes(fill = type)) +
  stat_summary(fun.y = sum, geom = "line", size = 2)

如果需要,您可以将aes(group = 1) 添加到stat_summary。这将确保仅针对xy 完成计算,无需进一步分组并且线路已连接。它覆盖了当您将美学设置为一个因素时发生的自动分组。如果x 是一个因素,这也会有所帮助,就像你的例子一样。

像你一样使用geom_line,为每个x坐标创建多个值(每个Channel一个)。

【讨论】:

  • 感谢您的回答。为了好玩,为了看看会发生什么,我尝试了 group = 2。实际上,我得到了相同的结果。这里的组号有什么用?我还进行了实验,将组命令排除在外,图表产生了不良结果。所以组肯定是需要的,只是想了解数字表示什么
  • 这个数字无关紧要,它只是将组设置为一个常数,即您正在覆盖自动分组,当您将美学设置为一个因素时会发生这种情况(如您的情况下的x)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
相关资源
最近更新 更多