美文网首页R语言可视化
ggplot2应用(一)——柱形图

ggplot2应用(一)——柱形图

作者: Bio_Infor | 来源:发表于2021-08-08 12:15 被阅读0次

    前言

    柱形图属于类别比较型图表,包括单数据系列柱状图、多数据系列柱状图、堆积柱状图和百分比堆积柱形图。柱形图一般适用于离散型变量的刻画。
    使用函数:geom_bar()

    • 单数据系列柱状图

    数据背景:

    #加载包
    library(ggplot2)
    #生成数据框
    Cut <- c('Fair','Good','Very Good','Premium','Ideal')
    Price <- c(4300,3800,3950,4700,3500)
    mydata <- data.frame(Cut,Price)
    #查看数据框
    head(mydata)
    

    直接绘制单数据柱状图:

    ggplot(data = mydata,aes(Cut,Price))+
      geom_bar(stat = 'identity',#不做任何统计变换
               width = 0.5,#设置每个柱的宽度
               color = 'black',#设置柱的边框色
               size = 0.5,#设置柱的边框尺寸
               fill = 'red',#设置柱的填充色
               alpha = 1#设置柱填充色的透明度
               )+
      theme_classic()#设置图标主题
    

    成图:


    Rplot01.jpeg

    如果我们想将图按照柱高降序来进行绘制,就需要对数据框进行排序,ggplot2默认横轴的类别型数据类型按照首字母顺序进行排列,这就需要我们在向量排序方面的知识:

    #首先对Price进行降序排序,并返回index
    order <- sort(mydata$Price,index.return = T,decreasing = T)
    #查看order
    order
    $x
    [1] 4700 4300 3950 3800 3500
    
    $ix
    [1] 4 1 3 2 5
    #对Cut进行排序,并转换为因子,固定顺序
    mydata$Cut <- factor(mydata$Cut,levels = mydata$Cut[order$ix])
    

    再进行绘制:


    Rplot02.jpeg
    • 多数据系列柱状图

    数据背景(某模型小鼠在给药前后某指标的变化):

    mydata <- read.table(file = 'test.txt',sep = '\t',header = T)
    #查看数据
    mydata
      Catergory Before_drug After_drug
    1    Group1        32.4       25.0
    2    Group2        27.3       22.1
    3    Group3        26.7       22.3
    4    Group4        28.7       21.6
    

    在进行多数据系列柱状图的绘制时,我们需要将多维的数据框转换成为二维的数据框,reshape2包中的melt函数可以实现这个功能。

    library(reshape2)
    mydata <- melt(mydata,id.vars = 'Catergory')
    #查看mydata
      Catergory    variable value
    1    Group1 Before_drug  32.4
    2    Group2 Before_drug  27.3
    3    Group3 Before_drug  26.7
    4    Group4 Before_drug  28.7
    5    Group1  After_drug  25.0
    6    Group2  After_drug  22.1
    7    Group3  After_drug  22.3
    8    Group4  After_drug  21.6
    
    ggplot(mydata,aes(Catergory,value))+
      geom_bar(aes(fill = variable),#对bar按照variable进行填充
               stat = 'identity',color = 'black',
               position = position_dodge(width = 0.6),#水平放置,两个bar左边界距离为0.6
               width = 0.5,size = 0.5)+
      theme_classic()
    

    成图:


    Rplot03.jpeg
    • 堆积柱状图

    数据背景:(实例数据为5个病人的组织样品中某几种细胞的数量)

    mydata <- read.table(file = 'test.txt',header = T)
                Group Sample1 Sample2 Sample3 Sample4 Sample5
    1          B_cell     981    1021     688     534    1156
    2          T_cell     652     678     587     205     986
    3 Epithelial_cell     106     187     201     186     194
    4             RBC      25      29      85      65      97
    

    首先还是将多维数据转换为二维数据:

    mydata <- melt(mydata,id.vars = 'Group')
    

    然后进行图形的绘制:

      geom_bar(aes(fill = Group),#对bar按照Group进行填充
               stat = 'identity',#在绘制堆积柱状图时必须指定此参数,否则会出现自动统计变换(求和)的情况,报错
               position = 'stack',#绘制堆积柱状图的参数
               color = 'black',width = 0.5,size = 0.5)+
      scale_fill_manual(values = c('#FF9641','#FF5B4E','#B887C3','#38C25D'))+
      #这个参数对Group映射到bar的颜色进行了精修,对每种细胞的bar的fill颜色进行了自定义
      theme_classic()
    

    成图:

    Rplot3.jpeg
    在这个图的绘制过程中需要说明的是:
    (1)stat = 'identity',这个参数在绘制堆积柱状图的时候必须声明,否则会自动进行统计变换,出现报错。
    (2)scale_fill_manual()这个参数针对类别型变量,且颜色的指定需使用values参数指定。

    当然,你可能还是觉得这个图怪怪的,主要是因为你想按照从大到小进行堆叠,实际上这就又是对数据框进行重新编排,过程如下:

    mydata$Group <- factor(mydata$Group,levels = c('RBC','Epithelial_cell','T_cell','B_cell'))
    #下面的命令一样:
    ggplot(mydata,aes(variable,value))+
      geom_bar(aes(fill = Group),
               stat = 'identity',
               position = 'stack',
               color = 'black',width = 0.5,size = 0.5)+
      scale_fill_manual(values = c('#FF9641','#FF5B4E','#B887C3','#38C25D'))+
      theme_classic()
    

    成图:


    Rplot4.jpeg

    在这里,需要对这个排序的问题进行说明一下:
    在R里面,可以将数据类型分为类别型、序数型、数值型,像本例当中不同的细胞类型就属于类别型变量,这种变量是没有顺序的,所以ggplot2绘图时会根据字母顺序进行排列。而我们想自己定义顺序的话,就需要将其转变成为序数型变量,恰好因子型变量就是我们所需要的,所以我们在这里通过factor()将一个类别型的字符串向量转变成了序数型的变量。

    • 百分比堆积柱状图

    为了更好地刻画不同变量之间的比例信息,我们可以绘制百分比堆积柱状图。(本例种同样使用上面的数据)

    #查看数据
    mydata
                Group Sample1 Sample2 Sample3 Sample4 Sample5
    1          B_cell     981    1021     688     534    1156
    2          T_cell     652     678     587     205     986
    3 Epithelial_cell     106     187     201     186     194
    4             RBC      25      29      85      65      97
    #小tips:计算每个Sample中RBC细胞的占比
    Percentage <- (as.matrix(mydata[4,2:ncol(mydata)]))/t(as.matrix(colSums(mydata[,2:ncol(mydata)])))
    

    上面给大家介绍了一个计算每个Sample中RBC细胞占比的方法,里面用到了一个colSums()函数,表示对列进行求和,大家可以尝试理解一下。
    下面展示进行百分比堆积柱状图的绘制,注意,这个图的绘制不需要我们自己求比例,上面仅仅为了展示,命令如下:

    library(reshape2)
    mydata <- melt(mydata,id.vars = 'Group')
    mydata$Group <- factor(mydata$Group,levels = c('RBC','Epithelial_cell','T_cell','B_cell'))
    ggplot(mydata,aes(variable,value))+
      geom_bar(aes(fill = Group),
               stat = 'identity',
               position = 'fill',
               color = 'black',width = 0.5,size = 0.5)+
      scale_fill_manual(values = c('#FF9641','#FF5B4E','#B887C3','#38C25D'))+
      theme_classic()
    

    成图:

    Rplot5.jpeg
    请大家注意,我们在绘制堆积柱状图时,需要展示在X轴的变量是作为列名存在的,如果拿到的数据不是这样的排布,可以首先使用t()对数据框进行转置操作,得到我们想要的形式。

    今天又是摸鱼的一天!

    相关文章

      网友评论

        本文标题:ggplot2应用(一)——柱形图

        本文链接:https://www.haomeiwen.com/subject/pwtivltx.html