Closed ixxmu closed 2 years ago
给学徒们收集整理了几套带GitHub源代码的文献图表合辑,让优秀者一点一滴拆解开来分享给大家。(全部的代码复制粘贴即可运行,欢迎尝试以及批评指正)
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),用饼图呈现出不同组织的数量
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。
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_name <- function(arg1,arg2,....){
functionBody
}
#function_name函数名
#arg1,arg2,....函数的参数
#functionBody函数主体,定义函数的作用
# 构建一个绘图函数
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在堆叠柱子的中间位置添加文字
}
输入自己数据即可作图
#依次按照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'))
# 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)
https://mp.weixin.qq.com/s/09jWCFp3NGqxL2EKy-UhQw