带有聚合数据的堆积条形图(ggplot2)

时间:2017-03-14 08:17:12

标签: r ggplot2 bar-chart geom-bar

ggplot2存在一些重大问题。即使这对你来说可能是一个非常简单的问题,但我还是无法管理它(我已经阅读了ggplot2-book并且正在查看stackoverflow)。

原则上有一个由因子变量(国家)和二分变量组成的数据集。不幸的是我自己没有这种扩展格式的数据:我有两个变量" var1"和" var2"。 var1给出了原始数据集中某个条件为真的案例数,var2给出了相同条件为假的案例数:

country | var1 | var2
----------------------
"A" | 20 | 30
"B" | 24 | 53
"C" | 21 | 24
"D" | 30 | 66

现在我想制作一个叠加的条形图,每个国家/地区内的 y轴显示百分比(所有条形应具有相同的高度)加上条形图中显示的绝对数字

How it should look

我发现如果数据是扩展格式,我可以使用

ggplot(data=dataset)+geom_bar(aes(x=country, fill=variable), position='fill')

但是,我只有汇总数据。

有人可以帮助我吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

通过首先重塑然后绘图来快速解决问题:

library(ggplot2)
library(tidyr)

temp2 <- gather(temp, var, val, -country)
ggplot(temp2, aes(country, val, fill = var)) + 
  geom_col(position = 'fill') +
  geom_text(aes(label = val), position = position_fill(vjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format())

enter image description here

答案 1 :(得分:1)

library('ggplot2')
library('data.table')

df1 <- fread('country var1 var2
             "A" 20 30
             "B" 24 53
             "C" 21 24
             "D" 30 66')

df1 <- melt(df1, id.vars = 'country', )
df1[, percent := prop.table(value)*100, by = 'country']

ggplot(data = df1, aes( x = country, y = percent, fill = variable, label = value )) + 
  geom_bar(stat = 'identity') + 
  geom_text(size = 5, position = position_stack(vjust = 0.5))

enter image description here