如何使用 ggplot 让我的面积图堆叠?
How can I get my area plot to stack using ggplot?
我正在尝试使用以下基于 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")
我认为有两个问题。
当您在三个单独的层中使用 stat_bin()
时,每个层实际上都有自己独立的数据集。这将给出正确的计数,但是(这真的是一个猜测)我认为在三个不同的层中意味着你不能堆叠它们。
如果你在所有层上使用 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")
结果
我正在尝试使用以下基于 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")
我认为有两个问题。
当您在三个单独的层中使用
stat_bin()
时,每个层实际上都有自己独立的数据集。这将给出正确的计数,但是(这真的是一个猜测)我认为在三个不同的层中意味着你不能堆叠它们。如果你在所有层上使用
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")
结果