具有聚合数据的堆叠条形图 (ggplot2)
stacked barplot with aggregated data (ggplot2)
我在使用 ggplot2 时遇到了一些重大问题。尽管这对你来说可能是一个非常简单的问题,但我还是没能把它做对(我读过一本 ggplot2-book 并且也在研究 Whosebug)。
原来有一个数据集,由一个因子变量(国家)和一个二分变量组成。不幸的是,我自己没有这种扩展格式的数据:我有两个变量 "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')
但是,我只有汇总数据。
有人能帮帮我吗?
谢谢!
先整形再绘图的快速解决方案:
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())
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))
我在使用 ggplot2 时遇到了一些重大问题。尽管这对你来说可能是一个非常简单的问题,但我还是没能把它做对(我读过一本 ggplot2-book 并且也在研究 Whosebug)。
原来有一个数据集,由一个因子变量(国家)和一个二分变量组成。不幸的是,我自己没有这种扩展格式的数据:我有两个变量 "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')
但是,我只有汇总数据。
有人能帮帮我吗?
谢谢!
先整形再绘图的快速解决方案:
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())
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))