matplotlib 显示批量图片_matplotlib面向对象绘图小白终结版

  • Post author:
  • Post category:其他


af75549250630a5a75ae40cad60a2e5c.png

先看看Matplotlib,pyplot和pylab三者的相互关系

——该条目摘自官方文档

Matplotlib是整个包

matplotlib.pyplot 是 matplotlib中的一个模块;

pylab是一个与 matplotlib 一起安装的模块。

Pyplot为底层面向对象的绘图库提供状态机接口。 状态机隐式地 自动创建图形和轴 以实现所需的图形,例如:

x = np.linspace(0, 2, 100)

plt.plot(x, x, label='线性')
plt.plot(x, x**2, label='二次方')
plt.plot(x, x**3, label='三次方')

plt.xlabel('x轴')
plt.ylabel('y轴')

plt.title("简单绘图")

plt.legend()

a518de8679c195aa36a1fe84445b3810.png

第一次调用 plt.plot 将自动创建必要的图形和轴以实现所需的绘图。随plt.plot的调用会重新使用当前轴,并且每次都会添加另一行。设置标题,图例和轴标签还会自动使用当前轴并设置标题,创建图例并分别标记轴。

pylab是一个便利模块,相当于在单个名称空间中批量导matplotlib.pyplot(用于绘图)和numpy一样(用于数学和使用数组)。不过不推荐使用pylab,并且由于命名空间污染而强烈建议不要使用它。请改用pyplot。



matplotlib基础布局



Matplotlib中大的对象主要分为三个:


FigureCanvas(画布、画布层)


Figure(图、图像层)


Axes(坐标轴、绘制的区域——轴域、坐标层)

(概念划分参考自:https://www.cnblogs.com/dajun…)

而FigureCanvas(画布)涉及到底层操作,咱现在的水平就甭接触了8[手动滑稽]

可以说使用matplotlib绘图,一个非常基础的问题就是要搞清楚图(图像层)和坐标轴(坐标层)俩对象。只有真正了解这两个概念,才能获得对整个绘图过程的控制权。

import matplotlib.pyplot as plt

plt.figure()
plt.show()


输出:

使用

plt.figure()

创建一个

Figure

对象,通过

plt.show()

显示出来:

输出空画布框。


axes对象

#有了图像层,接下来就在图像层上绘图,
      #因此我们首先需要创建一个坐标轴,可以调用Figure实例的 add_axes 方法:

fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # [距离左边,下边,坐标轴宽度,坐标轴高度] 范围(0, 1)
plt.show()


[0.1, 0.1, 0.8, 0.8]

表示的是在图像层中,坐标轴区域(坐标层)距离画布左边0.1倍的位置,距离下边0.1倍的位置,确定了这两个位置后,坐标轴的整体宽度和高度占0.8倍的大小,换句话说,距离右边和上边0.9(0.1+0.8)倍。得到如下结果:


输出:

e90eafb1839634a1cd93c4191463759b.png


matplotlib

会在最近用过的坐标层上进行绘图,如果没有的话,默认会创建一个图对象(图像层)和坐标轴(坐标层)。但是显示创建图对象(图像层)和坐标轴(坐标层)的好处是让我们对绘图过程有了完全的控制权(比如可以指定在什么地方绘图),而且绘图的逻辑更强。接下来我们绘制一张图中图来理解这个过程:

import numpy as np
import matplotlib.pyplot  as plt
x = np.linspace(0, 10, 10)
y = np.sin(x)

# 创建画布
fig = plt.figure()
# 创建坐标轴
ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 第一个坐标轴的范围
ax2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # 第二个坐标轴的范围

ax1.plot(x, y, 'r')
ax2.plot(x, y, 'g')
plt.show()


输出:

fcac97714efaa64161b85cf5ebfd854a.png


图片尺寸大小

在创建 Figure 对象的时候,我们可以使用 figsize 和 dpi 控制图片尺寸。比如:

fig = plt.figure(figsize=(16,8), dpi=100)


figsize

表示画布的宽高比;

dpi

表示每英寸的像素值。因此上面的命令就创建了一张1600*800像素的画布。


保存图片

从上面输出的结果来看,


plt.show()

并不是输出一张图片,而是一个交互式的绘图界面。

如果要保存图片,还需要通过


savefig()


保存。没有显式指定画布和坐标轴,直接使用


plt.savefig()


保存也可以,显式指明了图对象(绘图层)可以用

Figure

实例的方法

fig.savefig()



matplotlib

可以生成多种格式的高质量图像,包括PNG,JPG,EPS,SVG,PGF 和 PDF,只要写好后缀名即可:

fig.savefig("result.png")

小结:

建议按照显式的方法去绘图:先创建画布,再创建坐标轴,最后在坐标轴上绘图。这种代码方式会让绘图逻辑更加清晰,能够随心所欲的修改图片的每个地方。


子图对象AxesSubplot




#在绘图层(figure对象上)上创建两个子图(一行两列),都显示出来

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1,100,1)

fig = plt.figure()

ax1 = fig.add_subplot(121)
ax1.plot(x,x)

ax2 = fig.add_subplot(122)
ax2.plot(x,x*x)


输出:

96e47c9cda5f1ceba25f02dbf3a7066c.png

# 此处可以和 pyplot绘图方式简单对比一下:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1,100,1)

plt.subplot(121)
plt.plot(x, x)

plt.subplot(122)
plt.plot(x, x*x)

>>输出结果与上图相同。

6e03f61d25c70a8ab1be82eb9373bbe5.png


网格线

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1,10)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,x*2)
ax.grid(color='g',linestyle='--')


输出:

0a33b6d3ccf0d4b573134497a690e02b.png


图例

# 显示图例
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1,11)

fig = plt.figure()
ax = fig.add_subplot(111)

ax.plot(x,x,label='inline label')
ax.legend()


输出:

78468b64fea5bba33aa81d1815f8e03e.png

3e93f2cd1023844c5a5ac2cc29d74a63.png


欢迎关注、转发、评论

f6c921b0a9a83644301b45dd427aba35.gif