社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

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

生信技能树 • 3 年前 • 475 次点击  


给学徒们收集整理了几套带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
 
475 次点击