β

零基础用 Python 画图表,让你的论文更美观

少数派 12 阅读

曾经我在高中的时候有一篇数学探索的小作业,其中我需要画出一张比较复杂的函数图。由于 X 和 Y 的坐标轴标签都需要一定的自定义,所以微软 Office 自带的画图工具自然无法满足我的要求。经过一段时间的寻找,我终于找到了最适合自己的工具:那就是用 Python。

用 matplotlib 可以画出这样的图片,这张图的源代码请参考文末

其实,「用 Python」这个说法比较笼统,我们在这篇文章其实是要学习 Python 的一个模组: matplotlib 的简单使用方法。

使用 matplotlib 这个模组,我们就可以摆脱微软 Office 的传统画图方法。以此带来的新画图方法就是通过数学式的方法来画图。更加有用的是, 我们可以方便地自定义图表,画出更好看、更美观的效果。

诚然,使用 matplotlib 画图离不开使用编程语言。但是请务必不要害怕接触编程:画出一个简单的图只需要几行非常简单并且易于理解的代码。画出复杂一些的图片也会有一些常识和修正,不过请放心,本篇文章将不会涉及任何高级编程知识,零基础也能上手。

安装必要的软件

本篇文章中,我们涉及到的软件只有一个免费软件,那就是 Anaconda。你可以在 这个网站 上下载到 Anaconda,软件完全免费,并支持 Windows 和 macOS。如果你有安装 Visual Studio,你可以直接在 Visual Studio 内下载并安装 Anaconda。通常我们会选择 Python 3.6 版本。

安装完成之后,你会在开始菜单中的 Anaconda 文件夹中看到 Spyder 这个应用,我们打开这个应用,迎面而来的就是一个代码编辑器,我们就要在这个代码编辑器内写出所有画图的代码。

编写代码:初步了解 matplotlib

打开 Spyder,我们就会看到屏幕的左边是代码编辑区域,屏幕的左下角则是输出区域。在这个步骤,我们将主要操作屏幕的左边,也就是代码编辑区域,来输入我们画图用到的代码。

导入模组

编辑代码的第一步,就是告诉我们要写的程序要包括什么模组。简单来说我们就是要告诉程序,我们要在程序内包括什么功能。首先我们输入以下代码:

import matplotlib.pyplot as plt
import numpy as np

这两行代码中, import 的意思就是,我们要导入两个模组,一个叫做 matplotlib.pyplot ,还有一个叫做 numpy matplotlib.pyplot 主要负责画图功能。 numpy 则负责高级数学的功能,比如解释正弦、余弦函数,Python 本身是不能通过一句简单的函数来计算某个角度的正弦的,需要外部库来支持。

在这里, as 的意思是定义一个别名。在之后的程序中,当我们需要召唤 matplotlib.pyplot 这个程序的时候,我们只需要打出 plt 即可,而无需再打出原来这么一长串。同理, numpy 在这里也被取了 np 的别名。

开始编写

在以上我们做完程序的铺垫之后,我们就可以正式开始编写画图的代码了。首先,我们要定义 X 的域,添加以下代码表示:

x = np.linspace(-1, 1, 256)

在这行代码中,我们定义了 X 轴的最小值和最大值,括号中第一个数字 -1 是 X 轴的最小值,括号中的第二个数字 1 则是 X 的最大值。 256 则是取样密度,这个参数不用改变。

目前这部分很简单,但是 matplotlib 强大的地方在于可以利用其他的常量来定义边界,请看下面的例子:

x = np.linspace(-np.pi, np.pi, 256)

在这个例子中,这行代码会替换上面那行代码,我们利用了 numpy 模组,使 X 轴的最小值变为 ,而最大值变成了 π ,从而允许我们更直观地画出三角函数的图像。

接下来我们开始定义 Y 轴,假如我们想画出 sin(x) 的图像,我们只需要接着输入:

y = np.sin(x)

在这里, sin 的前面被加了 np. ,是因为 Python 本身不支持正弦函数运算,所以需要注明使用 np 模组才能使用。

又或者,我们想画出平方的图像,我们可以替换上面的代码为:

y = x**2

Python 的四则运算符分别为 + - * / 。平方的运算符则为 ** ,这些运算符是 Python 本身支持的,不需要像前面一样注明使用 np 模组。关于其他需要使用到 numpy 的运算,比如 log、余弦、e 等等,敬请参考 numpy 官方文档

X 和 Y 的定义完成了,接下来,我们开始指令 matplotlib 来画出图像。

画出图像

这步非常简单,只需要在代码的最后添加一行代码:

plt.plot(x, y)

最后,点击工具栏上的绿色箭头,就可以运行这段代码。运行完毕之后,你就可以在右下角的窗口上看到你画出的图像。右键点击图像,即可保存。

