Matplotlib 教程(基于Jupyter Notebook)

Matplotlib教程

本文为译文,原文载于此,译文原载于此。本文欢迎转载,但请保留本段文字,尊重作者和译者的权益。谢谢。: )

本文是在原文和译文的基础上,稍作调整,调整为基于Jupyter Notebook 的代码。如想观看原文和译文,请戳上面两个链接。
介绍
Matplotlib可能是Python 2D-绘图领域使用最广泛的包。它能让使用者很轻松的将数据图形化,并且提供多样化的输出格式,这里将会探索Matplotlib的常见用法。
初级绘制
这一节中,首先导入我们需要的包,从简到繁:先尝试用默认配置在同一张图上绘制正弦和余弦函数的图像,然后逐步美化它。(代码基于Jupyter Notebook)
第一步,导入包,取得正弦函数和余弦函数的值:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
X = np.linspace(-np.pi,np.pi,256,endpoint=True)
C,S =np.cos(X),np.sin(X) 

X 是一个 numpy 数组,包含了从 −π 等间隔的 256 个值。C 和 S 则分别是这 256 个值对应的余弦和正弦函数值组成的 numpy 数组。
使用默认配置

plt.plot(X,C)
plt.plot(X,S)
plt.show()

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltX = np.linspace(-np.pi,np.pi,256,endpoint=True)C,S =np.cos(X),np.sin(X)plt.plot(X,C)plt.plot(X,S)plt.show()
默认配置的具体内容
Matplotlib 的默认配置都允许用户自定义。你可以调整大多数的默认配置:图片大小和分辨率(dpi)、线宽、颜色、风格、坐标轴、坐标轴以及网格的属性、文字与字体属性等。不过,Matplotlib 的默认配置在大多数情况下已经做得足够好,你可能只在很少的情况下才会想更改这些默认配置。下面的代码中,我们展现了 Matplotlib 的默认配置并辅以注释说明,这部分配置包含了有关绘图样式的所有配置。

# 创建一个 8 * 6 点(point)的图,并设置分辨率为 80
plt.figure(figsize=(8,6), dpi=80)

# 创建一个新的 1 * 1 的子图,接下来的图样绘制在其中的第 1 块(也是唯一的一块)
plt.subplot(1,1,1)

#从 *−π* 到 *+π* 等间隔的 256 个值,且包含端点值。
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

# 绘制余弦曲线,使用蓝色的、连续的、宽度为 1.5 (像素)的线条
plt.plot(X, C, color="blue", linewidth=1.5, linestyle="-")

# 绘制正弦曲线,使用红色的、连续的、宽度为 1.5 (像素)的线条
plt.plot(X, S, color="red", linewidth=1.5, linestyle="-")

# 设置横轴的上下限
plt.xlim(-3.3,3.3)

# 设置横轴记号
plt.xticks(np.linspace(-3,3,7,endpoint=True))

# 设置纵轴的上下限
plt.ylim(-1.1,1.1)

# 设置纵轴记号
plt.yticks(np.linspace(-1,1,9,endpoint=True))

# 将图片保存为png格式,分辨率 100 ,如果是空白图片,你可以查阅相关知识
plt.savefig('exercice_2.png',dpi=100)

# 在屏幕上显示
plt.show()

在这里插入图片描述
改变线条的颜色和粗细
首先,我们以蓝色和红色分别表示余弦和正弦函数,而后将线条变粗一点。接下来,我们在水平方向拉伸一下整个图。

plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red",  linewidth=2.5, linestyle="-")

设置图片边界
当前的图片边界设置得不好,所以有些地方看得不是很清楚。

xmin ,xmax = X.min(), X.max()
ymin, ymax = C.min(), C.max()
dx = (xmax - xmin) * 0.2
dy = (ymax - ymin) * 0.2
plt.xlim(xmin - dx, xmax + dx)
plt.ylim(ymin - dy, ymax + dy)

设置记号和标签
我们讨论正弦和余弦函数的时候,通常希望知道函数在 ±π±π/2 的值。当我们设置记号的时候,我们可以同时设置记号的标签。注意这里使用了LaTeX。

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
       [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

plt.yticks([-1, 0, +1],
       [r'$-1$', r'$0$', r'$+1$'])

在这里插入图片描述
移动脊柱
坐标轴线和上面的记号连在一起就形成了脊柱,它记录了数据区域的范围。它们可以放在任意位置,不过至今为止,我们都把它放在图的四边。
实际上每幅图有四条脊柱(上下左右),为了将脊柱放在图的中间,我们必须将其中的两条(上和右)设置为无色,然后调整剩下的两条到合适的位置——数据空间的 0 点。

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

添加图例
我们在图的左上角添加一个图例。为此,我们只需要在 plot 函数里以「键 - 值」的形式增加一个参数。

plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cosine")
plt.plot(X, S, color="red",  linewidth=2.5, linestyle="-", label="sine")

plt.legend(loc='best')

给一些特殊点做注释
由于给一些点做特殊的注释,代码量多,效果一般,且日常分析较少用,所以这里不再给出具体相关代码,详情看原文。

https://liam.page/2014/09/11/matplotlib-tutorial-zh-cn/

本例完整代码如下(可结合前面注释一起看):

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(8,5), dpi=80)
ax = plt.subplot(111)
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)

plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cosine")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-", label="sine")

plt.xlim(X.min()*1.1, X.max()*1.1)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
           [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

plt.ylim(C.min()*1.1,C.max()*1.1)
plt.yticks([-1, +1],
           [r'$-1$', r'$+1$'])

plt.legend(loc='upper left', frameon=False)
plt.savefig('exercice_9.png',dpi=100)
plt.show()

在这里插入图片描述
图像、子图、坐标轴和记号
到目前为止,我们都用隐式的方法来绘制图像和坐标轴。快速绘图中,这是很方便的。我们也可以显式地控制图像、子图、坐标轴。Matplotlib 中的「图像」指的是用户界面看到的整个窗口内容。在图像里面有所谓「子图」。子图的位置是由坐标网格确定的,而「坐标轴」却不受此限制,可以放在图像的任意位置。我们已经隐式地使用过图像和子图:当我们调用 plot 函数的时候,matplotlib 调用 gca() 函数以及 gcf() 函数来获取当前的坐标轴和图像;如果无法获取图像,则会调用 figure() 函数来创建一个——严格地说,是用 subplot(1,1,1) 创建一个只有一个子图的图像。
图像
所谓「图像」就是 GUI 里以「Figure #」为标题的那些窗口。图像编号从 1 开始,与 MATLAB 的风格一致,而于 Python 从 0 开始编号的风格不同。以下参数是图像的属性:

参数 默认值 描述
num 1 图像的数量
figsize figure.figsize 图像的长和宽(英寸)
dpi figure.dpi 分辨率(点/英寸)
facecolor figure.facecolor 绘图区域的背景颜色
dgecolor figure.edgecolor 绘图区域边缘的颜色
frameon True 是否绘制图像边缘

这些默认值可以在源文件中指明。不过除了图像数量这个参数,其余的参数都很少修改。
Matplotlib 也提供了名为 close 的函数来关闭这个窗口。close 函数的具体行为取决于你提供的参数:

  1. 不传递参数:关闭当前窗口;
  2. 传递窗口编号或窗口实例(instance)作为参数:关闭指定的窗口;
  3. all:关闭所有窗口。

和其他对象一样,你可以使用 setp 或者是 set_something 这样的方法来设置图像的属性。
子图
你可以用子图来将图样(plot)放在均匀的坐标网格中。用 subplot 函数的时候,你需要指明网格的行列数量,以及你希望将图样放在哪一个网格区域中。此外,gridspec 的功能更强大,你也可以选择它来实现这个功能。

plt.subplot(2,2,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,1)',ha='center',va='center',size=20,alpha=.5)

plt.subplot(2,2,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,2)',ha='center',va='center',size=20,alpha=.5)

plt.subplot(2,2,3)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,3)',ha='center',va='center',size=20,alpha=.5)

plt.subplot(2,2,4)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,4)',ha='center',va='center',size=20,alpha=.5)

plt.show()

在这里插入图片描述
坐标轴
坐标轴和子图功能类似,不过它可以放在图像的任意位置。因此,如果你希望在一副图中绘制一个小图,就可以用这个功能。

plt.axes([0.1,0.1,.8,.8])
plt.xticks([]), plt.yticks([])
plt.text(0.6,0.6, 'axes([0.1,0.1,.8,.8])',ha='center',va='center',size=20,alpha=.5)

plt.axes([0.2,0.2,.3,.3])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'axes([0.2,0.2,.3,.3])',ha='center',va='center',size=16,alpha=.5)

plt.show()

在这里插入图片描述

plt.axes([0.1,0.1,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.1,0.1,.8,.8])',ha='left',va='center',size=16,alpha=.5)

plt.axes([0.2,0.2,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.2,0.2,.5,.5])',ha='left',va='center',size=16,alpha=.5)

plt.axes([0.3,0.3,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.3,0.3,.5,.5])',ha='left',va='center',size=16,alpha=.5)

plt.axes([0.4,0.4,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.4,0.4,.5,.5])',ha='left',va='center',size=16,alpha=.5)

plt.show()

在这里插入图片描述
记号
良好的记号是图像的重要组成部分。Matplotlib 里的记号系统里的各个细节都是可以由用户个性化配置的。你可以用 Tick Locators 来指定在那些位置放置记号,用 Tick Formatters 来调整记号的样式。主要和次要的记号可以以不同的方式呈现。默认情况下,每一个次要的记号都是隐藏的,也就是说,默认情况下的次要记号列表是空的——NullLocator。

后记
当然Matplotlib 不仅仅只有这些操作,它可以绘制许许多多的图,同时,Python中绘图的工具也不限于Matplotlib。想要学习更多内容,官网的教程是一个不错的选择。以下推荐两个官网教程:
matplotlib(https://matplotlib.org/)
seaborn(http://seaborn.pydata.org/)

发布了23 篇原创文章 · 获赞 61 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40195360/article/details/84249100