R语言|分面中嵌入趋势线

news2024/11/24 9:04:03

简介

关于分面的推文,小编根据实际科研需求,已经分享了很多技巧。例如:

  1. 分面中添加不同表格

  2. 分面中添加不同的直线

  3. 基于分面的面积图绘制

  4. 分面中的细节调整汇总

  5. 基于分面的折线图绘制

最近科研中又遇到了与分面相关的需求:在分面中添加拟合线。本期就针对该问题,绘制出以下图形:

图形含义:随着时间的推移,展示多个测试产品退化累积量的箱线图。这些产品涵盖了两种不同的退化性能(PC)。图中的红线表示通过提出的模型拟合得到的平均产品退化累积量,而两条粉色线表示相应的90%置信区间。

选择绘制箱线图的原因在于想要突显多个产品之间的异质性,并强调退化路径分布特征呈现出的厚尾现象。

注意:本文图形是小编在研究领域中常用的图形,通过这里进行总结,希望能给读者们一些启发。

教程

数据介绍

由于数据模拟产生比较复杂,且不是本文的重点。小编以某个测试数据集为例,数据和代码可在我的 Github 中找到。cal_data 为处理好的真实数据。PC 表示性能退化指标,共两个, Unit 表示希望展示的离散时间点,value 表示退化累积量。 data_fit 表示根据所提模型拟合得到的区间估计和点估计。该数据集为列表形式,包含三个数据框,分别为:Low,Mean,Up。

load("true_data.RData")
load("data_fit.RData")

cal_data

data_fit 拟合结果

数据处理

根据真实数据集的数据结构,我们将拟合结果也转化成类似结构。主要思路:

  1. 将列表合并为一个数据框 bind_rows()
  2. 宽表转化为长表 pivot_longer()
  3. 提取三种估计的结果。

最终每个结果的形式和真实数据集的数据结构一致(很重要)!

time2 = seq(3,m,3) #希望展示的数据点(离散)
  merged_df2 <- bind_rows(data_fit, .id = "Unit") #合并数据
  merged_df2$Unit = rep(c("Low","Mean","Up"),each = length(0:m))
  mer_dat = merged_df2 %>% pivot_longer(cols = !c(Time,Unit), names_to = "PC", values_to = "Value")
  # 数据筛选,用于画直线
  mer_dat1 = mer_dat[mer_dat$"Time" %in% time2 & mer_dat$"Unit" == "Low", 2:4]; colnames(mer_dat1) = c("Unit","PC","value")
  mer_dat2 = mer_dat[mer_dat$"Time" %in% time2 & mer_dat$"Unit" == "Mean", 2:4]; colnames(mer_dat2) = c("Unit","PC","value")
  mer_dat3 = mer_dat[mer_dat$"Time" %in% time2 & mer_dat$"Unit" == "Up", 2:4]; colnames(mer_dat3) = c("Unit","PC","value")

mer_dat1

分面画图

通过添加三个 geom_smooth() 实现分面中添加拟合线。运行以下代码即可得到:

ggplot() + 
    geom_boxplot(data = true_data, aes(factor(Unit,levels = time2),value,fill=factor(Unit,levels = time2))) +
    geom_smooth(data= mer_dat1, aes(factor(Unit,levels = time2),value,group=1),
                color="#EE81C3", method="loess", linetype = 2,se = FALSE) +
    geom_smooth(data= mer_dat2, aes(factor(Unit,levels = time2),value,group=1),
                color="#DC3F20", method="loess",linetype = 1,se = FALSE) +
    geom_smooth(data= mer_dat3, aes(factor(Unit,levels = time2),value,group=1),
                color="#EE81C3", method="loess",linetype = 2,se = FALSE) +
    facet_wrap(vars(PC),scale="free") +
    scale_fill_viridis(discrete = TRUE,alpha = 0.8) + 
    theme_bw() + theme(panel.grid = element_blank(),legend.position = "none") +
    xlab("Time") + ylab("Y(t)")

函数汇总

为了方便起见,小编将其转化为了一个函数供大家参考:

