ggplot2绘制柱形图(2)

ggpolt2有两个函数可以绘制柱形图,一个是昨天介绍的geom_bar(stat_count),另一个是geom_col

geom_bar是对每一组中的样本个数进行计数后画图,柱子的高度代表组内样本的个数。然而在设定stat="identity" 这个参数后,该函数就不会对样本进行计数,此时,柱子的高度就是你数据内相应的数值。

本文要介绍的是geom_col, 该函数是对每个组内不同类型的事件计数后,计算构成比进行绘图,每个柱子的高度代表每个组内事件的总数,柱子内部还会被划分成不同比例,代表不同事件的构成比。

本文用到的数据:

图1
图2

简单介绍一下,图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))

最终图形:

你可能感兴趣的:(ggplot2绘制柱形图(2))