前言
前面两篇文章《Matplotlib基本用法(上)绘制》和《Matplotlib基本用法(中)样式和标签》对Matplotlib库的图像、绘制方法、编程风格、样式、标签几个模块进行了介绍,本篇文章继续学习轴的缩放、颜色表、图像组合等内容。
轴的缩放和标记
每个坐标轴(Axes)有两或者三个轴(Axis)代表x和y方向。相比于线性缩放来说,Matplotlib也可以进行非线性缩放,比如log缩放。因为log缩放如此常见,所以提供loglog(), semilogx(), semilogy()方法。这里有几个缩放的例子
data1, data2, data3, data4 = np.random.randn(4, 100)
fix, axs = plt.subplots(1, 2, figsize=(10, 5.4), layout='constrained')
xdata = np.arange(len(data1))
data = 10**data1
axs[0].plot(xdata, data)
axs[1].set_yscale('log')
axs[1].plot(xdata, data)
plt.show()
对坐标轴2的y轴取对数
取对数
通过对y轴取对数,将所有的计算后的点重新映射到坐标轴上。x轴和y轴都可以进行缩放,这就是变换,将数据重新映射到坐标轴、图像或者屏幕中。
每个轴有个格式化(formatter)和坐标(tick locator)工具,可以从坐标轴中挑选特定的点进行标注
fix, axs = plt.subplots(1, 2, figsize=(10, 5.4), layout='constrained')
xdata = np.arange(len(data1))
axs[0].plot(xdata, data1)
axs[0].set_title('Automatic ticks')
axs[1].plot(xdata, data1)
axs[1].set_xticks(np.arange(0, 100, 30), ['zero', '30', 'sixty', '90'])
axs[1].set_yticks([-1.5, 0, 1.5]) # note that we don't need to specify labels
axs[1].set_title('Manual ticks')
plt.show()
不同的缩放有不同的locators和formatters,比如对数缩放使用的是LogLocator和LogFormatter,可以在后续教程中学习相关知识。
标记
绘制日期和字符串
Matplotlib可以处理日期和字符串数组
fig, ax = plt.subplots(figsize=(10, 5.4), layout='constrained')
dates = np.arange(np.datetime64('2021-11-15'), np.datetime64('2021-12-25'),
np.timedelta64(1, 'h'))
data = np.cumsum(np.random.randn(len(dates)))
ax.plot(dates, data)
cdf = matplotlib.dates.ConciseDateFormatter(ax.xaxis.get_major_locator())
ax.xaxis.set_major_formatter(cdf)
plt.show()
绘制从2021-11-15号到2021-12-25号的数据,使用的是ConciseDataFormatter
日期
绘制字符串,使用直方图
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
categories = ['turnips', 'rutabaga', 'cucumber', 'pumpkins']
ax.bar(categories, np.random.rand(len(categories)));
对于字符串Matplotlib使用的是分类策略,就是说传递1000个字符串,会增加1000个策略,每个策略都可以进行不同的标记。
字符串
可以通过twinx()函数增加坐标轴,x轴是不可见的,y轴放置在右边,twiny()与之类似。
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2 * np.pi * t)
fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(7, 2.7), layout='constrained')
l1, = ax1.plot(t, s)
ax2 = ax1.twinx()
l2, = ax2.plot(t, range(len(t)), 'C1')
ax2.legend([l1, l2], ['Sine (left)', 'Straight (right)'])
ax3.plot(t, s)
ax3.set_xlabel('Angle [rad]')
ax4 = ax3.secondary_xaxis('top', functions=(np.rad2deg, np.deg2rad))
ax4.set_xlabel('Angle [°]')
plt.show()
也可以通过secondary_xaxis()或者secondary_yaxis()函数进行类似的操作
辅助坐标轴
颜色表
通常在绘制中可以使用第三个维度表示颜色,Matplotlib有几个函数来绘制
X, Y = np.meshgrid(np.linspace(-3, 3, 128), np.linspace(-3, 3, 128))
Z = (1 - X/2 X**5 Y**3) * np.exp(-X**2 - Y**2)
fig, axs = plt.subplots(2, 2, layout='constrained')
pc = axs[0, 0].pcolormesh(X, Y, Z, vmin=-1, vmax=1, cmap='RdBu_r')
fig.colorbar(pc, ax=axs[0, 0])
axs[0, 0].set_title('pcolormesh()')
co = axs[0, 1].contourf(X, Y, Z, levels=np.linspace(-1.25, 1.25, 11))
fig.colorbar(co, ax=axs[0, 1])
axs[0, 1].set_title('contourf()')
pc = axs[1, 0].imshow(Z**2 * 100, cmap='plasma',
norm=matplotlib.colors.LogNorm(vmin=0.01, vmax=100))
fig.colorbar(pc, ax=axs[1, 0], extend='both')
axs[1, 0].set_title('imshow() with LogNorm()')
pc = axs[1, 1].scatter(data1, data2, c=data3, cmap='RdBu_r')
fig.colorbar(pc, ax=axs[1, 1], extend='both')
axs[1, 1].set_title('scatter()')
plt.show()
它们都是继承自ScalarMappable对象的Artists,通过颜色表选取对应的颜色,后续的教程会对颜色表作详细的介绍
颜色表
图像组合
可以通过figure()或者subplots()构建多张图,更简洁的办法是使用subplot_mosaic()函数
fig, axd = plt.subplot_mosaic([['upleft', 'right'],
['lowleft', 'right']], layout='constrained')
axd['upleft'].set_title('upleft')
axd['lowleft'].set_title('lowleft')
axd['right'].set_title('right');
Matplotlib还有些复杂的工具来摆放坐标轴的位置
图像组合
,