Matplotlib自定义统计图比例

1,943 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

等比例缩放坐标轴

默认情况下,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渲染的椭圆也具有相同的比例。 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()

坐标轴默认比例

设置图形比例

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

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()

设置图形比例

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()

设置坐标轴范围

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()

插入子图

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

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

在图形坐标的表示中:(0, 0)是整个图形的左下角,(1, 1)是右上角,子区域由四个值定义——区域左下角的坐标及其尺寸。 一旦定义了子区域,我们就有了一个Axes实例,然后就可以在其中绘制所需图形。最后,我们需要在Axes实例上调用plt.setp()显示子图:

plt.setp(sub_axes)

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

系列链接

Matplotlib常见统计图的绘制

Matplotlib使用自定义颜色绘制统计图

Matplotlib控制线条样式和线宽

Matplotlib自定义样式绘制精美统计图

Matplotlib在图形中添加文本说明

Matplotlib在图形中添加注释

Matplotlib在图形中添加辅助网格和辅助线

Matplotlib添加自定义形状

Matplotlib控制坐标轴刻度间距和标签

Matplotlib使用对数刻度和极坐标

Matplotlib绘制子图