复现sci顶刊中的画中画(局部细节放大)

news2024/9/22 5:43:06

简介

小编在撰写学术论文时,为了突出所提模型的优越性,你可以通过放大图形中的局部位置来进行比较。尽管从全局来看,各个方法的拟合效果都还不错,但通过放大图中的特定区域,可以更清楚地展示所提模型相对于其他模型的优势。

图一:来自“Origin中绘制局部细节放大图的5种方法”

例如,你可以选择在图中放大一个具有显著差异的区域,或者突出显示所提模型在某个关键阶段的表现。通过这种方式,读者能够更加直观地观察所提模型的预测趋势,并对其在特定情况下的优越性有更深刻的理解(如上图)。这样的展示方式将有助于更全面地展示所提模型的独特优势,提高论文的可读性和说服力。

这种图在工业工程方向的顶级期刊中经常看到。本文小编将给出几种 R 中绘制局部细节放大图的方法。

注意:小编搜到过 matlab 和 Origin 绘制局部细节放大图的文章。但是很少看到有人写 R 相关的教程。

初级版本

这章节给出利用 ggplot 包绘制模拟数据的线性图。下一章节将会介绍两种细节放大方法。

模拟数据产生

这里以一个模拟数据作为例子,读者可以根据自身数据情况进行替换。

# 生成模拟数据
com_battery = data.frame("Time" = 1:30,"True" = cumsum(abs(rnorm(30,2,0.4))),
                          "Proposed" = cumsum(abs(rnorm(30,2,0.5))),
                          "Linear" = cumsum(abs(rnorm(30,2,0.4))), 
                          "Power" = cumsum(abs(rnorm(30,2,0.1))),
                          "Exp" = cumsum(abs(rnorm(30,2,0.3))))

基础绘图

以时间作为 x 轴,各个模型拟合/预测值作为 y 轴。绘制出不同方法的拟合/预测对比图。

library(ggplot2)
library(tidyverse)
# 基础绘图
cols <- c("black","#85BA8F", "#A3C8DC","#349839","#EA5D2D","#EABB77","#F09594")
p = com_battery %>% pivot_longer(cols = !Time, names_to = "Model", values_to = "Value") %>%
  mutate(Model = factor(Model, levels = c("True", "Proposed", "Linear","Power","Exp"))) %>% 
  ggplot(aes(Time,Value,col = Model,shape = Model)) + 
  geom_line() + geom_point(size=1.5,alpha=0.8) + 
  scale_color_manual(values = cols) +
  theme_bw() + theme(panel.grid = element_blank()) + #,legend.title=element_text(size=12), legend.text=element_text(size=11) +
  xlab("Time") + ylab("Rate(%)")

不同方法的拟合/预测对比图

可以看到,各个方法的拟合/预测结果非常接近。此时,可以通过放大局部细节来突出某个模型的优越性。

ggforce 包

ggforce 包中的 facet_zoom() 可以通过一行代码实现局部细节放大的效果。官网给出了各个参数的细节以及示例。

这里假设我们想对 xlim = c(18, 24),ylim = c(40, 43) 范围内的数据进行放大。只需要使用以下代码即可,其中 zoom.size = 0.4表示放大后的图形大小占比整个图的比例。

library(ggforce) 
p + facet_zoom(xlim = c(18, 24),ylim = c(40, 43), zoom.size = 0.4)

注意:当然还有其他几个参数可以调整,这里不做过多介绍。

如果你觉得这个图已经满足要求,并且美观程度还不错的话。那你就随意使用吧~但对于小编而言,这里的灰色框太奇怪了(不会改😭),而且整个构造也很突兀。

所以小编打算直接基于 ggplot 包的思想自己添加内容,并通过 patchwork 包对图进行合并,复现出类似图一的效果。

patchwork 包

基于 ggplot 包,我们再绘制一幅需要局部放大的图,只需在 xlim()ylim() 上做文章,并去除标签和图例。

ppp = p + xlim(5,10) + ylim(10,20) + theme(legend.position = 'none') +
  xlab("") + ylab("")

