R问题|数值模拟流程记录和分享

简介: 最近在做论文模拟实验并将实验结果进行可视化。下面是我这阶段的一些经验总结,在此记录下,也希望能够帮助到你。

简介


最近在做论文模拟实验并将实验结果进行可视化。下面是我这阶段的一些经验总结,在此记录下,也希望能够帮助到你。

方法不一定最优,也欢迎批评指正。由于工作还在继续,完整代码现阶段不会公开,下面给出部分代码和代码编写思路。

整个工作流程:由于参数不同,会得到不同的结果。我的目标是将不同参数模拟的结果最后通过一副图进行可视化。

难点:每个脚本代码量较大,模拟时间较长(10h+),为了方便起见,我将不同参数单独构建成一个脚本,然后开启多个Rstudio,进行“人工”并行运算并保存各个脚本的 Rdata 和数据集。最后新建一个 R 脚本,加载参数模拟结果并绘图。最终可视化结果如下:

)S2){~)C01G8A}PV9L}`@QT.jpg

这里的每行图形来自一个Rdata(一组参数),整幅图中包含了三组不同参数的结果。

首先看下我每个脚本中的代码缩略图以及部分脚本:


代码缩略图

CFBRH7IHF%K[{L}52ZMPE3S.png


部分脚本

注意: 为了方便查看,我将自己论文所需函数都放到了all_function.r脚本中,然后使用source()将其进行加载。脚本中参数修改主要是numbers,sigma,nums和it。

B84C~2(C7V1FU]U[94TMQ_V.pngall_function.r缩略图


工作流程

接下来给出操作流程:


1.打开多个 Rstudio并运行

每个 Rstudio 中运行一个脚本代码。image.gif

I`Y]L0{ZGQ2EFX4EY$3M@5H.png


2. 在每个 R 脚本中存储所有 Rdata 和数据集

代码如下:

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),改变路径和文件名称(文件夹要提前建立好)。

这是运行完的结果如下。

H25PY5)IZZ~$47](SUY]53A.png



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)
}

2NLX6QSGQ)@Z@AZL{8@P63B.png

  • 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 轴标题等(看个人喜好添加)。

image.gifall_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多个调色板!

代码如下:

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() 函数。

](4N4XKZD[X(K}UG_2P$I{U.png

绘图代码缩略图


目录
相关文章
|
6月前
|
数据采集 数据挖掘 数据处理
数据清洗的主要步骤包括**理解数据、处理重复值、处理空缺值、处理异常值、数据标准化和数据收集
【4月更文挑战第3天】数据清洗的主要步骤包括**理解数据、处理重复值、处理空缺值、处理异常值、数据标准化和数据收集
311 2
|
6天前
|
数据处理
重复值的判断标准是否可以根据具体业务需求进行调整?
重复值的判断标准需要紧密结合具体的业务需求进行灵活调整,这样才能确保数据处理的准确性和有效性,为业务决策提供可靠的数据支持。
38 10
|
17天前
|
传感器 存储 索引
如何解决 analogRead()函数读取到的模拟值不准确的问题
在使用analogRead()函数时,若读取到的模拟值不准确,可以通过校准ADC、增加采样次数取平均值、使用外部参考电压或检查电路连接等方式来提高读取精度。
|
6月前
|
C语言
编写一个程序, 给出两个时间,计算出两个时间之差,如给出1120表示11:20,1330表示13:30, 将时间间隔以分钟为单位输出。
这是一个C语言程序,它接收两个时间(小时:分钟格式)作为输入,然后计算并输出两个时间之间的差值。代码包括输入处理、时间转换为分钟以及计算时间差。程序运行结果展示了一个具体的示例时间差。
55 0
|
6月前
|
自然语言处理 网络协议 应用服务中间件
记录一次问题的解决过程
记录一次问题的解决过程
|
机器学习/深度学习 算法 计算机视觉
舌体胖瘦的自动分析-曲线拟合-或许是最简单判断舌形的方案(六)
舌体胖瘦的自动分析-曲线拟合-或许是最简单判断舌形的方案(六)
149 0
|
算法 C语言 C++
【模拟】特别数的和、移动距离、连号区间、错误票据思路详解及代码实现
取出最后一位,然后将n除去最后一位,将刚刚取出的进行判定。
79 0
|
存储 资源调度 数据可视化
R问题|数值模拟流程记录和分享
R问题|数值模拟流程记录和分享
147 0
|
数据采集 机器学习/深度学习 运维
异常值检测!最佳统计方法实践(代码实现)!⛵
数据集中的异常值,对于数据分布、建模等都有影响。本文讲解两大类异常值的检测方法及其Python实现:可视化方法(箱线图&直方图)、统计方法(z分数&四分位距)。
957 2
异常值检测!最佳统计方法实践(代码实现)!⛵
输出十进制“08”等其他数值,报错无效的八进制数字,换个角度,三种方法解决问题
很显然,我们自己的语言与计算机有差别,我们想法是08,09,就是十进制数前加一个零,这是一个我们自定的格式,但计算机听不懂人类语言,就默认把0+某个数看成了八进制我们知道,八进制不可能出现8以上的数字,所以写程序时就有了下面这种报错:那我们赋值、输入时,无法表达出“我们认为”的这种所谓的十进制格式时,就应该换个角度去实现。.........
输出十进制“08”等其他数值,报错无效的八进制数字,换个角度,三种方法解决问题