堆积面积图中的ggplot孔
ggplot holes in stacked area chart
我使用以下代码:
#read in data
data = read.csv("ggplot_data.csv")
#order by group then year
data = arrange(data, group, year)
#generage ggplot stacked area chart
plot = ggplot(data, aes(x=year,y=value, fill=group)) +
geom_area()
plot
生成以下图表:
如您所见,这张图表的三个不同部分有奇怪的洞。
我,然后提供的答案是我需要按组和年份对数据进行排序。当时,那个答案解决了我的漏洞。不过,这次似乎并没有消除所有的漏洞。有帮助吗?
造成差距的原因是一些时间序列比其他时间序列开始得晚。当第一个非消失值出现时,新区域以非连续跳跃开始。然而,正上方的区域通过线性插值连接到下一个点。这样就造成了差距。
例如,看最左边的空隙。橄榄区紧接在 1982 年垂直跳跃的差距之后开始。然而,绿色区域从 1981 年的值(橄榄区为零)线性增加到 1982 年的值(橄榄区突然贡献)。
例如,您可以在 1975 年之后开始的每个时间序列的开头添加一个零值。我使用 dplyr
功能来创建这些额外第一年的数据框:
first_years <- group_by(data, group, group_id) %>%
summarise(year = min(year) - 1) %>%
filter(year > 1974) %>%
mutate(value = 0, value_pct = 0)
first_years
## Source: local data frame [3 x 5]
## Groups: group [3]
##
## group group_id year value value_pct
## (fctr) (int) (dbl) (dbl) (dbl)
## 1 c 10006 1981 0 0
## 2 e 10022 2010 0 0
## 3 i 24060 2002 0 0
如您所见,这三个新值正好符合您图中的三个间隙。现在,您可以将这些新数据框与您的 data
组合起来,并按照与以前相同的方式进行排序:
data_complete <- bind_rows(data, first_years) %>%
arrange(year, group)
然后剧情就没有缝隙了:
ggplot(data_complete, aes(x=year,y=value, fill=group)) +
geom_area()
我发现将我的 table 保存到 csv 中并使用 python 的 matplotlib 函数 stackplot
(demo) 更简单,这似乎没有问题负数。
@Stibu 的回答可能是最好的,但对于我们这些不太了解 R 并且不知道如何使用 R 遍历数据集以查找丢失的行并用零填充它们的人来说,我解决了这个问题问题有点不同。
就我而言,我为所有年份和所有组创建了一个包含零的虚拟数据集,然后将其附加到我的原始数据集。通过这种方式,我在之前根本没有数据行的地方添加了多年的行。按年份和组聚合后,我的聚合数据集包含零行,而不是根本不存在行。这为我消除了所有那些奇怪的差距。
最好是简单地添加:pos = "identity",例如从你上面的代码:
ggplot(aes(x=year,y=value, fill=group), pos = "identity")
我使用以下代码:
#read in data
data = read.csv("ggplot_data.csv")
#order by group then year
data = arrange(data, group, year)
#generage ggplot stacked area chart
plot = ggplot(data, aes(x=year,y=value, fill=group)) +
geom_area()
plot
生成以下图表:
如您所见,这张图表的三个不同部分有奇怪的洞。
我
造成差距的原因是一些时间序列比其他时间序列开始得晚。当第一个非消失值出现时,新区域以非连续跳跃开始。然而,正上方的区域通过线性插值连接到下一个点。这样就造成了差距。
例如,看最左边的空隙。橄榄区紧接在 1982 年垂直跳跃的差距之后开始。然而,绿色区域从 1981 年的值(橄榄区为零)线性增加到 1982 年的值(橄榄区突然贡献)。
例如,您可以在 1975 年之后开始的每个时间序列的开头添加一个零值。我使用 dplyr
功能来创建这些额外第一年的数据框:
first_years <- group_by(data, group, group_id) %>%
summarise(year = min(year) - 1) %>%
filter(year > 1974) %>%
mutate(value = 0, value_pct = 0)
first_years
## Source: local data frame [3 x 5]
## Groups: group [3]
##
## group group_id year value value_pct
## (fctr) (int) (dbl) (dbl) (dbl)
## 1 c 10006 1981 0 0
## 2 e 10022 2010 0 0
## 3 i 24060 2002 0 0
如您所见,这三个新值正好符合您图中的三个间隙。现在,您可以将这些新数据框与您的 data
组合起来,并按照与以前相同的方式进行排序:
data_complete <- bind_rows(data, first_years) %>%
arrange(year, group)
然后剧情就没有缝隙了:
ggplot(data_complete, aes(x=year,y=value, fill=group)) +
geom_area()
我发现将我的 table 保存到 csv 中并使用 python 的 matplotlib 函数 stackplot
(demo) 更简单,这似乎没有问题负数。
@Stibu 的回答可能是最好的,但对于我们这些不太了解 R 并且不知道如何使用 R 遍历数据集以查找丢失的行并用零填充它们的人来说,我解决了这个问题问题有点不同。
就我而言,我为所有年份和所有组创建了一个包含零的虚拟数据集,然后将其附加到我的原始数据集。通过这种方式,我在之前根本没有数据行的地方添加了多年的行。按年份和组聚合后,我的聚合数据集包含零行,而不是根本不存在行。这为我消除了所有那些奇怪的差距。
最好是简单地添加:pos = "identity",例如从你上面的代码:
ggplot(aes(x=year,y=value, fill=group), pos = "identity")