Matplotlib 绘图快速入门

王 茂南 2021年4月10日07:20:47
评论
2 5911字阅读19分42秒
摘要本文会对 Matplotlib 绘图进行简洁的介绍。主要会从以下的六个点,1). 数据准备、2). 创建绘图、3). 开始绘图、4). 自定义样式、5). 图像保存、6). 展示图片,来进行介绍。

简介

这一篇会简洁的介绍如何使用 Matplotlib 进行可视化。之前写过一篇非常详细的说明,对 Matplotlib 中的各种使用都进行了介绍,Python数据处理之Matplotlib学习。但是在初学的时候,直接看这个会内容有点太多了。所以想着会有一个比较简洁的介绍。

这一篇内容主要是参考自这个链接Python Matplotlib Cheat Sheet如下图所示,可以放大进行查看)。这里会比较详细的列出了要做的每一个步骤,我们在本文中就会按照这些步骤进行介绍。

Matplotlib 绘图快速入门

 

Matplotlib 绘图快速入门

使用 Matplotlib 进行绘图可以分为 6 个步骤:1). 数据准备2). 创建绘图3). 开始绘图4). 自定义样式5). 图像保存6). 展示图片。下图展示了上面的六个步骤:

Matplotlib 绘图快速入门

针对这里所说的 6 个步骤,下面我们详细进行说明。

数据集准备

这里我们分为两类数据,分别是一维数据和二维数据。我们首先来准备一维数据

  1. import numpy as np
  2. x = np.linspace(0, 10, 100)
  3. y = np.cos(x)
  4. z = np.sin(x)

接着准备二维数据,二维数据绘制的结果就是三维的。可以使用下面的两种方式来创建二维数据。直接使用 numpy 来生成二维数据,或是使用 np.mgrid 来进行生成。

  1. # 方法一
  2. data = 2*np.random.random((10, 10)) # 创建 10*10 大小的数据
  3. # 方法二
  4. Y, X = np.mgrid[-3:3:100j, -3:3:100j]
  5. U = -1 - X**2 + Y
  6. V = 1 + X - Y**2

 

 

创建绘图-create plot

在数据集创建完毕之后,我们需要创建绘图(create plot)。我们首先需要导入 matplotlib 库。

  1. import matplotlib.pyplot as plt

接着我们创建 figure,可以有以下的两种方式进行创建,

  1. fig = plt.figure()
  2. fig2 = plt.figure(figsize=plt.figaspect(2.0)) # width and height 比例

 创建 Axes。每一个的绘图都是与 Axes 有关的。一个 subplot 对应一个 Axes。会有以下两种方式添加 subplot,第一种是依次进行添加,第二种可以一下指定大小(这里推荐使用方法二)。

  1. # 方法一
  2. fig.add_axes()
  3. ax1 = fig.add_subplot(221) # row-col-num 
  4. ax3 = fig.add_subplot(212)
  5. # 方法二
  6. fig3, axes = plt.subplots(nrows=2,ncols=2)
  7. fig4, axes2 = plt.subplots(ncols=3)

 

开始绘图-基础图像

如果是按照上面方法一进行创建 Axes,可以这样进行绘图:

  1. fig = plt.figure(figsize=plt.figaspect(0.3)) # step-2
  2. ax1 = fig.add_subplot(131) # row-col-num 
  3. ax2 = fig.add_subplot(132)
  4. ax3 = fig.add_subplot(133)
  5. ax1.scatter(x, y) # step-3
  6. ax2.fill(x, y, color='blue')
  7. ax3.fill_between(x, y, color='yellow') # y 与 y=0 直接进行填充
  8. plt.show() # step-6

最终的绘图效果如下所示:

Matplotlib 绘图快速入门

如果使用了上面方法二进行创建 Axes,那么可以按照下面的方式进行绘图:

  1. fig, axes = plt.subplots(figsize=(8, 8), nrows=2,ncols=2)
  2. axes[0, 0].bar([1,2,3],[3,4,5]) # 柱状图
  3. axes[1, 0].barh([0.5, 1, 2.5],[0, 1, 2]) # 横向柱状图
  4. axes[1, 1].axhline(0.45) # 绘制与 x 轴平行的线
  5. axes[0, 1].axvline(0.65) # 绘制与 y 轴平行的线
  6. plt.show()

最终的可视化效果如下所示:

Matplotlib 绘图快速入门

