继续继续来、如题目、对文章的学习后的实践敲着消化一下、截图为实现显示效果、如果没问题做出效果的都po出来 共同学习进步记录一下、避免踩坑。做完一个内容后、会将用到的实现的代码文件放在最后。(偶尔我会忘记放)
Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表。本文翻译自Jupyter nbviewer中的第四讲,主要介绍了绘制2D图像的相关信息,图像的位置、大小,曲线的样式、宽度,坐标轴的刻度、数值、标签,以及图例、标题参数的设置,还包括各种类型的图像的绘制,如柱状图、色图、等高线图等等。作为延伸,又介绍了3D曲线图、框线图和投影图,以及动图的制作。最后作为了解,介绍了后端以及图片视频格式的相关内容。
作者:J.R. Johansson (邮箱:[email protected])
最新版本的用法介绍见网站http://github.com/jrjohansson/scientific-python-lectures. 其他相关介绍见http://jrjohansson.github.io.
# 利用matplotlib生成的图像嵌入notebook中,而不用每次生成图像时打开一个新的窗口,
# 后面会再次提到它的用法。如果你在使用旧版本的Python,请运行 ‘%pylab inline’,如新版本,则输入
%matplotlib inline
Matplotlib是一个绘制2D和3D科学图像的库,它包含了以下的优点:
Matplotlib最重要的一个特点,也是它作出的图像非常适合作为科学出版物的原因,是因为图像可以完全被程序所控制。这一点对于图像重现非常重要,同时为更新数据后重新作图以及改变图像形状提供了方便。更多关于Matplotlib网页请见http://matplotlib.org/
在Python中调用Matplotlib函数包有两种方法,一种是在pylab模式中包含一个星号(简单的方法)
from pylab import *
另一种是在matplotlib.pyplot模式下使用plt(整洁的方法):
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
学习用matplotlib绘制图像最简单的方法使用matplotlib自身提供的类似MATLAB的API。它和MATLAB绘制图像的函数非常相近,所以熟悉MATLAB的用户可以非常容易的上手。采用在pylab模式中包含星号的方式可以使用matplotlib中的API:
from pylab import *
采用一个类似MATLAB作图的API,能够做出以下简单的图像:
MATLAB中大多数绘图相关的函数都能在pylab模式下实现。例如将多个图像绘制在一个窗口中,以及选择颜色和线条类型:
pylab这种MATLAB格式的API有一个优点,对于MATLAB熟悉的用户能够非常容易上手,而且对于绘制简单图像而言不需要花费很多精力去学习。
然而,对于并不是特别简单的图像,并不推荐使用MATLAB类似的API,学习使用matplotlib面向对象的绘图API是一种更好更强大的方法。对于多个复杂图像绘制在一个窗口中,插入图像和加入其它成分这样的复杂操作,matplotlib的API能够很好的解决。
面向对象的程序的主要思路是让用户能够面向对象来使用函数和进行操作,而不是像MATLAB类似的API一样采用全局的程序状态。Matplotlib的优势在绘制多个图像或者一个图像窗口中包含多个子图像的时候能够彰显出来。
我们这次采用面向对象的API来绘制和前一个例子相似的图像,但是这次我们存储一个引用在新创建的fig变量的图像中,而并不直接创建一个全局的图像,然后我们创建一个新的坐标轴图像axes(采用Figure函数族中的add_axes方法):
尽管代码看起来多了一点,但是我们现在能够完全掌控图像的坐标轴位置,并且能够在图像上轻易增加多个坐标轴:
仔细敲敲、代码上还是一样的、多敲多记一下加深记忆。
如果我们并不关心坐标轴的位置是否要明确处于画图窗口的哪个位置,我们可以采用matplotlib布局工具中的一个,例如subplots,用法如下:
代码上还是差不多的、先掌握熟练的来。
这样的代码很简单,但是如果坐标轴或者标签重合在一起,就显得不太美观了。
我们可以采用fig.tight_layout方法来解决这个问题,它能够更自动调整坐标轴在图像窗口的位置,从而避免重合的发生:
Matplotlib在绘制Figure对象时,允许用户确定图像纵横比、图像精度和大小,采用figsize和dpi关键字参数。figsize是关于图像宽度和高度(单位:英寸)的元组型变量,dpi是每英寸点数(像素)。为创建一个800×400像素,每英寸点数为100的图像,代码如下:
fig = plt.figure(figsize=(8,4), dpi=100)
同样的操作可以在布局工具中运行,例如subplots函数:
Matplotlib可以产生各种高质量的输出格式,包括PNG,JPG,EPS,SVG,PGF和PDF。在学术论文中,如果可以的话推荐使用PDF格式(LaTeX文件编译pdflatex可以采用includegraphics来编译PDF)。在一些情况下,PGF格式也是一种好的选择。
既然我们已经介绍了绘图和添加坐标轴的基本方法,我们现在来介绍如何添加图例、标签和标题。
标题可以加在每个图像上,可以采用set_title方法来设置标题:
ax.set_title("title");
同样的,用set_xlabel和set_ylabel可以设置X和Y轴的标签:
ax.set_xlabel("x")
ax.set_ylabel("y");
图像中曲线的图例可以用两种方式添加,一种是用坐标轴对象的legend指令,对于之前定义的曲线添加列表或元组形式的文本:
ax.legend(["curve1", "curve2", "curve3"]);
上面这种方法其实是MATLAB的API,如果图像上的曲线被添加或者删除时可能会报错(导致错误的添加图例)。
一种更好的方法是在绘图或添加其他元素的时候利用label="label text" 关键字参数,然后用无参数的legend指令把图例添加到图像上:
ax.plot(x, x**2, label="curve1")
ax.plot(x, x**3, label="curve2")
ax.legend();
这种方法的优点是,如果在图像上添加或者删除曲线,图例会随之自动更新。
legend函数有一个可供选择的关键字参数loc,用来确定图例添加的位置,loc参数的允许值是数值型代码,详见http://matplotlib.org/users/legend_guide.html#legend-location. 下面列举了一些常见的loc值:
ax.legend(loc=0) # 由matplotlib确定最优位置
ax.legend(loc=1) # 右上角
ax.legend(loc=2) # 左上角
ax.legend(loc=3) # 左下角
ax.legend(loc=4) # 右下角
# .. 还有一些其他的选择,不一一列举
运用上面介绍的关于标题,坐标轴标签和图例的内容,我们可以作出如下图像:
上面的绘制图像的方法都非常实用,但是还不能满足发表论文所需的标准。第一也是最重要的,我们需要采用LaTeX文本格式;第二,我们需要能够调整字体大小以适应出版社所需的要求。
Matplotlib与LaTeX非常兼容,我们只需采用美元符号来封装LaTeX的文本(图例,题目,标签等等),例如:"y=x3y=x3"。
但是这里我们可能在转换LaTeX代码和Python字符串的过程中出现一点问题。在LaTeX中,我们经常用反斜杠符号,例如用\alpha来产生符号α. 但是反斜杠在Python中已经有别的含义(转义码字符)。为了避免Python和LaTeX代码混淆,我们采用“原始”字符串。原始字符串带有前缀“r”,例如r"\alpha" 或者 r'\alpha' 而不是 "\alpha" or '\alpha':
我们也可以改变全局的字体大小和字体样式,使得图像中的所有文本元素都适用(刻度标记、坐标轴标签,标题和图例等等):
全局字体选择STIX字体样式是一个好的选择:
采用LaTeX文本元素时候报错 莫名其妙的来、鸡儿了、下午解决问题再重新写上。