进阶使用:了解 matplotlib 的强大

自定义坐标轴

现在我们来开始介绍 matplotlib 最强大的地方:自定义。为什么我们要使用 matplotlib 来画图?就是为了能够自定义图表中的一些元素。在上边的例子中,我们使用了 np.sin() 函数来画出正弦图像。但是,matplotlib 默认为我们使用了数字作为 X 轴的坐标轴,这显然不是最理想的标记方法,那么我们接下来学习怎样自定义 X 轴坐标轴。在 plt.plot(x, y) 前加入以下代码。

plt.xticks([-np.pi, 0, np.pi], ['-π', '0', 'π'])

对于这行代码,可能有一些人会看不明白,别着急,我们一一解释。

首先我们看第一个方括号内的数字 [-np.pi, 0, np.pi] ,这三个数字表示你想在坐标轴内显示的三个数字的真实数值,你可以改变这些数字,但是每个数字必须要以逗号分开,依顺序填写,在这里我们使用了 -π、0 和 π。第二个方括号中, ['-π', '0', 'π'] ,这些值表示了真实显示在图片上的坐标轴文字,这些文字也必须要和第一个方括号内的数字相对应,并且每个值都要在引号内填写(单双引号均可)。

如果你不需要用文字表达而仅仅需要使用简单的数字,则不需要填写第二个方括号。这里我们用 Y 轴举例:

plt.yticks([-1, -0.5, 0, 0.5, 1])

这样,Y 轴就只会显示方括号内的五个数字。

添加标题

添加标题非常简单,只需要加入一行代码,确保代码在 import 语句以下, plt.plot(x, y) 以上:

plt.title("在这里添加你的标题")

添加坐标轴文本

添加坐标轴文本同样也非常简单,加入以下代码,确保代码在 import 语句以下, plt.plot(x, y) 以上:

plt.xlabel("X 坐标轴文本")
plt.ylabel("Y 坐标轴文本")

画出多个函数

如果需要画出多个函数,只需要再定义一个方程,并添加一行 plt.plot 命令即可。复制以下代码到你的编辑器:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-np.pi, np.pi, 256)
y1 = np.sin(x)
y2 = x**2

plt.plot(x, y1)
plt.plot(x, y2)

设置图像风格

matplotlib 还有一个最强大的功能是自定义图像风格:想画出虚线、虚点线、点线,都没问题。我们可以将上面的 plt.plot(x, y1) plt.plot(x, y2) 替换为如下代码:

plt.plot(x, y1, 'b--')
plt.plot(x, y2, 'r-.')

在这两行代码中,我们可以看到 plt.plot 多了第三个参数,第三个参数定义了图像的风格和颜色,如下图所示。

上图中我们可以看到,正弦函数是蓝色,X 平方函数则是红色,这些颜色的配置归功于第三个参数中的第一个字符: b r ,分别表示 blue 和 red。接下来的字符则表示线条的风格, -- -. 分别表示虚线和虚点线。需要注意的是,这里没有严格的顺序,所以即使你写成 --b ,也是没有问题的。

matplotlib 中还有更多的线条风格和颜色,你可以在这个 官方文档 中查看。

设置图像格式以及大小

可能大家已经注意到了:上面我们输出的函数图像,其实是非常不清晰的。那么现在我们来调整图像。确保以下代码位置在 import 语句下第一行。

plt.figure(figsize=(3, 5), dpi=300)

大家应该已经注意到了, plt.figure() 内多了两个参数。其中, figsize 的值定义了图像的大小,第一个数字代表宽度为三英尺,第二个数字代表宽度为五英尺。 dpi 的值则很明显,代表了图像的 DPI。这些值您可以根据自己的实际需求进行修改。

后记:为什么要用 matplotlib?

看完这篇文章,可能会有读者问:「为什么我要费劲去写代码然后画出这些不起眼的图呢?」。其实说到底,这是「学习成本」的问题。对我个人来说,花这些时间学习 matplotlib,对我的未来来说是很有帮助的:对于即将上大学的我,必然会在未来方便我论文的撰写以及图表的绘制。

可能也有一些读者会问:为什么不用其他的软件?一方面是 matplotlib 自定义功能强。另一方面,虽然其他的软件拥有图形化的界面来简化画图的过程,但是我更喜欢用代码来解决问题,算是我个人的小癖好之一。

请在 这里 查看第一张图的源代码。

更多 matplotlib 的例子


作者:少数派
少数派发现优质应用、游戏与设备周边,撰写客观深度的评测,制作实用易懂的教程,以少数人的力量,改变多数人的数字生活。
原文地址:零基础用 Python 画图表,让你的论文更美观, 感谢原作者分享。

发表评论