使用Python轻松实现科研绘图

当撰写在学术期刊上发表的文章时,图表的布局和风格应符合预定义的格式要求。这样可以确保该出版物的所有文章都具有一致的风格,并且任何包含的图表在打印时都是高质量的。

Python在科学界广泛使用,并提供了创建科学绘图的好方法。然而,当使用Python中最流行的绘图库之一matplotlib时,默认的图表质量较差,需要进行调整以确保满足要求。更改matplotlib图形的样式可能非常耗时,这就是scienceplots库派上用场的地方。只需几行代码,就可以立即改变图形的外观,而无需花费太多时间来研究如何更改图形的不同部分。

scienceplots该库允许用户创建简单、信息丰富的图表,类似于学术期刊和研究论文中的图表。不仅如此,它还将所需的DPI设置为600(对于某些样式),这通常是出版物的要求,以确保打印出高质量的印刷图形。scienceplots库包含多种样式,包括对多种语言的支持,包括中文和日文等。可以通过下面的链接探索scienceplots库中的全部样式。

本文将探讨如何将一些基本和常见的数据可视化转换为可以包含在科学出版物中的形式。

1.设置scienceplots

在使用scienceplots库创建绘图之前,需要确保计算机上安装了LaTeX。LaTeX是一种排版系统,专为创建技术和科学文档而设计。如果正在使用Google Colab,则可以在单元格中运行以下代码来安装LaTeX。

!sudo apt-get install dvipng texlive-latex-extra texlive-fonts-recommended texlive-latex-recommended cm-super

在设置好LaTeX之后,可以使用pip安装scienceplots库:

pip install SciencePlots

在选择的平台上安装了库和LaTeX之后,就可以导入scienceplots库以及matplotlib

import scienceplots
import matplotlib.pyplot as plt

2.创建用于绘图的虚拟数据

在生成一些图表之前,首先需要创建一些样本数据。我们将在本文的后面部分展示scienceplots库如何处理现实世界的数据。

对于本文的这一部分,现在将使用np.linspace创建一些线性间隔的值,然后对该数据进行一些随机的数学计算。

# 生成x值
x = np.linspace(0, 10, 20)

# 生成带有随机噪声的y值
y = np.sin(x)
y2 = np.cos(x)
y3 = y2 * 1.5

一旦创建了数据(或者如果从csv文件中加载数据,则将其加载到pandas中),就可以开始创建绘图了。

3.使用Matplotlib创建带有标记的折线图

我们将首先处理的是折线图。可以通过使用matplotlib.plot()函数并传入xy参数的必需数据来轻松创建此图表。由于我们处理的是从方程中派生的变量,因此有时将这些变量包含在图例中对于读者理解它们可能很方便。

Matplotlib的一个好处是我们可以使用LaTeX方程作为标签。我们只需要用美元符号($)将方程括起来即可。如下是使用scienceplotsmatplotlib创建带有标签的折线图的示例代码:

plt.figure(figsize = (6,6))
plt.plot(x, y, marker='o', label='$y=sin(x)$')
plt.plot(x, y2, marker='o', label='$y=cos(x)$')
plt.plot(x, y3, marker='o', label='$y=y2*1.5$')

plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

当运行上述代码时,会得到以下带有标准颜色的基本Matplotlib图像:

图片

应用scienceplots之前的基本Matplotlib折线图

尽管上图看起来可用,但它的质量(dpi和大小)以及样式可能并不完全适合在期刊中发表。

4.应用SciencePlots样式到线型图

要立即转换图像,可以添加一行代码:使用with语句,调用Matplotlib的style.context函数,并允许传入SciencePlots提供的众多可用样式之一。

with plt.style.context(['science', 'high-vis']):
    plt.figure(figsize = (6,6))
    plt.plot(x, y, marker='o', label='$y=sin(x)$')
    plt.plot(x, y2, marker='o', label='$y=cos(x)$')
    plt.plot(x, y3, marker='o', label='$y=y2*1.5$')
    plt.xlabel('X Variable (mm)')
    plt.ylabel('Y Variable')
    plt.legend()
    plt.show()

当运行上述代码时,将得到以下更适合于期刊发表的绘图。

应用scienceplots样式后的Matplotlib折线图

该图形简洁(即没有多余的图表元素),并且很容易区分不同的线条。此外,在Jupyter Notebook中查看此图形时,它可能会显示得非常大,即使我们设置了相对较小的图形尺寸。这是因为图形的DPI被设置为600,这通常是许多出版物的要求,并确保图形尽可能清晰。

