饼图有时候看起来和堆积柱状图表达的效果类似,都是为了显示不同group的百分占比。只不过饼图好像看起来比柱状图看上去更清晰,整个图片填充比更高一些。
library(reshape2)
library(ggplot2)
我们还是用微生物的丰度占比作为测试数据,包含多个时间点的数据。
data <- read.table("phylum_top10.txt", sep = "\t", header=T)
data$Taxonomy <- factor(data$Taxonomy,levels=rev(data$Taxonomy)) #常规造作,设置为因子,按照想要的顺序排序
label <- paste(round(data$time1*100,2),"%",sep="") #为了添加饼图上的label
ggplot(data,aes(x="",y=time1,fill=Taxonomy)) +
geom_bar(stat = "identity",color="white") +
#scale_fill_manual(values = rainbow(11)) +
coord_polar(theta = "y") + #这行如果注释掉,就是常规的柱状图
theme(axis.text.x = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank())+
labs(x = '', y = '', fill = 'Top10 Phylum')+
geom_text(aes(y= cumsum(time1)-time1/2, x= 1.6),label=label,size=3) #主要为了添加label的位置
这就是一个常规的饼图
当然也可以用常见的pie和pie3D函数操作。
pie(data$time1,labels=paste(data$Taxonomy,label),col=rainbow(11))
legend(1.2,1,legend=data$Taxonomy,cex=0.9,pch=19,col=rainbow(11),inset=0.1)
也可以通过画3D的。
pie3D(data$time1,labels=label,col=rainbow(11))
如果我们画成并排的柱状图会是什么效果呢?我们可以试下:
ggplot(data, aes(x = Taxonomy, y = time1, fill = Taxonomy)) +
geom_bar(stat = 'identity', width = 1) +
scale_fill_manual(values = rainbow(11)) +
theme(panel.grid = element_blank(),
panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
plot.title = element_text(hjust = 0.5)) +
labs(x = '', y = '', fill = 'Top10 Phylum')+
geom_text(aes(y= time1, x= Taxonomy),label=label,size=3)+
coord_polar(theta = "y")
这样子,我们就画了一个圆环图,每个环展示该样本中各细菌类别丰度组成。
那如果我们绘制多个样本的话,会是什么效果呢?
先利用我们前面讲过的堆积柱状图的方法。
time_all <- melt(data, id = 'Taxonomy') #还是前面讲过的,变成短矩阵
ggplot(time_all, aes(variable, value, fill = Taxonomy)) +
geom_bar(stat = 'identity', width = 0.8) +
scale_fill_manual(values = rainbow(11))
ggplot(time_all, aes(variable, value, fill = Taxonomy)) +
geom_bar(stat = 'identity', width = 0.8) +
scale_fill_manual(values = rainbow(11)) +
labs(x = '', y = '', fill = 'Top10 Phylum') +
theme(panel.grid = element_blank(), panel.background = element_blank(), axis.text.x = element_blank())+
coord_polar(theta = "y")
变完之后,就会变成多个环了,每个环代表不同样本的比例数据。