python - 科研文献作图复现1

news2024/11/15 23:52:51

记录阅读文献过程中,通过python复现原文的一些脚本

  • 想要复现的文章原图如下所示

在这里插入图片描述
原文链接:

  • https://file.scirp.org/Html/4-2430166_82999.htm

首先,对于原图进行简要观察。

  • 这是一张折线图,绘制了6条不同颜色的折线来表示不同变量,横轴的单位统一为时间:月份的英文首字母缩写。比较有意思的是,每个y轴的上限都是不同的,每条曲线对应的标签也是不同的,y轴对应的标签也不同的。同时,每条曲线的y轴将小的间隔也显示出来了。
  • 这里简要分析得到:原文作者可能是将6个子图拼接起来,对于各个子图的边框进行一些调整,使得让人感觉是绘制在一张图上。所以,主要解决6个子图无缝连接的问题就可以还原原图了。
  • 以下是主要复现的point:
    • 多子图上下边界凭借
    • 子图y轴显示为不同位置,原本默认在左侧,需要调制至右侧
    • 子图y轴标签的颜色

这里主要用到两个库: matplotlib(绘图)、numpy(数据),为了减少代码量,这里仅以3个子图举例。

多子图的拼接

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 12, 1) # 横坐标数据为从0到10之间,步长为0.1的等差数组
y = np.sin(x) # 纵坐标数据为 x 对应的 sin(x) 值
plt.rcParams['font.family'] = 'Times New Roman'
fig, axs = plt.subplots(3, 1, sharex=True,dpi=200)
# Remove horizontal space between axes
fig.subplots_adjust(hspace=0.0)

这里,通过调整hspace这个参数就可以实现多子图之间的距离:
hspace=0.0在这里插入图片描述
hspace=0.5
在这里插入图片描述
hspace=-0.5
在这里插入图片描述

调整子图的边框

这里需要将第一个子图的下边框、第二个子图的上下边框、以及第三个子图的上边框设置为不可见:

axs[0].spines['bottom'].set_color('none')
axs[1].spines['bottom'].set_color('none')
axs[1].spines['top'].set_color('none')
axs[2].spines['top'].set_color('none')

在这里插入图片描述
这里加了一点额外的内容,将不同子图y轴以及y轴每个单位对应标签的颜色分别设置为红色、蓝色和黑色:

axs[0].spines.left.set_color('r')
axs[0].spines.right.set_color('r')
axs[1].spines.right.set_color('b')
axs[1].spines.left.set_color('b')

axs[0].tick_params(axis='y',colors='r')
axs[1].tick_params(axis='y',colors='b')
axs[2].tick_params(axis='y',colors='k')

在这里插入图片描述
这里随便绘制三条曲线:

x = np.arange(0, 12, 1) # 横坐标数据为从0到10之间,步长为0.1的等差数组
y = np.sin(x) # 纵坐标数据为 x 对应的 sin(x) 值
axs[0].plot( x,y,'r',label='red')
axs[1].plot(x,-y,'b',label='blue')
axs[2].plot(x,y*y,'k',label='black')

在这里插入图片描述

设置y轴单位的位置为右侧,并设置x轴的单位为月份