然后尝试应用另一种样式。这次将使用电气和电子工程师学会(IEEE)的样式。要做到这一点,只需要将high-vis替换为ieee即可改变样式。

with plt.style.context(['science', 'ieee']):
    plt.figure(figsize = (6,6))
    plt.plot(x, y, marker='o', label='$y=sin(x)$')
    plt.plot(x, y2, marker='o', label='$y=cos(x)$')
    plt.plot(x, y3, marker='o', label='$y=y2*1.5$')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.legend()
    plt.show()

当运行上述代码时,将得到以下使用IEEE推荐样式的绘图:

图片

应用scienceplots IEEE风格后的Matplotlib折线图

5.使用SciencePlots绘制直方图

在前面的示例中探讨了如何将样式应用于线型图,也可以将相同的样式应用于其他类型的绘图,接下来尝试如何将这种样式应用于直方图。

首先,使用以下代码创建一个Matplotlib图形,使用一些射线(地质形态的自然放射性测量)数据。为了显示第二个数据集,本文将同样的数据向右调整了20个API单位。

plt.figure(figsize = (6,6))
plt.hist(df['GR'], bins=100, label='GR1', alpha =0.5)
plt.hist(df['GR']+20, bins=100, label='GR2', alpha=0.5)
plt.xlim(0, 150)
plt.xlabel('Gamma Ray')
plt.ylabel('Frequency')
plt.legend()
plt.show()

当运行上面的代码时,将得到以下图形:

图片

射线测量的简单Matplotlib直方图

可以注意到它使用了Matplotlib的标准样式,并且看起来非常基础,两个数据集互相重叠,这导致一些信息被隐藏。现在查看一下IEEE样式如何改变这种情况:

with plt.style.context(['science', 'ieee']):
    plt.figure(figsize = (6,6))
    plt.hist(df['GR'], bins=100, label='GR1')
    plt.hist(df['GR']+20, bins=100, label='GR2')
    plt.xlim(0, 150)
    plt.xlabel('Gamma Ray')
    plt.ylabel('Frequency')
    plt.legend()
    plt.show()

当运行上述代码时,将得到以下使用IEEE样式的图形。然而,第二个射线数据集仍然遮挡了第一个数据集。

应用scienceplots IEEE样式后的射线测量的Matplotlib直方图

我们对SciencePlots库能够处理任何重叠并自动应用透明度抱有过高的期望,为此需要付出一点努力,需要为每个数据集添加alpha参数即可。

with plt.style.context(['science', 'ieee']):
    plt.figure(figsize = (6,6))
    plt.hist(df['GR'], bins=100, label='GR1', alpha=0.5)
    plt.hist(df['GR']+20, bins=100, label='GR2', alpha=0.5)
    plt.xlim(0, 150)
    plt.xlabel('Gamma Ray')
    plt.ylabel('Frequency')
    plt.legend()
    plt.show()

当运行带有alpha更改的上述代码时,将得到以下图形:

图片

应用scienceplots并为数据集添加透明度后的射线测量值的直方图

在这个图形中,可以看到两个数据集的条形的变化,建议检查所需发表的期刊的样式指南,以确保使用透明度是可接受的。

6.应用Science Plots到Seaborn图形

不仅可以将scienceplots库中的样式应用于matplotlib图形,还可以将其应用于Seaborn图形。这是因为Seaborn基于matplotlib代码开发

在创建图形时,有时Seaborn提供了比matplotlib更简单的绘图方式。例如,当有一个基于文本的分类变量时,我们希望能够绘制该变量,而不必为每个类别添加单独的散点图。

在这个例子中,有一些中子孔隙度和堆积密度数据,这是常见的测井测量。对于每个测量,还有一个岩性类别,这个数据集来源于Force 2020 Xeek机器学习竞赛数据集。

首先,需要在笔记本中导入seaborn:

import seaborn as sns

导入seaborn库后,可以使用以下代码创建散点图。

plt.figure(figsize=(6, 6))
sns.scatterplot(data=df, x='NPHI', 
                y='RHOB', hue='LITH', s=10)

plt.ylabel('Bulk Density (RHOB) - g/cc')
plt.xlabel('Neutron Porosity (NPHI) - dec')
plt.ylim(2.8, 1.4)
plt.show()

当运行上面的代码时,会得到以下数据按不同岩性着色的散点图:

图片

