R “如何形象化”;逐步地;成分随时间的变化
我有一个data.frame,其中包含了选举年各党派之间议会席位的分配情况。 最后,我想得到一个类似的图。我想想象多年来议会的组成,而不仅仅是选举年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
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")