ggplot 堆叠条形图,其中条形图与两个不同的变量相关,并带有百分比
ggplot stacked bar graph with bars relating to two different variables with percentages
我想用 ggplot 创建一个堆叠条形图,其中条形的高度取决于一个变量的值(选民投票率以 % 为单位),条形的堆叠单独加起来等于另一个变量的 100% (以 % 计的投票份额)。因此,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)
一团糟。
提前致谢!
我使用 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)
输出
我想用 ggplot 创建一个堆叠条形图,其中条形的高度取决于一个变量的值(选民投票率以 % 为单位),条形的堆叠单独加起来等于另一个变量的 100% (以 % 计的投票份额)。因此,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)
一团糟。
提前致谢!
我使用 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)
输出