使用Seaborn生成的基本中子-密度交叉图

还需要确保样式适合预期的期刊,并且颜色对所有读者都可访问和使用。要应用scienceplots样式,可以使用与之前相同的语法:

with plt.style.context(['science', 'ieee']):
    plt.figure(figsize=(10, 8))
    sns.scatterplot(data=df, x='NPHI', y='RHOB', hue='LITH', s=10)
    plt.ylim(2.8, 1.4)
    plt.title('RHOB vs NPHI Crossplot')
    plt.show()

当运行上面的代码时,会得到以下具有改进样式的图,包括新的调色板。

图片

Seaborn散点图,使用scienceplots样式显示堆积密度与中子孔隙度,按岩性变化着色

选择图形的调色板可能会很棘手且耗时,然而它可以使图形对具有视觉问题的读者更易访问和理解。此外,一些颜色在黑白打印时可能不容易区分,可以考虑为不同类别分配不同的形状,这对于从实验室过程中获得的小型数据集中尤为重要。

综上,本文探讨了如何快速将基本的matplotlib图形转化为可以轻松添加到科学出版文章中的形式。这些图形可能仍然需要进一步调整,但通过使用scienceplots库,可以实现大部分需求。另外,建议查看所选择期刊的作者工具包,以确保创建的图形符合要求的标准。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初始化后执行kubectl get nodes报错:The connection to the server localhost:8080

K8S初始化后,worker节点加了master节点,在master执行kubectl get nodes 报错,这个原因看是路径的问题导致 [rootk8s-master01 ~]# kubectl get nodes E1114 16:28:52.032089 2254 memcache.go:265] couldnt get current server API group…

使用Docker本地安装部署Drawio绘图工具并实现公网访问

目录 前言 1. 使用Docker本地部署Drawio 2. 安装cpolar内网穿透工具 3. 配置Draw.io公网访问地址 4. 公网远程访问Draw.io 前言 提到流程图,大家第一时间可能会想到Visio,不可否认,VIsio确实是功能强大,但是软件为收费&…

Java封装一个根据指定的字段来获取子集的工具类

