你需要堆叠柱状图添加bar吗?
年底了,各种事情都在排队去做,造成的后果就是时间像流水一下迅速过去了,抽出一点时间做点学习成了奢求,前两天在微生信生物群0中讨论了一个如何对堆叠柱状图添加误差线问题,类似下面的图片:额。画质真烂!我使用R语言简单实现了一下,这里希望能为大家做个借鉴。
其实这个实现很简单,就像我们对堆叠柱状图添加标签一样,只不过这里添加的是bar。这里核心步骤只有两条第一是构造误差线的坐标,我们使用函数:ddply(df_res,"Attribute",transform,label_y = cumsum(Mean ));第二个是重新排布堆叠柱状图不同分组因子水平,保证按照正确的方向填充:factor(df_res$Species,levels = c("virginica","versicolor","setosa" ))。这两条做好之后我们就可以出图了。
## 导入包
library(ggplot2)
library(reshape2)
library(RColorBrewer)
library(plyr)
## 载入数据,这里是默认的鸢尾花数据
df <- iris
#数据宽边长
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 绘图
ggplot(df_res1, aes(x=Attribute, y=Mean, fill=Species)) +
geom_bar(stat="identity",color="black", width=.6) +
scale_fill_manual(values = mycol) +
geom_errorbar(aes(ymin=label_y-Sd, ymax=label_y +Sd), width=.2)
其实这个图片在比较少的柱子中还可以看出来误差线,如果数据不好,想必会有大量误差线重叠,并影响最终效果。使用起来还是需要评估适用范围。
赞 (0)