Py学习  »  Git

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

生信技能树 • 2 年前 • 291 次点击  


给学徒们收集整理了几套带GitHub源代码的文献图表合辑,让优秀者一点一滴拆解开来分享给大家。(全部的代码复制粘贴即可运行,欢迎尝试以及批评指正)

下面是去年实习生的分享

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

一、数据载入

  library(ggplot2)
library(scales)
library(RColorBrewer)
#构建数据框结构
data 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 '#f1c055', '#eb8919', '#f69693', '#f7474e', '#aa0c0b', '#570a08')
#分类数据转换成因子变量,需要调整顺序的话可以加上level参数
data$group head(data)

二、首先生成柱状图

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

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将圆形转成极坐标
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)
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函数定义如下

function_name        functionBody
}
#function_name函数名
#arg1,arg2,....函数的参数
#functionBody函数主体,定义函数的作用
# 构建一个绘图函数
drPiechart library(ggplot2)
library(scales)
library(RColorBrewer)
#构建数据框结构
data group = columnNames,
value = Values
)
data$group #绘图
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在堆叠柱子的中间位置添加文字
}

输入自己数据即可作图

#依次按照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
# 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)患者的人口统计和实验室数据,这里展示吸烟状态的分布

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

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 外环的突出

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)

角度调整

PieDonut(acs,aes(Dx,smoking),start=3*pi/2,explode=1,selected=c(3,6,9),explodeDonut=TRUE)

半径设置

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

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

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)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/126421
 
291 次点击