boxplot.path.fit = function(data_fit = data_fit, cal_data = cal_data, leg.pos = "none"){
  time2 = seq(3,m,3) #希望展示的数据点(离散)
  
  merged_df2 <- bind_rows(data_fit, .id = "Unit") #合并数据
  merged_df2$Unit = rep(c("Low","Mean","Up"),each = length(0:m))
  mer_dat = merged_df2 %>% pivot_longer(cols = !c(Time,Unit), names_to = "PC", values_to = "Value")
  # 数据筛选,用于画直线
  mer_dat1 = mer_dat[mer_dat$"Time" %in% time2 & mer_dat$"Unit" == "Low", 2:4]; colnames(mer_dat1) = c("Unit","PC","value")
  mer_dat2 = mer_dat[mer_dat$"Time" %in% time2 & mer_dat$"Unit" == "Mean", 2:4]; colnames(mer_dat2) = c("Unit","PC","value")
  mer_dat3 = mer_dat[mer_dat$"Time" %in% time2 & mer_dat$"Unit" == "Up", 2:4]; colnames(mer_dat3) = c("Unit","PC","value")
  
  p1 = ggplot() + 
    geom_boxplot(data = cal_data, aes(factor(Unit,levels = time2),value,fill=factor(Unit,levels = time2))) +
    geom_smooth(data= mer_dat1, aes(factor(Unit,levels = time2),value,group=1),
                color="#EE81C3", method="loess", linetype = 2,se = FALSE) +
    geom_smooth(data= mer_dat2, aes(factor(Unit,levels = time2),value,group=1),
                color="#DC3F20", method="loess",linetype = 1,se = FALSE) +
    geom_smooth(data= mer_dat3, aes(factor(Unit,levels = time2),value,group=1),
                color="#EE81C3", method="loess",linetype = 2,se = FALSE) +
    facet_wrap(vars(PC),scale="free") +
    scale_fill_viridis(discrete = TRUE,alpha = 0.8) + 
    theme_bw() + theme(panel.grid = element_blank(),legend.position = leg.pos) +
    xlab("Time") + ylab("Y(t)")
  
  return(p1)
}

boxplot.path.fit(data_fit = data_fit, cal_data = cal_data, leg.pos = "none")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1317382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 第12章 异常 本章作业

1 编程 两数相除的异常处理 各自属于哪些异常&#xff1a; 数据格式不正确 NumberformatException 缺少命令行参数 ArrayIndexOutOfBoundsException 除0异常处理 ArithmeticException ArrayIndexOutOfBoundsException 为数组下标越界时会抛出的异常&#xff0c;可以在检测到命…

day20_22mysql数据库(简单了解)

为什么使用数据库 数据出存储在哪里&#xff1f; 硬盘&#xff0c;光盘&#xff0c;U盘&#xff0c;网盘&#xff0c;内存&#xff08;临时数据&#xff09; 为什么数据库 数据储存在哪里&#xff1f; 硬盘、网盘、U盘、光盘、内存&#xff08;临时存储&#xff09; 数据…

[密码学]AES

advanced encryption standard&#xff0c;又名rijndael密码&#xff0c;为两位比利时数学家的名字组合。 分组为128bit&#xff0c;密钥为128/192/256bit可选&#xff0c;对应加密轮数10/12/14轮。 基本操作为四种&#xff1a; 字节代换&#xff08;subBytes transformatio…

Python MySQL数据库连接与基本使用

一、应用场景 python项目连接MySQL数据库时&#xff0c;需要第三方库的支持。这篇文章使用的是PyMySQL库&#xff0c;适用于python3.x。 二、安装 pip install PyMySQL三、使用方法 导入模块 import pymysql连接数据库 db pymysql.connect(hostlocalhost,usercode_space…

深入了解Linux网络配置:常见面试问题及解答

学习目标&#xff1a; 解释Linux网络配置的重要性和作用引入常见的面试问题 学习内容&#xff1a; 如何查看当前系统的IP地址和网关信息&#xff1f; 解答&#xff1a;可以使用ifconfig命令来查看当前系统的IP地址和网关信息。通过运行ifconfig命令&#xff0c;将会列出所有可…

【C++】STL 容器 - string 字符串操作 ⑤ ( string 字符串查找 | find 函数查找字符串 | rfind 函数查找字符串 )

文章目录 一、string 字符查找 - find 函数查找字符串1、string 类 find 函数原型说明2、代码示例 - 字符串查找3、代码示例 - 统计字符串子串 二、string 字符查找 - rfind 函数查找字符串1、string 类 rfind 函数原型说明2、代码示例 - rfind 字符串查找 一、string 字符查找…

如何查看PHP信息

创建一个 PHP 文件&#xff0c;比如 info.php&#xff0c;在其中添加以下代码&#xff1a; <?php phpinfo(); ?>访问这个文件&#xff08;例如&#xff0c;在浏览器中输入 http://localhost/info.php&#xff09;&#xff0c;它会显示 PHP 的所有配置信息。在这个页面…

