ggpolt2有两个函数可以绘制柱形图,一个是昨天介绍的geom_bar(stat_count),另一个是geom_col
geom_bar是对每一组中的样本个数进行计数后画图,柱子的高度代表组内样本的个数。然而在设定stat="identity" 这个参数后,该函数就不会对样本进行计数,此时,柱子的高度就是你数据内相应的数值。
本文要介绍的是geom_col, 该函数是对每个组内不同类型的事件计数后,计算构成比进行绘图,每个柱子的高度代表每个组内事件的总数,柱子内部还会被划分成不同比例,代表不同事件的构成比。
本文用到的数据:
简单介绍一下,图1是SNP数据,有12个样本,每个样本内部还有A-G, C-T, A-C, A-T, C-G, G-T等事件,数字代表SNP位点个数,即事件发生数,geom_col就是用于表示每个样本内的事件发生数的构成比,每个柱子内都会按照构成比被分成若干块。图2表示每种SNP类型所属的大类,是Transition(转换)还是Transversion(颠换),图2不是画图所必需的,但可以在图上表示出来,增加图片包含的信息量。
理解数据后,开始读入数据:
snp <- read.csv(file = "clipboard",header = T,sep = "\t") #读入数据(图1)
type <- read.csv(file = "clipboard",header = T,sep = "\t") #读入数据(图2)
snp <- melt(snp,id = c("SNP_type")) #宽数据变成长数据
>head(snp)
>snp <- merge(snp,type,by = "SNP_type") #按照SNP_type合并两个数据
>head(snp)
数据准备好后,开始画图:
snp$SNP_type <- factor(snp$SNP_type,levels = c("A-G","C-T","A-C","A-T","C-G","G-T")) #按照这个顺序对每个柱子内部的小方块进行排序(从上到下)
ggplot(snp)+
geom_col(mapping = aes(variable,value,fill = SNP_type,color = Type),width = 0.9,size = 1.2)+ #可以设置position = "fill" 参数,让每个柱子等高,这样方便比较每个样本的构成比。
coord_cartesian(expand = F,xlim = c(0.45,12.65))+
scale_color_manual(values = c("black","grey"))+
labs(x = "Group",y = "",fill = "SNP type",color = "Type")+
theme(panel.background = element_blank(),
panel.grid.major.y = element_line(colour = "grey",linetype = 2),
axis.line = element_line(colour = "black",size = rel(2)),
axis.title = element_text(size = rel(1.2)),
axis.text.x = element_text(size = rel(1.5),angle = 45,hjust = 1),
axis.text.y = element_text(hjust = 1,size = rel(1.5)),
axis.ticks = element_line(size = rel(1.5)),
legend.key.size = unit(12,"mm"), #图例中图形的尺寸
legend.title = element_text(size = rel(1.2)),
legend.text = element_text(size = rel(1.2)),
legend.spacing.y = unit(5,"mm"), #图例的标题和图例的图形之间的间隔
plot.margin = margin(22,10,5,1))