【问题标题】:How can I get my area plot to stack using ggplot?如何使用 ggplot 让我的区域图堆叠?
【发布时间】:2017-08-17 09:11:20
【问题描述】:

我正在尝试使用以下基于http://dantalus.github.io/2015/08/16/step-plots/ 的代码来堆叠我的累积面积图。我已经添加了position=stack,但是情节仍然重叠。

我试图实现的目标是显示给定时期内每年的累计出版物数量。因此,例如,在 1940 年可能有一个出版物,第二年可能还有 2 个,使累计总数达到 3 个。

让这些区域相互堆叠的最佳方法是什么?

如何控制订单?我需要使用arrange() 来订购 TERM2 吗?

ggplot(data=working, aes(x=Year, color=TERM2, fill=TERM2)) +
  stat_bin(data = subset(working, TERM2=="A"), bins=80, aes(y=cumsum(..count..)),geom="area", position="stack", alpha=0.1) +
  stat_bin(data = subset(working, TERM2=="B"), bins=80, aes(y=cumsum(..count..)),geom="area", position="stack",alpha=0.1) +
  stat_bin(data = subset(working, TERM2=="Both"),bins=80, aes(y=cumsum(..count..)),geom="area", position="stack", alpha=0.1) + 
  ylab("Total Number") + xlim(1940,2020) + ggtitle("Cumulative number by measurement method")

我目前得到的:

我想要达到的目标示例:

下面的图表是在 Excel 中使用相同的数据创建的,这正是我希望在 R 中实现的。

我的数据:

我的数据当前的结构示例:

 Year TERM2
 1944     A
 1959     B
 1966     A
 1968     B
 1968     A
 1970     A
 1971     B
 1971     B
 1971     A
 1971     A
 1971  Both
 1971  Both
 1971  Both
 1972     A
 1972  Both
 1972  Both
 1973     B
 1973     A
 1974     A
 1974     A

'data.frame':   803 obs. of  6 variables:
 $ Year          : int  1944 1959 1966 1968 1968 1970 1971 1971 1971 1971 ...
 $ TERM2         : Factor w/ 3 levels "B","A","Both": 2 1 2 1 2 2 1 1 2 2 ...

根据 user127649 的建议进行更改

这是在 user127649 的建议之后的情节,这与我的预期很接近,只是我正在寻找它从 0 开始并以 803 结束(出版物总数)。

ggplot(data=working, aes(x=Year, color=TERM2, fill=TERM2)) +
  stat_bin(bins=80, aes(y=cumsum(..count..)), geom="area", alpha=0.1) +
  ylab("Total Number") + xlim(1940,2020) + ggtitle("Cumulative number by measurement method")

【问题讨论】:

    标签: r ggplot2 stacked-area-chart


    【解决方案1】:

    我认为有两个问题。

    1. 当您在三个单独的层中使用stat_bin() 时,每个层实际上都有自己独立的数据集。这将给出正确的计数,但是(这确实是一个猜测)我认为处于三个单独的层中意味着你不能堆叠它们。

    2. 如果您在所有层上使用stat_bin(),我认为stat = '..count..' 会在整个数据上执行cumsum()

    我不知道这是否是最好的方法,但我认为这就是你所追求的。

    数据

    数据被分组,cumsum() 分别用于每个组。

    library(tidyverse)
    
    working <- working %>% 
         count(Year, TERM2) %>% 
         spread(TERM2, n, fill = 0) %>% 
         mutate_at(vars('A', 'B', 'Both'), cumsum) %>% 
         gather(TERM2, N, -Year, factor_key = T) #%>% 
         # mutate(TERM2 = ordered(TERM2, levels = rev(levels(TERM2))))
    

    情节

    此代码将生成下面的第一个图。如果您更喜欢第二个图的外观,您可以取消注释数据操作块的最后一行。

    ggplot(working, aes(Year, N, fill = TERM2)) + 
         geom_area(position = 'stack') +
         ylab("Total Number")
    

    结果

    【讨论】:

    • 感谢@user127649,现在看来工作正常。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多