论文降重同义词替换的实践经验与改进建议 快码论文

大家好&#xff0c;今天来聊聊论文降重同义词替换的实践经验与改进建议&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文降重同义词替换的实践经验与改…

Linux 下的PROC虚拟文件夹的介绍

#江南的江 #每日鸡汤&#xff1a;其一半亩方塘一鉴开,天光云影共徘徊。问渠哪得清如许?为有源头活水来 #初心和目标&#xff1a;在网络安全中崭露头角 PROC 一.proc的文件里的文件是对于计算机的基本信息的介绍。 其中数字文件是代表着进程&#xff0c;其余的例如cpuinfo…

[NOI2015] 程序自动分析(并查集)

题解 最后的结果与约束条件的顺序无关&#xff0c;可以先考虑相等条件&#xff0c;再考虑不等条件。由于题目中i和j的数据范围较大&#xff0c;需要用到离散化。 代码 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>…

01 整体代码运行流程

文章目录 01 整体代码运行流程1.1 运行官方 Demo1.2 变量命名规则1.3 多线程1.4 线程锁1.5 SLAM 主类 System 01 整体代码运行流程 1.1 运行官方 Demo 以 stereo_kitti 为例&#xff0c;执行 ./stereo_kitti path_to_vocabulary path_to_settings path_to_sequence./stereo_…

FLStudio2024版本新增功能及21.3版本安装下载教程

FLStudio21.0.2.3中文版完整下载是最好的音乐开发和制作软件也称为水果循环。它是最受欢迎的工作室&#xff0c;因为它包含了一个主要的听觉工作场所。最新FL有不同的功能&#xff0c;如它包含图形和音乐音序器&#xff0c;帮助您使完美的配乐在一个美妙的方式。此程序可用于Mi…

目标检测应用场景—数据集【NO.18】银杏果目标检测数据集

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;今天分享…

gazebo中手动控制ur5机械臂

创建工作空间 cd ~ mkdir -p catkin_ws/src cd ~/catkin_ws/src 下载代码 ~/catkin_ws/src$ git clone https://github.com/dairal/ur5-joint-position-control.git ~/catkin_ws/src$ cd .. ~/catkin_ws$ catkin_make ~/catkin_ws$ source devel/setup.bash 安装ros-contro…

[LeetCode周赛复盘] 第 376 场周赛20231217

[LeetCode周赛复盘] 第 376 场周赛20231217 一、本周周赛总结100149. 找出缺失和重复的数字![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/347f99d7222f4b8a9c9b14fdff240e4d.png)2. 思路分析3. 代码实现 100161. 划分数组并满足最大差限制1. 题目描述2. 思路分析…

【LeetCode刷题-树】--173.二叉搜索树迭代器

173.二叉搜索树迭代器 本题就是实现二叉树的中序遍历&#xff0c;利用数组本身实现迭代器 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.va…

JSON Ajax

1. JSON概念 JSON&#xff0c;全称JavaScript Object Notation&#xff0c;即JavaScript对象表示法&#xff0c;是一种轻量级的数据交换格式。它基于JavaScript的子集&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。 JSON的诞生&#xff0c;是为了解决电…

关于“Python”的核心知识点整理大全24

目录 ​编辑 10.1.6 包含一百万位的大型文件 pi_string.py 10.1.7 圆周率值中包含你的生日吗 10.2 写入文件 10.2.1 写入空文件 write_message.py programming.txt 10.2.2 写入多行 10.2.3 附加到文件 write_message.py programming.txt 10.3 异常 10.3.1 处理 Ze…

python装饰器理解

这篇文章记录了对python装饰器的理解&#xff0c;主要参考了文章【Python】一文弄懂python装饰器&#xff08;附源码例子&#xff09;&#xff0c;大部分内容是直接转载的&#xff0c;然后根据自己的理解多加了一些解释说明。 python装饰器理解 1 装饰器2 使用装饰器的动机3 简…

解决报错:ModuleNotFoundError: No module named ‘timm.optim.novograd‘ 的办法,亲测有效

问题 在尝试运行文件的时候&#xff0c;有这样的引用 from timm.optim.novograd import NovoGrad 总是报错&#xff01;&#xff01;&#xff01; 解决办法 试过 更新timm &#xff1a; pip install --upgrade timm 试过换一种引用方式 from timm.optim import NovoGra…