前言

前面两篇文章《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轴取对数

matplotlib 背景颜色(Matplotlib基本用法下缩放和颜色表)(1)

取对数

通过对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 背景颜色(Matplotlib基本用法下缩放和颜色表)(2)

标记

绘制日期和字符串

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

matplotlib 背景颜色(Matplotlib基本用法下缩放和颜色表)(3)

日期

绘制字符串,使用直方图

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个策略,每个策略都可以进行不同的标记。

matplotlib 背景颜色(Matplotlib基本用法下缩放和颜色表)(4)

字符串

可以通过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 背景颜色(Matplotlib基本用法下缩放和颜色表)(5)

辅助坐标轴

颜色表

通常在绘制中可以使用第三个维度表示颜色,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,通过颜色表选取对应的颜色,后续的教程会对颜色表作详细的介绍

matplotlib 背景颜色(Matplotlib基本用法下缩放和颜色表)(6)

颜色表

图像组合

可以通过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还有些复杂的工具来摆放坐标轴的位置

matplotlib 背景颜色(Matplotlib基本用法下缩放和颜色表)(7)

图像组合

,