简介
最近在做论文模拟实验并将实验结果进行可视化。下面是我这阶段的一些经验总结,在此记录下,也希望能够帮助到你。
方法不一定最优,也欢迎批评指正。由于工作还在继续,完整代码现阶段不会公开,下面给出部分代码和代码编写思路。
整个工作流程:由于参数不同,会得到不同的结果。我的目标是将不同参数模拟的结果最后通过一副图进行可视化。
难点:每个脚本代码量较大,模拟时间较长(10h ),为了方便起见,我将不同参数单独构建成一个脚本,然后开启多个Rstudio,进行“人工”并行运算并保存各个脚本的 Rdata 和数据集。最后新建一个 R 脚本,加载参数模拟结果并绘图。最终可视化结果如下:
这里的每行图形来自一个Rdata(一组参数),整幅图中包含了三组不同参数的结果。
首先看下我每个脚本中的代码缩略图以及部分脚本:
代码缩略图
部分脚本
注意: 为了方便查看,我将自己论文所需函数都放到了
all_function.r
脚本中,然后使用source()
将其进行加载。脚本中参数修改主要是numbers,sigma,nums和it。
all_function.r缩略图
工作流程
接下来给出操作流程:
1.打开多个 Rstudio并运行
每个 Rstudio 中运行一个脚本代码。
2. 在每个 R 脚本中存储所有 Rdata 和数据集
代码如下:
代码语言:javascript复制write.xlsx(sheets, paste("./data/latex/sigma",sigma,"new2/R",numbers,"_",nums,"_",it,".xlsx",sep=""),
colNames = T, rowNames = T)
save.image(paste("./data/latex/sigma",sigma,"new2/R",numbers,"_",nums,"_",it,".Rdata",sep=""))
注意: 这里有个小技巧,使用
paste()
函数,自动根据参数不同(这里是sigma,numbers,nums,it
),改变路径和文件名称(文件夹要提前建立好)。
这是运行完的结果如下。
3. 新建了一个R脚本,绘制图形
文件名叫 plot_all.r
。主要功能是将刚才每个不同参数的脚本得到的数据绘制图形,然后使用相应的包将他们合成一个图。代码缩略图可见文末,这里先介绍各个函数的功能。如果对ggplot2绘制还存在一定难度的朋友,可以在公众号输入[可视化文稿]得到教程文稿,再结合我的b站(账号:庄闪闪)“R可视化教程”,进行快速的入门学习。
plot_5_methods
功能:使用ggplot2
包绘制一个数据集中某一列参数(b/c/d/sigma
)的图形。
plot_5_methods = function(dat = b_data){
plot_5 = ggplot(dat,aes(class,value,fill = class))
geom_boxplot(na.rm = T)
# scale_fill_viridis(discrete = TRUE, alpha=0.6)
stat_summary(fun.y=mean, na.rm=T, geom="point", shape=21, size=2, fill="red",color="red")
# geom_jitter(color="black", size=0.4, alpha=0.9)
# geom_hline(yintercept = yline)
theme_bw()
theme(
legend.position="none",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
plot.title = element_text(size=11)
)
ylab("")
xlab("")
return(plot_5)
}
all_plot_compare
功能:绘制一个数据集所有列,并将其横向合并,结果如下所示:
all_plot_compare = function(data1 = all_data_0.3,str1 = c(0, 3.5,0, 1,0, 10,0, 1.5)){
## b
b_data = data.frame("class" = factor(rep(c("GH","TS","BT","Pooled","Fixed"),each = dim1),
levels = c("GH","TS","BT","Pooled","Fixed")),
"value" = c(data1[,1],data1[,5],data1[,9],data1[,13],data1[,17]))
b_plot = plot_5_methods(dat = b_data)
geom_hline(yintercept = b,linetype = 3)
scale_y_continuous(limits = str1[1:2])
xlab(expression(b))
scale_fill_manual(values = col1)
## c
c_data = data.frame("class" = factor(rep(c("GH","TS","BT","Pooled","Fixed"),each = dim1),
levels = c("GH","TS","BT","Pooled","Fixed")),
"value" = c(data1[,2],data1[,6],data1[,10],data1[,14],data1[,18]))
c_plot = plot_5_methods(dat = c_data)
geom_hline(yintercept = c,linetype = 3)
scale_y_continuous(limits = str1[3:4])
xlab(expression(c))
scale_fill_manual(values = col1)
## d
d_data = data.frame("class" = factor(rep(c("GH","TS","BT","Pooled","Fixed"),each = dim1),
levels = c("GH","TS","BT","Pooled","Fixed")),
"value" = c(data1[,3],data1[,7],data1[,11],data1[,15],data1[,19]))
d_plot = plot_5_methods(dat = d_data)
geom_hline(yintercept = d,linetype = 3)
scale_y_continuous(limits = str1[5:6])
xlab(expression(d))
scale_fill_manual(values = col1)
## sigma
sigma_data = data.frame("class" = factor(rep(c("GH","TS","BT"),each = dim1),
levels = c("GH","TS","BT")),
"value" = c(data1[,4],data1[,8],data1[,12]))
sigma_plot = plot_5_methods(dat = sigma_data)
geom_hline(yintercept = sigma,linetype = 3)
scale_y_continuous(limits = str1[7:8])
xlab(expression(sigma))
scale_fill_manual(values = col1[1:3])
return(plot_grid(b_plot,c_plot,d_plot,sigma_plot,ncol = 4,nrow = 1))
}
注意:这里我将每个参数的
ylim
都放到str1
参数中,方便人工修改。all_data_0.3
表示某个脚本得到的数据集。期间还加了一些ggplot
参数,修改了颜色和加入 x 轴标题等(看个人喜好添加)。
all_plot_compare函数结果
- 加载Rdata并绘制图形
前面两函数基本可以绘制一个数据集的所有图形了,之后我要将不同数据集加载进来(例如:load("~/Desktop/2021.06.06/data/latex/plot_data/R11_500_200_0.3.Rdata")
),然后内部关键数据集(point_final
)进行重新定义,并通过前面写的函数进行绘制,并保存到变量中(p_0.3
)。
# sigma0.3
load("~/Desktop/2021.06.06/data/latex/plot_data/R11_500_200_0.3.Rdata")
all_data_0.3 = point_final
dim1 = nrow(all_data_0.3)
p_0.3 = all_plot_compare(data1 = all_data_0.3)
最后使用ggpubr
包中的annotate_figure()
加入图片的标签,再使用cowplot
包中的plot_grid()
将图片进行合并。具体教程参考:R语言统计与绘图:给组合图形添加ABCD小标签;R可视乎|合并多幅图形;R语言ggplot2作图一些好看的颜色搭配;paletteer包:拥有2100多个调色板!
代码如下:
代码语言:javascript复制fig11 = annotate_figure(p_0.3,
top = text_grob(bquote("("*sigma==0.3*")"),
color = "black", size = 12))
fig21 = annotate_figure(p_0.5,
top = text_grob(bquote("("*sigma==0.5*")"),
color = "black", size = 12))
fig31 = annotate_figure(p_0.8,
top = text_grob(bquote("("*sigma==0.8*")"),
color = "black", size = 12))
plot_grid(fig11,fig21,fig31,ncol = 1,nrow = 3)
注意: 这里又有一个技巧:在标签中加入特殊符号,可以使用
expression()
函数,也可以使用我这里写的bquote()
函数。
绘图代码缩略图
小编有话说
这里在做一些说明:
- 可以直接
viridis
包进行颜色填充,例如:scale_fill_viridis(discrete = TRUE, alpha=0.6)
。我这里使用手动加载颜色:scale_fill_manual(values = col1)
。 - 如果图形中包含中文,可以使用
showtext
包解决该问题,代码如下:
library(showtext)
showtext.auto()
- 整个流程还有一个思路:将所有函数构建成一个大的函数,只需要改变相应参数即可,这时代码量就会减少很多。
- 希望半年后后头看这篇推文会有不一样的想法。希望到时候觉得现在的思路很幼稚!?