如何将多个指标做嵌套柱状图
写在前面
如何使用ggplot做嵌套柱状图,其实教程很简单,主要是思维,我们如何选择这种嵌套图形来表达我们的数据。
基于时间序列的逐渐降低,或者逐渐升高。
数据总分形式。
指标包含关系。
实战
使用上次代码简单修改一下,即可完成。
## 导入包
library(ggplot2)
library(reshape2)
library(RColorBrewer)
library(plyr)
## 载入数据,这里是默认的鸢尾花数据
df <- iris
head(df)
#数据宽边长
df <- melt(df, id="Species", variable.name="Attribute", value.name = "Size")
#设置出图颜色
mycol= brewer.pal(n = 12, name = "Set3")
## 数据统计均值、标准差、标准误
mean <- aggregate(df$Size, by=list(df$Species, df$Attribute), FUN=mean)
sd <- aggregate(df$Size, by=list(df$Species, df$Attribute), FUN=sd)
len <- aggregate(df$Size, by=list(df$Species, df$Attribute), FUN=length)
df_res <- data.frame(mean, sd=sd$x, len=len$x)
colnames(df_res) = c("Species", "Attribute", "Mean", "Sd", "Count")
head(df_res)
df_res$Se <- df_res$Sd/sqrt(df_res$Count) ### 计算标准差
#构造误差线坐标
df_res1 = ddply(df_res,"Attribute",transform,label_y = cumsum(Mean ))
head(df_res1)
#因子重新排列
df_res1$Species = factor(df_res$Species,levels = c("virginica","versicolor","setosa" ))
### ggplot 绘图
df_res2 =df_res1[c(1,4,7),]
p = ggplot(df_res2, aes(x=Attribute, y=Mean)) +
geom_bar(stat="identity",color="black", width=.4,fill = mycol[1] ) +
scale_fill_manual(values = mycol) +
geom_errorbar(aes(ymin=label_y-Sd, ymax=label_y +Sd), width=.1)
p
df_res3 = df_res2
df_res3$Mean = df_res3$Mean - 1.2
p = p +
geom_bar(data = df_res3, aes(x=Attribute, y=Mean),stat="identity",color="black", width=.3,fill = mycol[2]) +
geom_errorbar(data = df_res3,aes(x=Attribute, y=Mean,ymin=Mean-Sd, ymax=Mean +Sd), width=.1) +
theme_void()
p
ggsave("cs.pdf",p)