天天看点

Matplotlib自定义统计图比例等比例缩放坐标轴设置图形比例设置坐标轴范围插入子图

等比例缩放坐标轴

默认情况下,Matplotlib对图形的两个轴使用不同的比例,在系列教程

自定义坐标轴

中,我们已经看到可以使用 plt.axis('scaled') 来使坐标轴具有相同比例,这里我们介绍另外一种方法,通过 Axes 对象修改坐标轴比例。

import numpy as np
from matplotlib import pyplot as plt
t = 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()      

等效于:

import numpy as np
from matplotlib import pyplot as plt
t = 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自定义统计图比例等比例缩放坐标轴设置图形比例设置坐标轴范围插入子图

可以看到我们绘制的椭圆,其中长轴的长度是短轴的两倍,而通过修改坐标轴的比例,Matplotlib渲染的椭圆也具有相同的比例。

Tips:plt.axes() 函数返回 Axes 对象的一个实例,Axes 实例有一个 set_aspect 方法,将其设置为"equal"则两个轴使用相同的比例。

如果我们不进行此设置,则所绘制的椭圆则如下图所示,看起来长轴的长度并非短轴的两倍。

import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(0, 2 * np.pi, 1024)
plt.plot(2. * np.cos(t), np.sin(t), c = 'c', lw = 1.5)
plt.show()      
Matplotlib自定义统计图比例等比例缩放坐标轴设置图形比例设置坐标轴范围插入子图

设置图形比例

当我们需要将图形用于期刊出版物或网站时,可能需要具有特定纵横比的图形。

import numpy as np
import matplotlib.pyplot as plt
x = 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()      
Matplotlib自定义统计图比例等比例缩放坐标轴设置图形比例设置坐标轴范围插入子图

Tips:plt.figure() 函数用于创建一个新的 Figure 实例,一个 Figure 对象表示一个图形整体。通常,此对象是在隐式创建的。但是,通过显式地创建 Figure 对象,我们可以控制图形的各个方面,其中 figsize 参数允许我们指定 Figure 对象大小。

设置坐标轴范围

默认情况下,Matplotlib会在两个坐标轴方向上查找数据的最小值和最大值,并进行适当的扩展,用作绘制数据的范围。但是,有时需要手动设置图形的坐标轴范围,以便更好地查看数据的极值。

import numpy as np
from matplotlib import pyplot as plt
x = np.linspace(-6, 6, 1024)
plt.ylim(-.5, 1.5)
plt.plot(x, np.sinc(x), c = 'c')
plt.show()      
Matplotlib自定义统计图比例等比例缩放坐标轴设置图形比例设置坐标轴范围插入子图

Tips:plt.xlim() 和 plt.ylim() 分别用于控制 x 轴和 y 轴的范围,其接受参数用于设置坐标轴范围的最大值和最小值。

插入子图

在一个图形中嵌入的小图形有助于显示图形的细节,或者也可以说,有助于强调图形的特定部分。与使用多个子图进行的合成有所不同,这种插入子图,其子图是图形的一部分,而多个子图进行的合成中,子图间是彼此独立的,抽象的讲解太过复杂,看一个示例就能一目了然了。

import numpy as np
from matplotlib import pyplot as plt
x = 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()      
Matplotlib自定义统计图比例等比例缩放坐标轴设置图形比例设置坐标轴范围插入子图

为了插入子图,我们首先在图上创建一个子区域:

sub_axes = plt.axes([.6, .6, .25, .25])      

在图形坐标的表示中:(0, 0) 是整个图形的左下角,(1, 1) 是右上角,子区域由四个值定义——区域左下角的坐标及其尺寸。

一旦定义了子区域,我们就有了一个 Axes 实例,然后就可以在其中绘制所需图形。最后,我们需要在 Axes 实例上调用 plt.setp() 显示子图:

plt.setp(sub_axes)      

Tips:可以创建的子图数量并没有限制。