项目场景:
本文主要介绍python数据分析可视化库Matplotlib的一些常见问题,后续会不断补充增加。
一. 关于子图绘制:
A.Pyplot编程接口绘制子图(state-based)
Pyplot编程接口(state-based),
1.类似MATLAB风格,利用plt创建Axes对象(此时也自动创建了Figure,可以使用plt.figure(figsize=())来制定图的大小);
2.具有状态属性,未指明图的次序(也就是plt.subplot()未使用),将默认在最后一个坐标系上绘图;
1.规则子图绘制
代码如下(示例):
import matplotlib.pyplot as plt
import numpy as np
#未指明图的大小,使用默认图大小
for i in range(4):
plt.subplot(221+i)
plt.plot(np.arange(1,6))
plt.show()
2.不规则子图绘制
代码如下(示例):
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(12, 6))#指明图的大小
plt.subplot(221)
plt.plot(np.arange(6))
plt.subplot(222)
plt.plot(np.arange(6))
plt.subplot(212)
plt.plot(np.arange(6))
plt.show()
代码如下(示例):
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(12, 6))#指明图的大小
plt.subplot(311)
plt.plot(np.arange(6))
plt.subplot(312)
plt.plot(np.arange(6))
plt.subplot(313)
plt.plot(np.arange(6))
plt.show()
总结规律:
- plt.subplot(221)是将图四等分(2*2)选取第一个,同理plt.subplot(222)则为四等份中的第二个;
- plt.subplot(212)将图两等分(2*1),选择第二个;
- plt.subplot(abc),a和b代表图分成的份数,c代表次序;
B.面向对象编程接口绘制子图(object-based)
面向对象编程接口绘图即每个图都基于一个对象(Axes坐标系对象),相比于pyplot接口,需要我们自己创建画布(FigureCanvas),我们自己创建图对象(Figure),我们自己创建Axes,所有对象一起才能完成一次完整的绘图
import matplotlib.pyplot as plt
import numpy as np
#使用plt.subplots()指定图的大小和坐标系的数目,并指明图的大小
fig, axes = plt.subplots(2, 2,figsize=(12, 8), dpi=72)
#依次生成子图对象
ax1 = axes[0, 0]
ax2 = axes[0, 1]
ax3 = axes[1, 0]
ax4 = axes[1, 1]
#绘制图像
ax2.plot(np.arange(4))
ax4.scatter(np.arange(4), np.arange(4))
plt.show()
- subplots方法最好使用axes方法绘图,它是先搭框架再绘图;而subplot方法则是通过代码块一步步绘图,逻辑非常清晰,并且在代码块中可以使用plt方法;
- 代码示例均以绘制简单子图为例,读者可以根据需求添加图像的其他元素
二. 关于坐标轴参数设置:
fig, ax = plt.subplots(1, 1,figsize=(8, 6), dpi=100)
#用于设置图的标题
ax.set_title("Anatomy of a figure", fontsize=20, verticalalignment='bottom')
#选择‘major’,使两个坐标轴的都显示出刻度,并且设置width和length
ax.tick_params(which='major', width=1.0)
ax.tick_params(which='major', length=10)
#用于设置x轴的最大分度值
ax.xaxis.set_major_locator(MultipleLocator(10.000))
#用于设置x轴的最小分度值,‘4’代表将10等分成4份,一份2.5
ax.xaxis.set_minor_locator(AutoMinorLocator(4))
#用于设置y轴的最大分度值
ax.yaxis.set_major_locator(MultipleLocator(10.000))
#用于设置y轴的最小分度值,‘4’代表将10等分成4份,一份2.5
ax.yaxis.set_minor_locator(AutoMinorLocator(4))
#用于设置x轴的标签
ax.set_xlabel("X axis label")
#用于设置y轴的标签
ax.set_ylabel("Y axis label")
#用于设置x轴的范围
ax.set_xlim(0, 100)
#用于设置y轴的范围
ax.set_ylim(0, 150)
#用于显示图例
ax.legend()
三. 关于中文显示:
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False