R “如何形象化”;逐步地;成分随时间的变化

R “如何形象化”;逐步地;成分随时间的变化,r,ggplot2,geom-bar,R,Ggplot2,Geom Bar,我有一个data.frame,其中包含了选举年各党派之间议会席位的分配情况。 最后,我想得到一个类似的图。我想想象多年来议会的组成,而不仅仅是选举年 results<-structure(list(party = c("PARTY1", "PARTY1", "PARTY1", "PARTY1", "PARTY2", "PARTY2", "PARTY2", "PARTY2", "PARTY2", "PARTY2", "PARTY3", "PARTY3", "PARTY3", "PARTY3

我有一个data.frame,其中包含了选举年各党派之间议会席位的分配情况。 最后,我想得到一个类似的图。我想想象多年来议会的组成,而不仅仅是选举年

results<-structure(list(party = c("PARTY1", "PARTY1", "PARTY1", "PARTY1", "PARTY2", "PARTY2", 
"PARTY2", "PARTY2", "PARTY2", "PARTY2", "PARTY3", "PARTY3", "PARTY3", "PARTY3", "PARTY3", 
"PARTY3", "PARTY3", "PART4", "PART4", "PART4", "PART4"), year = c(1996, 
1998, 2000, 2010, 1996, 2000, 2002, 2006, 2010, 2014, 1996, 1998, 
2000, 2002, 2006, 2010, 2014, 2002, 2006, 2010, 2014), party.seats = c(8, 
6, 5, 3, 19, 8, 10, 9, 7, 10, 9, 4, 6, 5, 3, 4, 5, 3, 7, 8, 6
)), class = "data.frame", row.names = c(NA, -21L), .Names = c("party", 
"year", "party.seats"))
我能够制作一个带有geom_区域的ggplot图表,但这是误导性的,因为它表明在选举后的几年中,席位的分布正在发生变化(存在斜率,而不是“阶梯”)


有什么帮助吗?我特别想知道是否有一个(与时间序列有关的?)命令,它将把选举年的结果带到随后的所有年份,直到举行新的选举为止。因此,基本上,一个命令将在时间x的选举事件视为正在进行的(=在这段时间内填充数年),直到在时间y举行新的选举。

我认为
geom_step
是您要寻找的,尽管最简单的实现不会将条/区域堆叠到分配的总席位数中(尽管这可能更好):

如果你真的想要,你可以得到填充,尽管像@Haboryme的答案一样,你需要在选举之间生成所有的点。在这里,我使用
dplyr
/
tidyr
为两次选举之间的每一天添加一个新的数据行(您只需要足够窄的分辨率,使“步骤”在最终绘图上显示为瞬时,而不是在最后一次选举后分散一整年),并在最近一次选举后添加一些数据行,以使这些值真正显示出来。然后,我在下次选举之前填补了该党的席位,并将空缺设置为0(在该党获得任何席位之前)

请注意,您可以使用选举的确切日期来延长此时间,而不必过多修改年份

results %>%
  complete(year = full_seq(c(min(year), max(year) + 1), 1/365), party) %>%
  group_by(party) %>%
  fill(party.seats) %>%
  replace_na(replace = list(party.seats = 0)) %>%
  ggplot(
    aes(x=year
        , y=party.seats
        , fill=party)) +
  geom_area(position = "stack")
给予


尽管如此,我还是更喜欢这些线条,因为当它们不是叠在一起时,比较双方更容易。例如,从2010年到2014年,很难从区域版本中判断第二方还是第四方的座位更多(但从线条上看很清楚)。

我认为
geom_step
是您所寻找的,尽管最简单的实现不会将酒吧/区域堆叠到分配的总座位数中(尽管这可能更好):

如果你真的想要,你可以得到填充,尽管像@Haboryme的答案一样,你需要在两次选举之间生成所有的点。在这里,我使用
dplyr
/
tidyr
为两次选举之间的每一天添加一个新的数据行(你只需要足够窄的分辨率,以使“步骤”更精确)在最后一次选举后添加一些元素,以使这些值真正显示出来。然后,我从选举前一直到下次选举填补该党席位,并将缺失设置为0(在该党获得任何席位之前)

请注意,您可以使用选举的确切日期来延长此时间,而不必过多修改年份

results %>%
  complete(year = full_seq(c(min(year), max(year) + 1), 1/365), party) %>%
  group_by(party) %>%
  fill(party.seats) %>%
  replace_na(replace = list(party.seats = 0)) %>%
  ggplot(
    aes(x=year
        , y=party.seats
        , fill=party)) +
  geom_area(position = "stack")
给予


尽管如此,我还是更喜欢台词,因为当双方没有叠在一起时,比较彼此更容易。例如,从2010年到2014年,很难从区域版本中判断第二方还是第四方的席位更多(但从台词中可以清楚地看出).

另一个选项是创建包含所有缺失年份的完整数据框:

library(tidyverse)                      
library(zoo)
all_years=seq(min(results$year),max(results$year)) #get the sequence of all the years considered
filled=data.frame(party=rep(unique(results$party),each=length(all_years)), #build a df with the seq of years for each party
                  year=rep(all_years,length(unique(results$party))))
然后与数据合并并填充NA(如果开始时为0,则为0,否则为最新值):

使用
geom_条形图
width=1
绘制,以获得看起来连续的图形:

ggplot(data=df,aes(x=as.factor(year), y=party.seats, fill=party, label=party))+
  geom_bar(stat="identity",width = 1)
它给出(x轴需要一些调整):

另一个选项是创建包含所有缺失年份的完整数据框:

library(tidyverse)                      
library(zoo)
all_years=seq(min(results$year),max(results$year)) #get the sequence of all the years considered
filled=data.frame(party=rep(unique(results$party),each=length(all_years)), #build a df with the seq of years for each party
                  year=rep(all_years,length(unique(results$party))))
然后与数据合并并填充NA(如果开始时为0,则为0,否则为最新值):

使用
geom_条形图
width=1
绘制,以获得看起来连续的图形:

ggplot(data=df,aes(x=as.factor(year), y=party.seats, fill=party, label=party))+
  geom_bar(stat="identity",width = 1)
它给出(x轴需要一些调整):

您也可以尝试fancy
streamgraph
(您也会得到类似鼠标悬停工具提示的
plotly
):


您也可以尝试fancy
streamgraph
(您也会得到类似鼠标悬停工具提示的
plotly
):

ggplot(data=df,aes(x=as.factor(year), y=party.seats, fill=party, label=party))+
  geom_bar(stat="identity",width = 1)
library(dplyr)
library(streamgraph)
results %>%
  streamgraph("party", "party.seats", "year") %>%
  sg_axis_x(1, "year", "%Y") %>%
  sg_legend(TRUE, "party")
results %>%
  streamgraph("party", "party.seats", "year", offset="zero", interpolate="step") %>%
  sg_axis_x(1, "year", "%Y") %>%
  sg_fill_brewer("PuOr")