之后将该图放到原图的合适位置即可,可以使用 patchwork 包中的 inset_element() 实现该功能。

注意:也可以使用cowplot包进行图形合并。相关推文见:合并多幅图形、利用 cowplot 包快速对齐图片。

library(patchwork)
p + inset_element(ppp, 0.01, 0.6, 0.6, 0.95, on_top = TRUE)

此时,基本完成了我们的要求,接下来进行一些细节处理:添加选择放大位置的框,添加指向箭头,修改图例位置等(注释在代码后)。

p +   
  geom_rect(aes(xmin = 5, xmax = 10, ymin = 10, ymax = 20),
            fill = "transparent", color = "black", alpha = 0, 
            linetype = "dashed", linewidth =0.2) + #添加选择放大位置的框
  theme(legend.position = c(0.9,.2),legend.background = element_rect(fill = 'white', colour = 'black')) + #修改图例位置
  geom_segment(aes(x = 7, xend = 10, y = 20, yend = 38.3), 
               col = "gray60", linewidth =0.2,linetype = "dashed",
               arrow = arrow(length = unit(0.2, "cm"), type = "closed")) + # 添加指向箭头
  inset_element(ppp, 0.01, 0.6, 0.6, 0.95, on_top = TRUE)

小编有话说

  • 模拟数据绘制出的效果可能不是很好,本文主要是给出2种绘制局部细节的方法供大家参考。这是小编平常科研中出现的一种画图需求,防止后续还会使用类似图形,所以在这做个记录也分享给大家。

  • 小编使用过 matlab 进行绘制这种图形,发现 matlab 可以互动式选择放大位置以及展示位置,非常方便。不知道这种功能是否可以借鉴到 R 中?

  • 如果有更好的方法欢迎读者们评论留言。也欢迎大家一键三连~

注意:本文所有代码已经上传至 Github 中,欢迎下载使用。

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

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

相关文章

echarts实现立体柱状图

实现效果图如下&#xff1a; 上面除了立体图之外还增加了背景图。注意&#xff0c;可以发现这个图的右下角是是和x轴平齐的&#xff0c;如果右下角也要折角&#xff0c;可以根据代码修改下描点的点位就可以了。 完整代码如下&#xff1a; <template><div id"ba…

从特斯拉FSD v11.4.6,看FSD入华

从特斯拉FSD v11.4.6&#xff0c;看FSD入华 1. 芝加哥城区a. 亮点b. 问题 2. 小镇中心a. 亮点b. 问题 3. FSD入华a. 技术路线b. 场景 4. 参考视频 FSD最近更新了v11.4.6&#xff0c;本文根据2个FSD城区测试视频&#xff0c;一起看一下有哪些亮点和问题。 FSD入华的消息也甚嚣尘…

HTML5中Canvas学习笔记:Canvas

目录 一、HTML中Canvas画图strokeStyle 和 fillStyle 的区别是什么&#xff1f; 二、如何设置一幅canvas图中某个颜色透明&#xff1f; 三、H5 canvas中strokeRect参数如果是小数&#xff0c;如何处理&#xff1f; 四、H5 Canvas中如何画圆角矩形框&#xff1f; 一、HTML中…

python字符串输入输出与注解

目录 数据输入 前言 数据输出 字符串 字符串的三种定义方法 引号嵌套 字符串的拼接 字符串格式化 拼接字符串缺点 python常用的格式符号 格式化的精度控制 字符串快速格式化 快速格式化特点 对表达式进行格式化 具体案例 字符串的大小比较 字符串比较方式 变…

分类预测 | MATLAB实现WOA鲸鱼算法同步优化特征选择结合支持向量机分类预测

分类预测 | MATLAB实现WOA鲸鱼算法同步优化特征选择结合支持向量机分类预测 目录 分类预测 | MATLAB实现WOA鲸鱼算法同步优化特征选择结合支持向量机分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现WOA鲸鱼算法同步优化特征选择结合支持向量机分类预测…

DASCTF 2023 0X401七月暑期挑战赛 Web方向 EzFlask ez_cms MyPicDisk 详细题解wp

