ggplot堆叠面积图中的空洞

11

这里是我的数据链接.

我使用以下代码:

#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

这会产生以下图表:enter image description here

正如您所见,该图表的三个不同部分存在奇怪的空洞。

我之前遇到过类似的问题并询问了答案,那时提供的答案是我需要按组和年份对我的数据进行排序。当时,那个答案解决了我的问题。然而,这一次它似乎并没有消除所有的空洞。有什么帮助吗?

4个回答

10

间隙的原因是某些时间序列比其他时间序列晚开始。当出现第一个非零值时,新区域以非连续跳跃开始。然而,上面的区域通过线性插值与下一个点连接。这就导致了间隙。

例如,看最左边的间隙。橄榄色区域在间隙后以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()

在此输入图片描述


哇,这非常清晰、简洁、有帮助。非常感谢!! - Jim

0
最好的方法是简单地添加:pos = "identity",例如从您上面的代码:
ggplot(aes(x=year,y=value, fill=group), pos = "identity")

0
@Stibu的答案可能是最好的,但对于那些不太熟悉R语言,不知道如何使用R来查找缺失行并用零填充它们的人,我用了一种有点不同的方法解决了这个问题。
对于我的情况,我创建了一个带有所有年份和所有组的零数据集,然后将其附加到我的原始数据集中。这样,我添加了在以前没有数据行的年份的行。在按年份和组聚合之后,我的聚合数据集中包含了零行,而不是根本不存在行。这为我删除了所有那些奇怪的空白。

这个答案实际上比@Stibu的更健壮,因为在时间序列中某些值一次或多次“掉落”到零的情况下仍然有效! - user3357177

-1

我发现将表格保存为csv文件并使用Python的matplotlib函数stackplot(demo)更简单,它似乎没有负数问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接