前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文献配套GitHub发表级别绘图之饼图

文献配套GitHub发表级别绘图之饼图

作者头像
生信技能树
发布2022-03-03 14:26:45
1.9K0
发布2022-03-03 14:26:45
举报
文章被收录于专栏:生信技能树

下面是去年实习生的分享

author: "ylchen"

ggplot2是R语言最流行的第三方扩展包,是RStudio首席科学家Hadley Wickham读博期间的作品。根据其绘图理念,图形由以下几个模块组成:

简单来说:

一张统计图形就是从数据到几何对象(geometric object,缩写geom)的图形属性(aesthetic attribute,缩写aes)的一个映射。此外,图形中还可能包含数据的统计变换(statistical transformation,缩写stats),最后绘制在某个特定的坐标系(coordinate system,缩写coord)中,而分面(facet)则可以用来生成数据不同子集的图形。

接下来开启ggplot2基础学习系列。第一步从复现文章开始。

文章来源:"Preoperative immune landscape predisposes adverse outcomes in hepatocellular carcinoma patients with liver transplantation" (2021,npj Precision Oncology),数据与代码全部公开在https://github.com/sangho1130/KOR_HCC。

下面首先来复现Fig.1a(pie chart& rose chart),用饼图呈现出不同组织的数量

Fig.1

一、数据载入

代码语言:javascript
复制
  library(ggplot2)
  library(scales)
  library(RColorBrewer)
  #构建数据框结构
  data <- data.frame(
    group = c('Normal', 'FL', 'FH', 'CS', 'DL', 'DH', 'T1', 'T2', 'T3', 'Mixed'),
    value = c(16, 10, 10, 10, 10, 7, 17, 30, 11, 7)
  )
  Colors <- c('#bebdbd', '#bbe165', '#6e8a3c', '#546a2e', 
  '#f1c055', '#eb8919', '#f69693', '#f7474e', '#aa0c0b', '#570a08')
  #分类数据转换成因子变量,需要调整顺序的话可以加上level参数
  data$group <- factor(data$group) 
  head(data)

二、首先生成柱状图

开始选择合适的几何对象,就是用什么样的图片来直观表示我们的数据。其中柱状图就用geom_bar函数。除此之外,ggplot2提供了众多几何对象geom_xyz()供大家选择,完整的几何对象可以下载RStudio公司总结的ggplot2 cheetsheet。

代码语言:javascript
复制
ggplot(data,                         #输入数据
       aes(x="",                     #设置x轴变量
       y=value,                      #设置y轴变量
       fill=factor(group))) +        #设置图形填充变量
       geom_bar(width = 1,           #geom_bar()函数绘制条形图,width:条形图的宽度
               stat = "identity")+ #stat="count"表示条形的高度是y变量的数量  
  #stat="identity"表示条形的高度是y变量的值
  scale_fill_manual(values = Colors)     #设置填充的颜色

三、转换成饼图

  • coord_polar将圆形转成极坐标
代码语言:javascript
复制
ggplot(data,                         #输入数据
       aes(x="",                     #设置x轴变量
           y=value,                      #设置y轴变量
           fill=factor(group))) +        #设置图形填充变量
  geom_bar(width = 1,           #geom_bar()函数绘制条形图,width:条形图的宽度
           color = "white",
           stat = "identity")+   #stat="count"表示条形的高度是y变量的数量    
  #stat="identity"表示条形的高度是y变量的值
  scale_fill_manual(values = Colors) +    #设置填充的颜色                                                               #coord_polar极坐标转换,可以做饼图或玫瑰图或雷达图
  coord_polar(theta = "y",         #theta 可以选择x或y,表示外延的坐标
              direction = -1) +    #direction表示数据方向,1是顺时针,-1是逆时针
  theme_void() +                   #theme_void(): 设置完全空白的主题
  #ggtitle("I'm a titile")+        #添加标题
  theme(plot.title = element_text(hjust = 1), #hjust调整水平距离,
        #element_text()设置基于文本的组件
        legend.title = element_blank())+       #不显示legend标题
  geom_text(aes(label = value),
          position = position_stack(vjust = 0.5),size=5) #vjust=0.5在堆叠柱子的中间位置添加文字

四、玫瑰图

  • 然而,当我们的数据不是代表个体占总体的百分比,而是强调数据大小的对比时,可以用玫瑰图来展示,根据上面的代码做简单的修改即可。
  • 其实就是修改参数:coord_polar(theta = 'x',start = 0,direction = 1)
代码语言:javascript
复制
ggplot(data,                           
       aes(x=group,y=value,            
       fill=factor(group))) +          
       geom_bar(                      
              width = 1,              
              stat = "identity") +               
       scale_fill_manual(values = Colors) +        
       coord_polar(theta = 'x',start = 0,direction = 1)+
       theme_void() + 
       theme(plot.title = element_text(hjust = 0.5),
             legend.title = element_blank())

五、划重点了!

function函数

学习代码的目的就是为了节省我们的绘图时间。我们可以构建function函数,下次输入自己数据就可以直接使用,不用再调整参数。

