使用Python轻松实现科研绘图

本文将学习使用scienceplotsmatplotlib轻松创建科学绘图,仅用几行Python代码即可即时转换Matplotlib图形。

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

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

Python在科学界广泛使用,并提供了创建科学绘图的好方法。然而,当使用Python中最流行的绘图库之一matplotlib时,默认的图表质量较差,需要进行调整以确保满足要求。

【scienceplots】:https://github.com/garrettj403/SciencePlots

更改matplotlib图形的样式可能非常耗时,这就是scienceplots库派上用场的地方。只需几行代码,就可以立即改变图形的外观,而无需花费太多时间来研究如何更改图形的不同部分。

scienceplots该库允许用户创建简单、信息丰富的图表,类似于学术期刊和研究论文中的图表。不仅如此,它还将所需的DPI设置为600(对于某些样式),这通常是出版物的要求,以确保打印出高质量的印刷图形。

scienceplots库包含多种样式,包括对多种语言的支持,包括中文和日文等。可以通过下面的链接探索scienceplots库中的全部样式。

【Gallery】:https://github.com/garrettj403/SciencePlots/wiki/Gallery

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

一、设置scienceplots

在使用scienceplots库创建绘图之前,需要确保计算机上安装了LaTeX。LaTeX是一种排版系统,专为创建技术和科学文档而设计。

【LaTeX】:https://www.latex-project.org/

如果你的计算机上尚未安装LaTeX,可以在如下两个链接中找到有关LaTeX以及如何安装它的更多详细信息。

【链接1】:https://www.latex-project.org/get/

【链接2】:https://github.com/garrettj403/SciencePlots/wiki/FAQ

如果正在使用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

二、创建用于绘图的虚拟数据

在生成一些图表之前,首先需要创建一些样本数据。我们将在本文的后面部分展示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中),就可以开始创建绘图了。

三、使用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和大小)以及样式可能并不完全适合在期刊中发表。

四、应用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折线图。

五、使用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并为数据集添加透明度后的伽马射线测量值的直方图。

在这个图形中,可以看到两个数据集的条形的变化。

建议检查所需发表的期刊的样式指南,以确保使用透明度是可接受的。在大多数情况下,应该是可以的,但最好进行确认。

六、应用Science Plots到Seaborn图形

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

【Seaborn】:https://seaborn.pydata.org/

在创建图形时,有时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库,可以实现大部分需求。另外,建议查看所选择期刊的作者工具包,以确保创建的图形符合要求的标准。

本教程使用的数据集

这个数据集是由Xeek和FORCE 2020(Bormann等人,2020)举办的机器学习竞赛的一部分。该数据集根据Creative Commons Attribution 4.0 International获得许可。

完整的数据集可以通过以下链接访问:https://zenodo.org/record/4351156

推荐书单

IT BOOK 多得(点击查看5折活动书单)icon-default.png?t=N7T8https://u.jd.com/psx2y1M

《Python从入门到精通(第3版)》

《Python从入门到精通(第3版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Python进行程序开发应该掌握的各方面技术。全书共分27章,包括初识Python、Python语言基础、运算符与表达式、流程控制语句、列表和元组、字典和集合、字符串、Python中使用正则表达式、函数、面向对象程序设计、模块、文件及目录操作、操作数据库、使用进程和线程、网络编程、异常处理及程序调试、Pygame游戏编程、推箱子游戏、网络爬虫开发、火车票分析助手、数据可视化、京东电商销售数据分析与预测、Web编程、Flask框架、e起去旅行网站、Python自动化办公、AI图像识别工具等内容。书中所有知识都结合具体实例进行介绍,涉及的程序代码都给出了详细的注释,读者可轻松领会Python程序开发的精髓,快速提升开发技能。

《Python从入门到精通(第3版)》icon-default.png?t=N7T8https://item.jd.com/14055900.html

精彩回顾

《使用Python内置模块加速SQL查询》

《5个用于地理空间数据分析的Python包》

《预测未来,Python中的时间序列分析模型ARIMA》

《3步掌握Python中的正则表达式》

《基于功夫熊猫实例探索Python风格像素游戏》

《8个有趣实用的Python脚本》

微信搜索关注《Python学研大本营》,加入读者群

访问【IT今日热榜】,发现每日技术热点

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值