这里自定义设置x轴的单位,需要注意一个问题,你x轴的array有12个,你对应的xlabels就得是12个,数量要对的上,不然会报错。(可以用空的' '

axs[1].yaxis.set_ticks_position('right')  # axs[0].yaxis.tick_right()
axs[0].set_xticks(x)
axs[0].set_xticklabels(['J','F','M','A','M','J','J','A','S','O','N','D'],rotation=45)

在这里插入图片描述

添加y轴的label,并设置y轴的label在子图的右侧

axs[0].set_ylabel('fig1_ylabel',c='r')
axs[1].set_ylabel('fig2_ylabel',labelpad=-370,c='b')
axs[2].set_ylabel('fig3_ylabel')

在这里插入图片描述

使各个子图的左右上下的边框的tick对称:

axs[0].tick_params(which='major', 
                    direction='out', 
                    bottom=False, left=True, right=True, top=True)
axs[1].tick_params(which='major', 
                    direction='out', 
                    bottom=False, left=True, right=True, top=False)
axs[2].tick_params(which='major', 
                    direction='out', 
                    bottom=True, left=True, right=True, top=False)

在这里插入图片描述

设置y轴tick的单位间隔,显示最小的单位间隔

from matplotlib.ticker import AutoMinorLocator, MultipleLocator
axs[0].tick_params(which='minor', 
                    direction='out', 
                    colors='r')
for i ,ax in enumerate(axs):
    print(i)
    ax.tick_params(which='both', 
                        direction='out', 
                        left=True, right=True,
                        width=2,
                        )
    ax.yaxis.set_minor_locator(AutoMinorLocator(5))

在这里插入图片描述
最后,将代码封装一下,再加一点其他的:

import matplotlib.pyplot as plt
import numpy as np


def plot_line():
    
    plt.rcParams['font.family'] = 'Times New Roman'
    fig, axs = plt.subplots(3, 1, sharex=True,dpi=200)
    # Remove horizontal space between axes
    fig.subplots_adjust(hspace=0)
    #################################################################################
    ####                            set  spines color
    #################################################################################
    axs[0].spines['bottom'].set_color('none')
    axs[1].spines['bottom'].set_color('none')
    
    axs[1].spines['top'].set_color('none')
    axs[2].spines['top'].set_color('none')
    axs[0].spines.left.set_color('r')
    axs[0].spines.right.set_color('r')
    axs[1].spines.right.set_color('b')
    axs[1].spines.left.set_color('b')
    
    axs[0].tick_params(axis='y',colors='r')
    axs[1].tick_params(axis='y',colors='b')
    axs[2].tick_params(axis='y',colors='k')
    #################################################################################
    ####                             plot line
    #################################################################################
    
    x = np.arange(0, 12, 1) # 横坐标数据为从0到10之间,步长为0.1的等差数组
    y = np.sin(x) # 纵坐标数据为 x 对应的 sin(x) 值
    axs[0].plot( x,y,'r',label='red')
    axs[1].plot(x,-y,'b',label='blue')
    axs[2].plot(x,y*y,'k',label='black')
    #################################################################################
    ####                             set yticks position
    #################################################################################
    axs[1].yaxis.set_ticks_position('right')  # axs[0].yaxis.tick_right()
    axs[0].set_xticks(x)
    axs[0].set_xticklabels(['J','F','M','A','M','J','J','A','S','O','N','D'],rotation=45)
    
    axs[0].set_ylabel('fig1_ylabel',c='r')
    axs[1].set_ylabel('fig2_ylabel',labelpad=-370,c='b')
    axs[2].set_ylabel('fig3_ylabel')
    axs[2].set_xlabel('Time : month')
    
    
    
    axs[0].tick_params(which='major', 
                        direction='out', 
                        bottom=False, left=True, right=True, top=True)
    axs[1].tick_params(which='major', 
                        direction='out', 
                        bottom=False, left=True, right=True, top=False)
    axs[2].tick_params(which='major', 
                        direction='out', 
                        bottom=True, left=True, right=True, top=False)
    
    from matplotlib.ticker import AutoMinorLocator, MultipleLocator
    axs[0].tick_params(which='minor', 
                        direction='out', 
                        colors='r')
    for i ,ax in enumerate(axs):
        print(i)
        ax.tick_params(which='both', 
                            direction='out', 
                            left=True, right=True,
                            width=2,
                            )
        ax.yaxis.set_minor_locator(AutoMinorLocator(5))
        
    fig.legend(['red','blue','black'],ncol=3,
               bbox_to_anchor=(0.56,1),frameon=False)    
    plt.show()
if __name__=='__main__':

    print('drawing ')
    plot_line()
    # if i<2:
        # ax.spines['bottom'].set_color('none')
        # ax.tick_params(which='major',bottom=False)
        # ax.tick_params(axis='y',direction='out',length=4,)
# x = np.random.random(15)
# y = x

# axs[1].axis["right2"] = ax.new_fixed_axis(loc="right", offset=(20, 0))
# axs[1].axis["right2"].label.set_text("Label Y2")

在这里插入图片描述
除了数据的部分,其他都可以通过参数自由调整,总体来说还是

此外,使用 fig.add_axes([])可以更灵活的设置子图的位置,这里就不展示了。代码中许多地方可以更简洁,使用循环或者封装的使得代码更简便,这里仅仅展示最基本的还原过程,欢迎大家分享更好更简单快捷的方法。

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

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

相关文章

舆情监控软件免费下载,TOOM网络舆情监控软件服务流程?

舆情监测可以帮助个人和企业了解自己的网络形象&#xff0c;提高自我评价和评价能力&#xff0c;提升自我定位和竞争力。接下来简单了解舆情监控软件免费下载&#xff0c;TOOM网络舆情监控软件服务流程? 一、舆情监控软件免费下载 请登录TOOM舆情官网获取链接 1.企业客户&a…

SpringMVC(十三):SpringMVC拦截器介绍使用

文章目录 SpringMVC拦截器介绍使用 前言 一、拦截器使用 二、拦截器内容详解 1、preHandle方法 2、postHandle方法 3、afterCompletion方法 三、多个拦截器执行顺序 SpringMVC拦截器介绍使用 前言 在之前的系列文章里&#xff0c;我们学习了过滤器的知识。过滤器的作…

ejs模板在Express框架中的集成

在上一篇内容中已经使用了pug模板&#xff0c;那么本篇就来了解一下ejs模板在Express框架中的集成使用&#xff0c;ejs模板也是常用的模板引擎&#xff0c;支持在标签内直接编写javascript代码&#xff0c;通过javascript代码就能够生成HTML页面的&#xff0c;通过本期对ejs模板…

C++字符串全排列(递归法)和(迭代法)以及next_permutation底层原理详解

目录前言next_permutation的使用实现全排列的两种算法1. 递归法(全排列方便理解记忆的方法&#xff0c;作为备用方法)实现代码(无重复元素情况)有重复元素情况2. 迭代法(next_permutation底层原理)实现代码(有无重复不影响)前言 next_permutation/prev_permutation是C STL中的…

全国青少年软件编程(Python)等级考试一级考试真题2022年12月——持续更新.....

1.关于Python语言的注释,以下选项中描述错误的是?( ) A.Python语言有两种注释方式:单行注释和多行注释 B.Python语言的单行注释以#开头 C.Python多行注释使用###来做为标记 D.注释用于解释代码原理或者用途 正确答案:C 2.下列代码执行后最有可能绘制出的图形是?(…

网络原理(TCP/IP五层协议)(三)

目录4.滑动窗口(效率机制)5.流量控制(安全机制)6.拥塞控制(安全机制)7.延迟应答(效率机制)8.捎带应答(效率机制)9.面向字节流10.TCP的异常处理4.滑动窗口(效率机制) 滑动窗口存在的意义就是在保证可靠性的前提下&#xff0c;尽量提高传输效率。 在这里可以看到&#xff0c;由于…

JSP 学生成绩管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc

一、源码特点 JSP 学生成绩管理系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为SQLServer2008&#x…

layui 富文本layedit编辑、存储和回显

一、创建一个富文本编辑框 先定义一个textarea标签&#xff0c;给定一个id值&#xff0c;向页面引入layedit&#xff0c;然后调用layedit.build(id, options)构建富文本框 //官方给出的模板 <textarea id"demo" style"display: none;"></textar…

Linux的目录相关操作

目录 前言 处理目录的常见命令 cd&#xff08;change directory&#xff0c;切换目录&#xff09; pwd&#xff08;print working directory&#xff0c;显示目前所在的目录&#xff09; mkdir&#xff08;make directory&#xff0c;建立新目录&#xff09; rmdir&#x…

代码随想录算法训练营第十三天 | 第六章二叉树-理论基础,递归遍历,迭代遍历,统一迭代

一、参考资料二叉树理论基础文章讲解&#xff1a;https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 递归遍历题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%8…

Mobilenet v1-v3

MobileNet V1 理解 MobileNetV1的关键是理解深度可分离卷积 深度可分离卷积 Depthwise Separable Conv 深度可分离卷积单通道卷积&#xff08;提取特征&#xff09;逐点卷积&#xff08;增加维度&#xff09; 普通卷积 输入一个 12123 的一个输入特征图&#xff0c;经过256…

微服务/分布式初始

1.单体服务架构的特点 当服务单一、规模小、逻辑简单时&#xff0c;用一个单体服务就挺 单体服务的缺点 复杂程度高。维护成本越来越高&#xff0c;各个模块之间边界模糊&#xff0c;一个模块的改动可能导致整个服务出现问题&#xff0c;一点内存泄漏、一处指针错误就会让整…

汉诺塔+汉诺四塔(C/C++)

目录 汉诺塔 1 简介 2 代码思路 2.1 对于次数的理解 2.2 对于移动的理解 3 代码 4 加深理解 汉诺四塔 1 思路 2 代码 汉诺塔 1 简介 汉诺塔(Tower of Hanoi)&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三…

关于e^x的部分公式和约算方法

常用的几个不等式: ex≥x1e^{x}\geq x1ex≥x1ln⁡x≤x−1\ln x\leq x-1lnx≤x−1ex≥exe^{x} \geq exex≥exex≥1xx22e^x\geq1x\frac{x^2}{2}ex≥1x2x2​ 当x>0时&#xff0c;ex≥ex(x−1)2x2−(e−2)x1e^x\geq ex(x-1)^{2}x^2-(e-2)x1ex≥ex(x−1)2x2−(e−2)x1 上述算式在…

数据库系统概论——函数依赖、码和范式(1NF、2NF、3NF、BCNF)详解

文章目录概念回顾1、函数依赖的定义1.1 平凡函数依赖和非平凡函数依赖1.2 完全函数依赖和部分函数依赖1.3 传递函数依赖2、码2.1 主码和候选码2.1主属性与非主属性2.2 全码2.3 外部码3、范式3.1 第一范式&#xff08;1NF&#xff09;3.2 第二范式&#xff08;2NF&#xff09;3.…

现在的互联网技术,已蜕变成区块链技术,人工智能技术

在互联网的进化过程中&#xff0c;我们看到了互联网技术的不断孪生与蝶变。现在的互联网技术&#xff0c;早已不再是传统意义上的互联网技术&#xff0c;而是蜕变成为了大数据技术&#xff0c;云计算技术&#xff0c;蜕变成为了区块链技术&#xff0c;人工智能技术。这些新的技…

【STM32笔记】HAL库ADC测量精度提高方案(利用内部参考电压VREFINT计算VDDA来提高精度)

【STM32笔记】HAL库ADC测量精度提高方案&#xff08;利用内部参考电压VREFINT计算VDDA来提高精度&#xff09; 多数STM32的MCU 都没有内部基准电压 如L496系列 但在外接VDDA时&#xff08;一般与VCC 3.3V连接&#xff09; 有可能VCC不稳定 导致参考电压不确定 从而使ADC测量不…

深度学习调参炼丹术(总结向)

调参控制变量&#xff0c;每次调一个值。 1.初始化方式&#xff1a;FC/CNN用kaiming uniform或normalize&#xff0c;Emendding选截断normalize 2.activation function&#xff1a;sigmoid(淘汰)、tanh(淘汰)、relu(推荐)、leakey-relu 3.优化器&#xff1a;SGD动量&#xff0…

若依配置教程(三)新建模块

若依模块化管理&#xff0c;使代码更加规范化&#xff0c;方便在不同文件夹下进行修改和开发。 接下来是新建模块的步骤&#xff1a; 文章目录**接下来是新建模块的步骤&#xff1a;**1.创建新的module2.配置pom.xml1.创建新的module 项目上鼠标右击&#xff1a; 然后修改项…

Kettle 实战教程

Kettle 实战教程1.引言....................................................................................81.1 编写目的...........................................................81.2 阅读对象...........................................................91.3 术…