本节书摘来异步社区《R数据可视化手册》一书中的第3章,第3.8节,作者:【美】Winston Chang,更多章节内容可以访问云栖社区“异步社区”公众号查看。
3.8 绘制百分比堆积条形图
问题
如何绘制可展示百分比的堆积条形图(又叫百分比堆积条形图)?
方法
首先,通过plyr包中的ddply()函数和transform()函数将每组条形对应的数据标准化为100%格式,之后,针对计算得到的结果绘制堆积条形图即可,如图3-20所示。
library(gcookbook) # 为了使用数据
library(plyr)
# 以Date为切割变量()对每组数据进行transform()
ce <- ddply(cabbage_exp, "Date", transform,
percent_weight = Weight / sum(Weight) * 100)
ggplot(ce, aes(x=Date, y=percent_weight, fill=Cultivar)) +
geom_bar(stat="identity")
讨论
我们用ddply()函数计算每组Date变量对应的百分比。本例中,ddply()函数根据指定的变量Date对数据框cabbage_exp进行分组,并对各组数据执行transform()函数(ddply()函数中设定的其他参数也会传递给该函数)。
下面是cabbage_exp数据,从中可以看出ddply()命令对其进行操作的过程。
cabbage_exp
Cultivar Date Weight sd n se
c39 d16 3.18 0.9566144 10 0.30250803
c39 d20 2.80 0.2788867 10 0.08819171
c39 d21 2.74 0.9834181 10 0.31098410
c52 d16 2.26 0.4452215 10 0.14079141
c52 d20 3.11 0.7908505 10 0.25008887
c52 d21 1.47 0.2110819 10 0.06674995
ce <- ddply(cabbage_exp, "Date", transform,
percent_weight = Weight / sum(Weight) * 100)
Cultivar Date Weight sd n se percent_weight
c39 d16 3.18 0.9566144 10 0.30250803 58.45588
c52 d16 2.26 0.4452215 10 0.14079141 41.54412
c39 d20 2.80 0.2788867 10 0.08819171 47.37733
c52 d20 3.11 0.7908505 10 0.25008887 52.62267
c39 d21 2.74 0.9834181 10 0.31098410 65.08314
c52 d21 1.47 0.2110819 10 0.06674995 34.91686
计算出百分比之后,就可以按照绘制常规堆积条形图的方法来绘制百分比堆积条形图了。
跟常规堆积条形图一样,我们可以调整百分比堆积条形图的图例顺序、更换调色板及添加边框线,如图3-21所示。
ggplot(ce, aes(x=Date, y=percent_weight, fill=Cultivar)) +
geom_bar(stat="identity", colour="black") +
guides(fill=guide_legend(reverse=TRUE)) +
scale_fill_brewer(palette="Pastel1")
参见
更多关于分组对数据进行变换的内容可参见15.16节。