写在前面
前一段时间看到有推送说一个哈佛大学的小哥设计了一套适合于sci论文的matplotlib模板,使用这些模板直接可以绘制出sci风格的图表,所以自己试了一下,感觉还不错!
其实我们大多数人写论文的时候都会遇到需要做图的情况,如果使用Python绘制这些图像基本都是绕不开matplotlib这个库的,这个库的名字也是来源于MATLAB语言,这意味着可能用MATLAB绘制图像也是这个风格的,距离科研论文的图像总是觉得差了些什么。而origin、SPSS这些软件需要购买,破解软件装起来也麻烦,而且软件本身很重,用于普通的做图总是觉得会有一些麻烦。
B站上面的一个博主“毕导”有一期视频讲如何写毕业论文的时候说过这么一句话,论文的图像的审美标准只有一个字——丑。而我们使用matplotlib绘图时,虽然已经很丑了,但是还是丑的差了点什么。这个模板就可以很有效的节省我们“美化”图片时的调整时间。
闲话少说开始今天的正文。
安装
方法一
首先这个项目已经开源到github上面了,地址是这里,里面详细介绍了如何装这个库以及如何使用。安装其实很简单哈,就是一行命令就可以了:
pip install git+https://github.com/garrettj403/SciencePlots.git
但是呢,我没有这么干。为什么呢?因为我们都知道,github最大的特点就是——慢!下载一个东西真的比龟速还要龟速。那有什么解决办法吗,我们中国版的github,码云(注意不是马云)很好的帮我们解决了这个问题。我们只需要在码云里面点击“从github导入仓库
然后把刚才复制的连接复制进去点确定就可以自动将github上面的仓库导入到码云上面了
之后我们再用git去安装就会快很多
pip install git+你的项目码云地址
方法二
当然上面一种方法是可以的,不过我本人是用的第二种方法:
首先按照上面的步骤,把github上面的仓库导入到码云上。
之后直接git clone 项目码云地址
把整个仓库下载下来
然后新建一个python文件,运行下面的代码:
import matplotlib as mpl
print(mpl.get_configdir())
这样就可以看到你的matplotlib目录了,基本上都是当前用户文件夹下的.matplotlib文件夹,比如说Mac用户就是/Users/用户名/.matplotlib
然后打开那个文件夹,你就可以看到这个stylelib文件夹了(如果没有的话就自己新建一个)
然后把我们git clone下来的文件夹里面的所有.style,像我这样
这样我们就算安装完了
使用
安装完了我们当然是要迫不及待的试一下了!
github的文档里写的很清楚怎么用这个style
你可以这样:
import matplotlib.pyplot as plt
plt.style.use(['science','ieee'])
也可以这样
with plt.style.context(['science', 'ieee']):
plt.figure()
plt.plot(x, y)
plt.show()
这个时候我们就可以用官方事例中的一部分来实验一下了:
import numpy as np
from matplotlib import pyplot as plt
def model(x, p):
return x ** (2 * p + 1) / (1 + x ** (2 * p))
x = np.linspace(0.75, 1.25, 201)
with plt.style.context(['science']):
fig, ax = plt.subplots()
for p in [10, 15, 20, 30, 50, 100]:
ax.plot(x, model(x, p), label=p)
ax.legend(title='Order')
ax.set(xlabel='Voltage (mV)')
ax.set(ylabel='Current ($\mu$A)')
ax.autoscale(tight=True)
fig.savefig('figures/fig1.pdf')
fig.savefig('figures/fig1.jpg', dpi=300)
好的,运行之后,我们回看到这个错误:
RuntimeError: Failed to process string with tex because latex could not be found
意思是什么呢?latex找不到。latex在前面的推送中有提到过,这是一种论文的排版语言。当然你一定会想到,那我pip install latex
不就行了吗,我自己当然也试过了!可是依然会报这个错误
这个时候我就有一点心态崩了,百度了一下说不是说你的Python没有安装latex,而是你的电脑环境里没有latex。这就很搞笑了,难道我为了画个图还要千辛万苦的安装latex?所以我给这个github写了一个issue说了这个问题
这个作者回复的非常快,不过情况有点尴尬:
大概意思就是说,这个问题我已经在FAQ(问答系统)里面回答过了,你能不能先看看啊!这就很尴尬,这件事情告诉我们,给github留言之前,一定要先看看你要问的有没有在FAQ里面已经出现过了,不然很容易被作者骂。
怎么解决这个问题呢?其实很简单,我们在style里面加一个no-latex就可以了,像这样:
import numpy as np
from matplotlib import pyplot as plt
def model(x, p):
return x ** (2 * p + 1) / (1 + x ** (2 * p))
x = np.linspace(0.75, 1.25, 201)
with plt.style.context(['science', 'no-latex']):
fig, ax = plt.subplots()
for p in [10, 15, 20, 30, 50, 100]:
ax.plot(x, model(x, p), label=p)
ax.legend(title='Order')
ax.set(xlabel='Voltage (mV)')
ax.set(ylabel='Current ($\mu$A)')
ax.autoscale(tight=True)
fig.savefig('figures/fig1.pdf')
fig.savefig('figures/fig1.jpg', dpi=300)
执行这个代码,我们就可以顺理成章的拿到我们想要的结果了:
是不是特别的SCI!!
我们来对比一下加style和不加的区别:
我们可以看到变化是非常明显的,首先最明显的区别在于字体,这个style将字体设置为了论文中常用的Times New Roman,并且字号有了很大的提高,并且进行了加粗。
在图形这边,首先线条的颜色饱和度变得更高了,而且添加了横纵坐标的刻度。总理来说,非常符合论文图标的审美哈哈哈,就是那种,画出来就很SCI的感觉
注意事项
在使用matplotlib时我们经常需要使用中文,但是很遗憾哈,因为这个style是配置好了字体的,所以我们不能再自己去配置中文字体了。所以这个还是比较适合发英文论文的哈
写在最后
Python目前已经成为了一种比较常用的数据分析工具,这些style其实看起来没有那么高级,只是帮我们做了调节图像颜色配置等等的工作,真正的重点还是我们怎么去总计分析数据,如何去绘图,而调整图表只是数据分析中的一小部分罢了。