给学徒们收集整理了几套带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) #设置填充的颜色
三、转换成饼图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)
半径设置如果你不想要中间的圆心,可通过r0
和showPieName
设置
另外,r1
,r2
分别可以调整内外环的半径
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)