ggplot堆积条形图,条形图与两个不同的百分比变量有关

时间:2018-04-25 16:18:30

标签: r ggplot2 stackedbarseries

我想创建一个带有ggplot的堆积条形图,其中条形的高度取决于一个变量的值(选民投票率为%),并且条形图的堆叠单独加起来为另一个变量的100%(voteshare在%)。因此,对于1990年,选民投票率为96.7,并且每个政党应该填写个人票数,这相当于100%(96.7%)。 我看看3方和3年的数据。

这是我的数据:

party <- c("a", "b", "c", "a", "b", "c", "a", "b", "c") 
year <- c(1990, 1990, 1990, 1991, 1991, 1991, 1992,1992, 1992)
voteshare <- c(0,33.5, 66.5, 40.5, 39.0, 20.5, 33.6, 33.4, 33)
turnout = c(96.7,96.7,96.7, 85.05,85.05,85.05, 76.41, 76.41, 76.41)
df<- data.frame(parties, year, voteshare, turnout)

此外,我想在图表中列出个人投票数和总投票数。

到目前为止我的方法:

ggplot(df, aes(x=year, y=interaction(turnout, voteshare), fill=party)) + 
    geom_bar(stat="identity", position=position_stack()) +
    geom_text(aes(label=Voteshare), vjust=0.5)

这是一团糟。

提前感谢!

1 个答案:

答案 0 :(得分:1)

我使用dplyr管道:

  • 为调整后的投票总数创建一个列,这是每个参与方的份额和总投票率的乘积。
  • 摆脱零行,因此最终输出中没有出现零
  • 计算投票总额应显示的y值,方法是按照当事人的cumsum()投票份额,按年份分组。我必须使用rev(),因为position_stack()的默认值是按字母顺序将低数字放在堆栈顶部。

<强>代码

library(dplyr)
library(ggplot2)

df <- df %>%
  mutate(adj_vote = turnout * voteshare / 100) %>%
  filter(adj_vote > 0) %>%
  group_by(year) %>% 
  mutate(cum_vote = cumsum(rev(adj_vote)),
         vote_label = rev(voteshare))


ggplot(df, aes(x=year, y=adj_vote, fill=party)) + 
  geom_bar(stat="identity", position=position_stack()) +
  geom_text(aes(label=vote_label, y = cum_vote), vjust=0.5)

<强>输出

ggplot2 output