复习function函数的书写,function函数定义如下

代码语言:javascript
复制
function_name <- function(arg1,arg2,....){
       functionBody
}
#function_name函数名
#arg1,arg2,....函数的参数
#functionBody函数主体,定义函数的作用
代码语言:javascript
复制
# 构建一个绘图函数
drPiechart <- function(columnNames, Values, Colors){
  library(ggplot2)
  library(scales)
  library(RColorBrewer)
  #构建数据框结构
  data <- data.frame(
    group = columnNames,
    value = Values
  )
  data$group <- factor(data$group, columnNames) #转换成因子变量
#绘图
ggplot(data,                         #输入数据
       aes(x="",                     #设置x轴变量
       y=value,                      #设置y轴变量
       fill=factor(group))) +        #设置图形填充变量
       geom_bar(width = 1,           #geom_bar()函数绘制条形图,width:条形图的宽度
               stat = "identity")+   #stat="count"表示条形的高度是y变量的数量    
                                     #stat="identity"表示条形的高度是y变量的值
       scale_fill_manual(values = Colors) +    #设置填充的颜色                                                               #coord_polar极坐标转换,可以做饼图或玫瑰图或雷达图
    coord_polar(theta = "y",         #theta 可以选择x或y,表示外延的坐标
                direction = -1) +    #direction表示数据方向,1是顺时针,-1是逆时针
    theme_void() +                   #theme_void(): 设置完全空白的主题
    theme(plot.title = element_text(hjust = 1), #hjust调整水平距离,
                                                #element_text()设置基于文本的组件
          legend.title = element_blank())+       #不显示legend标题
  geom_text(aes(label = value),
          position = position_stack(vjust = 0.5),size=5) #vjust=0.5在堆叠柱子的中间位置添加文字
}

输入自己数据即可作图

代码语言:javascript
复制
#依次按照columnNames, Values, Colors填入自己的数据即可
drPiechart(c('Normal', 'FL', 'FH', 'CS', 'DL', 'DH', 'T1', 'T2', 'T3', 'Mixed'), 
           c(16, 10, 10, 10, 10, 7, 17, 30, 11, 7), 
           c('#bebdbd', '#bbe165', '#6e8a3c', '#546a2e', 
             '#f1c055', '#eb8919', '#f69693', '#f7474e', '#aa0c0b', '#570a08'))

六、进阶的饼图

  • 如果需要展示两种分类形式,可以将饼图和环形图结合起来
  • 参考:https://rpubs.com/cardiomoon/398623
代码语言:javascript
复制
# if(!require(devtools)) install.packages("devtools")
# devtools::install_github("cardiomoon/moonBook")
# devtools::install_github("cardiomoon/webr")
library(ggplot2)
library(moonBook)
library(webr)

package moonBook 里面包含857名急性冠脉综合征(acs)患者的人口统计和实验室数据,这里展示吸烟状态的分布

代码语言:javascript
复制
head(acs)
# labelposition=0.1 百分数小于10%,标签位于外部
# ratioByGroup=FALSE 按不同分组计算百分比
PieDonut(acs,aes(pies=Dx,donuts=smoking),
         ratioByGroup=FALSE,labelposition=0.1,
         title="Distribution of Smoking Status by Diagnosis")

标签位置

如果希望将标签全放在内部,需将labelposition参数设置为0。在外面设置labelposition参数为1

代码语言:javascript
复制
PieDonut(acs,aes(Dx,smoking),selected=1,labelposition=0,title="labelposition=0")
PieDonut(acs,aes(Dx,smoking),selected=1,labelposition=1,title="labelposition=1")

突出展示

如果你想着重突出某个部分,这个参数就很方便了

参数:explode 内环的突出;selected 外环的突出

代码语言:javascript
复制
PieDonut(acs,aes(Dx,smoking),explode=1)
PieDonut(acs,aes(Dx,smoking),explode=1,explodeDonut=TRUE)
# explode 内环的突出
# selected 外环的突出
PieDonut(acs,aes(Dx,smoking),explode=1,selected=c(3,6,9),explodeDonut=TRUE)

角度调整

代码语言:javascript
复制
PieDonut(acs,aes(Dx,smoking),start=3*pi/2,explode=1,selected=c(3,6,9),explodeDonut=TRUE)

半径设置

如果你不想要中间的圆心,可通过r0showPieName设置

另外,r1r2分别可以调整内外环的半径

代码语言:javascript
复制
PieDonut(acs,aes(Dx,smoking),r0=0,showPieName=FALSE)
# r1,r2分别可以调整内外环的半径
PieDonut(acs,aes(Dx,smoking),r0=0.2,r1=0.8,r2=1.4,explode=1,start=pi/2,explodeDonut=TRUE)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • author: "ylchen"
  • 一、数据载入
  • 二、首先生成柱状图
  • 三、转换成饼图
  • 四、玫瑰图
  • 五、划重点了!
    • function函数
    • 六、进阶的饼图
      • 标签位置
        • 突出展示
          • 角度调整
            • 半径设置
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档