一维数据基础图像

对于一维数据,我们可以绘制其数据分布,如下所示:

  1. fig = plt.figure(figsize=plt.figaspect(0.3))
  2. ax1 = fig.add_subplot(131)
  3. ax2 = fig.add_subplot(132)
  4. ax3 = fig.add_subplot(133)
  5. ax1.hist(y)
  6. ax2.boxplot(y)
  7. ax3.violinplot(y)
  8. plt.show()

最终的可视化效果如下所示:

Matplotlib 绘图快速入门

 

二维数据基础图像

对于二维数据,我们可以绘制其等高线等。

  1. fig, axes = plt.subplots(figsize=(7, 7), nrows=2,ncols=2)
  2. axes[0, 0].pcolor(data)
  3. axes[1, 0].pcolormesh(data)
  4. axes[0, 1].contour(data)
  5. axes[1, 1].contourf(data) # 绘制等高线
  6. plt.show()

最终的可视化效果如下所示:

Matplotlib 绘图快速入门

 

自定义绘图的样式

这里我们可以修改不同绘图的样式,实现定制化。

定制标题

我们可以使得我们的标题支持数学公式,同时修改标题文字的大小

  1. fig = plt.figure(figsize=plt.figaspect(0.5))
  2. ax1 = fig.add_subplot(121)
  3. ax2 = fig.add_subplot(122)
  4. ax1.plot(x, y, linestyle='--') # 定制线条样式
  5. ax1.set_title(r'$Cos(x)$', fontsize=15)
  6. ax2.scatter(x, z)
  7. ax2.set_title(r'$Sin(x)$', fontsize=15)
  8. plt.show()

最终的效果如下所示:

Matplotlib 绘图快速入门

 

设置图例(label and legend)

我们可以设置 x-label 和 y-label 的内容,大小,与 x 或是 y 轴的间距,同时也可以设置图例。

  1. fig = plt.figure(figsize=plt.figaspect(0.5))
  2. ax1 = fig.add_subplot(121)
  3. ax2 = fig.add_subplot(122)
  4. ax1.plot(x, y, linestyle='--', label=r'$cos$')
  5. ax1.set_xlabel('x', fontsize=20, labelpad=20) # labelpad 表示间距
  6. ax1.set_ylabel('y', fontsize=20, labelpad=20)
  7. ax1.legend()
  8. ax2.scatter(x, z)
  9. plt.show()

上面的输出结果如下所示,

Matplotlib 绘图快速入门

 

设置 x 和 y 轴的范围(limits)

有下面的两种方式来控制 x 和 y 轴的范围:

  1. fig = plt.figure(figsize=plt.figaspect(0.5))
  2. ax1 = fig.add_subplot(121)
  3. ax2 = fig.add_subplot(122)
  4. ax1.plot(x, y, linestyle='--')
  5. ax1.margins(x=2, y=1) # 控制边距
  6. ax2.scatter(x, z)
  7. ax2.set(xlim=[0, 10], ylim=[-2, 2]) # 限制 x 和 y 轴的范围
  8. plt.show()

最终的效果如下所示:

Matplotlib 绘图快速入门

 

设置 Ticks 的内容和大小

我们可以设置 ticks 的内容和大小,如下所示:

  1. fig = plt.figure(figsize=plt.figaspect(0.5))
  2. ax1 = fig.add_subplot(121)
  3. ax2 = fig.add_subplot(122)
  4. ax1.plot(x, y, linestyle='--')
  5. ax1.xaxis.set(ticks=range(1,10,2), ticklabels=['a', 'b', 'c', 'd', 'e']) # 自定义 ticks 的内容
  6. ax1.xaxis.set_tick_params(labelsize=20, rotation=-45) # 定义大小和旋转
  7. ax2.scatter(x, z)
  8. plt.show()

最终的效果如下所示:

Matplotlib 绘图快速入门

 

设置边框距离与是否显示

同样的,对于图的外面的框来说,我们可以设置他们是否出现。

  1. fig = plt.figure(figsize=plt.figaspect(0.5))
  2. ax1 = fig.add_subplot(121)
  3. ax2 = fig.add_subplot(122)
  4. ax1.plot(x, y, linestyle='--')
  5. ax1.spines['top'].set_visible(False)
  6. ax1.spines['left'].set_visible(False)
  7. ax1.spines['bottom'].set_position(('outward', 100))
  8. ax2.scatter(x, z)
  9. plt.show()