EzFlask 源码直接给了 CtrlU查看带缩进的源码 import uuidfrom flask import Flask, request, session # 导入黑名单列表 from secret import black_list import jsonapp Flask(__name__) # 为 Flask 应用设置一个随机的 secret_key app.secret_key str(uuid.uuid4())# 检查…

epoll、poll、select的原理和区别

select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制&#xff0c;一个进程可以监视多个描述符&#xff0c;一旦某个描述符就绪&#xff08;一般是读就绪或者写就绪&#xff09;&#xff0c;能够通知程序进行相应的读写操作。但select&a…

Android 实现账号诊断动画效果,逐条检测对应的项目

Dialog中的项目 逐条检测效果&#xff1a; 依赖库&#xff1a; implementation com.github.li-xiaojun:XPopup:2.9.19 implementation com.blankj:utilcodex:1.31.1 implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.101、item_account_check.xml <…

【C语言】静态关键字static的用法(详解)

&#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;C语言初阶 ✨其他专栏&#xff1a;代码小游戏 &#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论…

I.MX6ULL_Linux_驱动篇(44)linux MISC驱动

MISC 驱动也叫做杂项驱动&#xff0c;也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动。 MISC 驱动其实就是最简单的字符设备驱动&#xff0c;通常嵌套在 platform 总线驱动中&#xff0c;实现复杂的驱动&#xff0c;本章我们就来学习一下 MISC 驱动的编写…

恺英网络宣布:与华为鸿蒙系统展开合作,将开发多款手游

8月5日消息&#xff0c;恺英网络宣布旗下子公司盛和网络参加了华为开发者大会&#xff08;HDC.Together&#xff09;游戏服务论坛&#xff0c;并在华为鸿蒙生态游戏先锋合作启动仪式上进行了亮相。恺英网络表示&#xff0c;将逐步在HarmonyOS上开发多款游戏&#xff0c;利用Har…

【C++】做一个飞机空战小游戏(五)——getch()控制两个飞机图标移动(控制光标位置)

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…

ffmpeg-ffplay代码架构简述

全局变量 /* Minimum SDL audio buffer size, in samples. */ // 最小音频缓冲 #define SDL_AUDIO_MIN_BUFFER_SIZE 512 /* Calculate actual buffer size keeping in mind not cause too frequent audio callbacks */ // 计算实际音频缓冲大小&#xff0c;并不需要太频繁…

c语言基础知识帮助理解(详解数组)

前面梳理完函数和递归的知识后&#xff0c;来进行数组知识的梳理 对函数有疑惑的同学&#xff0c;可以看我之前的文章&#xff1a;c语言基础知识帮助理解&#xff08;详解函数&#xff09;_总之就是非常唔姆的博客-CSDN博客 c语言基础知识帮助理解&#xff08;函数递归详解&am…

类的6个默认成员函数 构造函数

类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生…

ruoyi-cloud-notes01

1、Maven中的dependencyManagement Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息&#xff0c;那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找…

HCIP MPLS总结

一、MPLS--多协议标签交换 多协议&#xff1a;可以基于多种不同的3层协议来生成2.5层的标签信息&#xff1b; 包交换&#xff1a;包为网络层的PDU&#xff0c;故包交换是基于IP地址进行数据转发&#xff1b;就是路由器的路由行为&#xff1b; 原始的包交换&#xff1a;数据包…

STM32 CubeMX USB_CDC(USB_转串口)

STM32 CubeMX STM32 CubeMX 定时器&#xff08;普通模式和PWM模式&#xff09; STM32 CubeMX一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择 二、代码部分添加代码实验效果 ![请添加图片描述](https://img-blog.csdnimg.cn/a7333bba478441ab950a66fc63f204fb.png)printf发…

分库分表概念、原理、拆分策略和实现技术讲解

文章目录 1.什么是分库分表2.分库分表拆分策略2.1 垂直拆分2.2 水平拆分 3.分库分表实现技术简介 1.什么是分库分表 分库分表的中心思想就是将数据分散存储&#xff0c;使得单一数据库/表的数据量变小来缓解单一数据库的性能问题&#xff0c;从而达到提升数据库性能的目的。 …