工具类 ZhLambdaUtils SuppressWarnings("all") public class ZhLambdaUtils {/*** METHOD_NAME*/private static final String METHOD_NAME "writeReplace";/*** 获取到lambda参数的方法名称** param <T> parameter* param function functi…

【LeetCode】挑战100天 Day11(热题+面试经典150题)

【LeetCode】挑战100天 Day11&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-132.1 题目2.2 题解 三、面试经典 150 题-133.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…

Mybatis中limit用法补充

limit a,b a是从第a1条数据开始&#xff0c;b是指读取几条数据 例如&#xff1a;select * from table limit 0,10 这句sql语句是说从表中获取第1条开始的10条记录 前端将page:页码    pageSize:每页多少条    这两个参数&#xff0c;传到后台。    通过这两个参数&am…

实力爆发 | 国民品牌大运新能源亮相广州车展

2023第二十一届广州国际汽车展览会将于11月17日至26日在广州琶洲广交会展馆拉开大幕&#xff0c;本届广州车展以“新科技新生活”为主题&#xff0c;将汇集国内外车企的多款重磅新车及前沿新能源出行技术。 &#xff08;2023广州国际汽车展览会&#xff09; 随着环保意识的提高…

个人类型小程序已支持申请微信认证

小程序申请微信认证 政府、媒体、其他组织类型账号&#xff0c;必须通过微信认证验证主体身份。企业类型账号&#xff0c;可以根据需要确定是否申请微信认证。已认证账号可使用微信支付权限。 个人类型小程序已支持微信认证&#xff08;审核大约需要1-3个工作日&#xff09; …

Unity中Shader的矩阵加减法

文章目录 前言一、什么是矩阵矩阵就是一组数的阵列 二、矩阵的加法三、矩阵的负值四、矩阵的减法五、矩阵的表示 前言 Unity中Shader用到的矩阵加减法&#xff0c;以及矩阵的一些基础常识 一、什么是矩阵 矩阵就是一组数的阵列 1 2 3 4 5 6 二、矩阵的加法 两个矩阵相加就是…

专题解读|Graph Fairness代表性工作介绍

1. 图上的公平性问题 图在现实世界中无处不在&#xff0c;例如知识图谱&#xff0c;社交网络和生物网络。近年来&#xff0c;图神经网络( graph neural networks&#xff0c;GNNs ) 在图结构数据建模方面表现出了强大的能力。一般地&#xff0c;GNNs采用消息传递机制&#xff…

SOME/IP学习笔记3

目录 1.SOMEIP Transformer 1.1 SOME/IP on-wire format 1.2 协议指定 2. SOMEIP TP 2.1 SOME/IP TP Header 3.小结 1.SOMEIP Transformer 根据autosar CP 相关规范&#xff0c;SOME/IP Transformer主要用于将SOME/IP格式的数据序列化&#xff0c;相当于一个转换器。总体…

Cesium 展示——绘制圆的几种方式

文章目录 需求分析需求 总结绘制圆的几种方式 分析 使用圆形几何体(CircleGeometry):var circle = viewer.entities.add({position: Cesium.Cartesian3.fromDegrees

七个合法学习黑客技术的网站,让你从萌新成为大佬

大家好我是若风&#xff0c;一个8年网络安全攻防经验的白帽黑客。 合法的学习网站&#xff0c;以下这些网站&#xff0c;虽说不上全方位的满足你的需求&#xff0c;但是大部分也都能。能带你了解到黑客有关的技术&#xff0c;视频&#xff0c;电子书&#xff0c;实践&#xff0…

Git 安装配置

目录 Linux 平台上安装 Debian/Ubuntu Centos/RedHat 源码安装 Windows 平台上安装 Mac 平台上安装 Git 配置 用户信息 文本编辑器 差异分析工具 查看配置信息 在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。 Git …

AR人脸道具SDK,打造极致用户体验

为了满足企业在AR领域的应用需求&#xff0c;美摄科技推出了一款领先的AR人脸道具SDK&#xff0c;旨在帮助企业快速、高效地开发出具有丰富玩法体验的AR应用&#xff0c;从而提升企业的竞争力和市场份额。 一、丰富的AR人脸道具&#xff0c;满足多样化需求 美摄科技AR人脸道具…

【Python图像超分】Real-ESRGAN图像超分模型(超分辨率重建)详细安装和使用教程

1 前言 图像超分是一种图像处理技术&#xff0c;旨在提高图像的分辨率&#xff0c;使其具有更高的清晰度和细节。这一技术通常用于图像重建、图像恢复、图像增强等领域&#xff0c;可以帮助我们更好地理解和利用图像信息。图像超分技术可以通过多种方法实现&#xff0c;包括插值…

ebSocket connection to ‘wss://xxx.xxxxxxx.xxx/‘ failed:

目录 1&#xff1a;网络连接问题&#xff1a;检查您是否已连接到互联网&#xff0c;您的网络是否稳定。您还可以尝试重置您的Internet连接或切换到另一个网络。 排除方法&#xff1a;直接打开个网址就知道了&#xff0c;这应该不用教了吧 2&#xff1a;防火墙或代理设置&…

Postgresql数据类型-数据类型转换

PostgreSQL数据类型转换主要有三种方式&#xff1a;通过格式化函数、CAST函数、::操作符&#xff0c;下面分别介绍。 通过格式化函数进行转换 PostgreSQL提供一系列函数用于数据类型转换&#xff0c;如表所示。 通过CAST函数进行转换将varchar字符类型转换成text类型&#xf…

JavaScript基础入门05

目录 1.操作结点 1.1新增节点 1.1.1. 创建元素节点 1.1.2. 插入节点到 dom 树中 1.2删除节点 2.代码案例: 猜数字 2.1预期效果 2.2代码实现 3.代码案例: 表白墙 3.1预期效果 3.2创建页面布局 3.3调整样式 3.4实现提交 3.5实现点击按钮的动画效果 4.代码案例: 待办…

简单描述下微信小程序的相关文件以及类型?

目录 前言 相关文件类型 1. JSON 配置文件 2. WXML 文件 3. WXSS 文件 4. JavaScript 文件 图片、音频、视频等资源文件 小程序配置文件&#xff08;project.config.json&#xff09; 理解 优缺点 优点&#xff1a; 缺点&#xff1a; 总结 结尾 前言 微信小程序…

Live800:高效工作,客服人必学的10种时间效率管理术

客服人员是企业与客户沟通的桥梁&#xff0c;需要在繁忙的工作环节中保持高效率。只有提高时间效率才能更好地服务客户&#xff0c;满足客户的需求&#xff0c;提升客户满意度。因此&#xff0c;客服人员需要掌握时间效率管理术来提高工作效率。 1、制定工作计划 在开始工作之…