等比例缩放坐标轴
默认情况下,Matplotlib对图形的两个轴使用不同的比例,在系列教程自定义坐标轴中,我们已经看到可以使用 plt.axis('scaled') 来使坐标轴具有相同比例,这里我们介绍另外一种方法,通过 Axes 对象修改坐标轴比例。
importnumpyasnpfrommatplotlibimportpyplotaspltt=np.linspace(0, 2*np.pi, 1024) plt.axes().set_aspect('equal') plt.plot(2.*np.cos(t), np.sin(t), c='c', lw=1.5) plt.show()
等效于:
importnumpyasnpfrommatplotlibimportpyplotaspltt=np.linspace(0, 2*np.pi, 1024) plt.plot(2.*np.cos(t), np.sin(t), c='c', lw=1.5) plt.axis('scaled') plt.show()
可以看到我们绘制的椭圆,其中长轴的长度是短轴的两倍,而通过修改坐标轴的比例,Matplotlib渲染的椭圆也具有相同的比例。
Tips:plt.axes() 函数返回 Axes 对象的一个实例,Axes 实例有一个 set_aspect 方法,将其设置为"equal"则两个轴使用相同的比例。
如果我们不进行此设置,则所绘制的椭圆则如下图所示,看起来长轴的长度并非短轴的两倍。
importnumpyasnpfrommatplotlibimportpyplotaspltt=np.linspace(0, 2*np.pi, 1024) plt.plot(2.*np.cos(t), np.sin(t), c='c', lw=1.5) plt.show()
设置图形比例
当我们需要将图形用于期刊出版物或网站时,可能需要具有特定纵横比的图形。
importnumpyasnpimportmatplotlib.pyplotaspltx=np.linspace(-10, 10, 1000) y_1, y_2=np.sinc(x), np.cos(x) plt.figure(figsize=(10.24, 2.56)) plt.plot(x, y_1, c='c', lw=1.25) plt.plot(x, y_2, c='m', lw=1.25) plt.show()
Tips:plt.figure() 函数用于创建一个新的 Figure 实例,一个 Figure 对象表示一个图形整体。通常,此对象是在隐式创建的。但是,通过显式地创建 Figure 对象,我们可以控制图形的各个方面,其中 figsize 参数允许我们指定 Figure 对象大小。
设置坐标轴范围
默认情况下,Matplotlib会在两个坐标轴方向上查找数据的最小值和最大值,并进行适当的扩展,用作绘制数据的范围。但是,有时需要手动设置图形的坐标轴范围,以便更好地查看数据的极值。
importnumpyasnpfrommatplotlibimportpyplotaspltx=np.linspace(-6, 6, 1024) plt.ylim(-.5, 1.5) plt.plot(x, np.sinc(x), c='c') plt.show()
Tips:plt.xlim() 和 plt.ylim() 分别用于控制 x 轴和 y 轴的范围,其接受参数用于设置坐标轴范围的最大值和最小值。
插入子图
在一个图形中嵌入的小图形有助于显示图形的细节,或者也可以说,有助于强调图形的特定部分。与使用多个子图进行的合成有所不同,这种插入子图,其子图是图形的一部分,而多个子图进行的合成中,子图间是彼此独立的,抽象的讲解太过复杂,看一个示例就能一目了然了。
importnumpyasnpfrommatplotlibimportpyplotaspltx=np.linspace(-6, 6, 1024) y=np.sinc(x) x_detail=np.linspace(-2, 2, 1024) y_detail=np.sinc(x_detail) plt.plot(x, y, c='c') sub_axes=plt.axes([.6, .6, .25, .25]) sub_axes.plot(x_detail, y_detail, c='m') plt.setp(sub_axes) plt.show()
为了插入子图,我们首先在图上创建一个子区域:
sub_axes=plt.axes([.6, .6, .25, .25])
在图形坐标的表示中:(0, 0) 是整个图形的左下角,(1, 1) 是右上角,子区域由四个值定义——区域左下角的坐标及其尺寸。
一旦定义了子区域,我们就有了一个 Axes 实例,然后就可以在其中绘制所需图形。最后,我们需要在 Axes 实例上调用 plt.setp() 显示子图:
plt.setp(sub_axes)
Tips:可以创建的子图数量并没有限制。