在上面的代码中,我们设置「上侧」和「左侧」不可见,将下部的线往下移。最终效果如下:

Matplotlib 绘图快速入门

 

子图间的距离

在绘图过程中,我们可以控制不同子图之间的间距。如下所示,当我们定义了 fig 之后,可以使用 fig.subplots_adjust 来进行调整:

  1. fig, axes = plt.subplots(figsize=(7, 7), nrows=2,ncols=2)
  2. fig.subplots_adjust(wspace=0.5, # 控制横向的间距
  3.                    hspace=0.5, # 控制纵向的间距
  4.                    left=0.2,
  5.                    right=0.9,
  6.                    top=0.9,
  7.                    bottom=0.1
  8.                    )
  9. axes[0, 0].pcolor(data)
  10. axes[1, 0].pcolormesh(data)
  11. axes[0, 1].contour(data)
  12. axes[1, 1].contourf(data) # 绘制等高线
  13. plt.show()

或是我们可以使用下面的进行自动调整子图之间的间距:

  1. fig.tight_layout()

 

指定位置显示文本和注解

我们可以在图上指定位置显示指定的问题,或是进行注解:

  1. fig = plt.figure(figsize=plt.figaspect(0.5))
  2. ax1 = fig.add_subplot(121)
  3. ax2 = fig.add_subplot(122)
  4. ax1.plot(x, y, linestyle='--')
  5. ax1.text(5, 0.5, 'Example', style='italic', fontsize=20) # 在 (5, 0.5) 处显示内容
  6. ax1.annotate("Sine", xy=(6, 1), xycoords='data',
  7.             xytext=(1, 0), textcoords='data',
  8.             arrowprops=dict(arrowstyle='->', connectionstyle='arc3')) # 注解
  9. ax2.scatter(x, z)
  10. plt.show()

最终效果如下所示:

Matplotlib 绘图快速入门

 

定制不同的 Markers

我们可以定制不同的 marker,不同的形状,不同的大小和不同的颜色。下面是一个例子:

  1. fig = plt.figure(figsize=plt.figaspect(0.5))
  2. ax1 = fig.add_subplot(121)
  3. ax2 = fig.add_subplot(122)
  4. ax1.plot(x, y, marker='.', markersize=9, markerfacecolor='red')
  5. ax2.scatter(x, y, marker='o')
  6. plt.show()

最终的效果如下所示:

Matplotlib 绘图快速入门

关于更多关于 marker 的定制,可以查看链接,matplotlib.pyplot.plot

 

定制颜色(color)

我们还可以定义线条的颜色与透明度。

  1. fig = plt.figure(figsize=plt.figaspect(0.5))
  2. ax1 = fig.add_subplot(121)
  3. ax2 = fig.add_subplot(122)
  4. ax1.plot(x, y, color='red') # 定制颜色
  5. ax2.plot(x, y, color='red', alpha=0.4) # 定制透明度
  6. plt.show()

最终效果如下所示,右侧的线条颜色要比左侧的线条淡:

Matplotlib 绘图快速入门

 

定制线条风格(linestyles)

上面是定制线条的颜色。除此之外,我们还可以定义线条的粗细,线条的样式。我们看一下例子:

  1. fig = plt.figure(figsize=plt.figaspect(0.5))
  2. ax1 = fig.add_subplot(121)
  3. ax2 = fig.add_subplot(122)
  4. ax1.plot(x, y, linestyle='--') # 定制线条样式
  5. ax2.plot(x, y, linewidth=4) # 定制线条宽度
  6. plt.show()

最终可视化效果如下所示:

Matplotlib 绘图快速入门

 

保存图像

会有以下两种保存图像的方式,第一种就是直接进行保存;第二种是保存为透明的背景。

  1. # save figures
  2. plt.savefig('foo.png')
  3. # save transparents figures
  4. plt.savefig('foo.png', transparents=True)

 

展示图像

使用以下的命令来进行图像的展示:

  1. plt.show()

如果我们想要清楚画图内容,或是关闭窗口,可以使用以下的命令:

  1. plt.cla() # clear an axis
  2. plt.clf() # clear the entire figure
  3. plt.close() # close a windows

 

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2021年4月10日07:20:47
  • 转载请务必保留本文链接:https://mathpretty.com/13603.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: