如何在Matplotlib中获得具有独立缩放的多个重叠图?
在数据可视化中,经常需要在同一张图中绘制多个数据集,但这些数据集的数据范围数量级可能不同,导致该图的可视化效果不佳。在Matplotlib库中,我们可以使用Axes
对象的twinx
或twinny
方法来创建具有独立Y轴或X轴的复合图表。本篇文章将介绍如何使用Axes
对象以及具体的代码实现。
## 创建依赖 Axes对象
首先,使用Matplotlib创建两张具有不同数据范围的图。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 10, 0.1)
y1 = -np.exp(-x)
y2 = np.sin(x)
fig, ax1 = plt.subplots()
ax1.plot(x, y1, 'g-')
ax1.tick_params(axis='y', labelcolor='g')
ax2 = ax1.twinx()
ax2.plot(x, y2, 'b-')
ax2.tick_params(axis='y', labelcolor='b')
plt.show()
该代码会生成两个数据集的重叠图,其中绿线表示 y_1 数据集,蓝线表示 y_2 数据集。这里使用了twinx
方法,使得该数据集沿着 y_2 横轴绘制,ax1.tick_params
和ax2.tick_params
分别设置两张图的 Y 轴颜色,以区分不同数据集。
通过使用twinx
和twinny
方法,我们可以创建多张图表并对其进行组合以创建具有独立缩放的复合图表。
在同一Y轴上创建多个数据集
让我们来看一个有趣的例子。想象一下,我们有一组称为“网站流量”的数据,而我们还想同时检查“日志文件中的错误率”。两个数据集具有完全不同的范围和单位,我们可以使用Axes
对象来创建一组组合图表来获得这些信息。
# 生成数据
days = np.arange(5)
traffic = [20, 25, 19, 18, 23]
errors = [0.1, 0.1, 0.2, 0.3, 0.05]
# 绘制两个数据集
fig, ax1 = plt.subplots()
ax1.plot(days, traffic, 'r-*')
ax1.set_xlabel("Day")
ax1.set_ylabel("Traffic", color='r')
ax1.tick_params(axis="y", color='r')
ax2 = ax1.twinx()
ax2.plot(days, errors, 'b-o')
ax2.set_xlabel("Day")
ax2.set_ylabel("Error rate", color='b')
ax2.tick_params(axis="y", color='b')
plt.show()
我们的代码绘制了有关网站流量和错误率的两个数据集,红色线表示网站的流量,蓝色线表示日志文件中的错误率。
可以看到,Axes
对象使我们可以在单个子图中折叠不同数据范围和解释的数据。不仅如此,twinx
可以添加两轴,但是我们还可以使用Matplotlib来在同一张图上创建多个Y轴!
在同一X轴上创建多个数据集
现在,让我们尝试在同一张图上绘制多个X轴数据集的例子。
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
x = np.arange(0, 10, 0.1)
y1 = -np.exp(-x)
fig, ax1 = plt.subplots()
# 绘制第一个数据集
ax1.plot(x, y1, 'g-')
ax1.set_xlabel("X")
ax1.set_ylabel("Y1", color='g')
ax1.tick_params(axis="y", color='g')
# 添加第二个X轴
ax2 = ax1.twiny()
new_tick_locations = np.array([2, 4, 6, 8])
def tick_function(X):
V = 2* X
return ["%.1f" % z for z in V]
ax2.set_xlim(ax1.get_xlim())
ax2.set_xticks(new_tick_locations)
ax2.set_xticklabels(tick_function(new_tick_locations))
ax2.set_xlabel("X'")
ax2.tick_params(axis="x", labelcolor='r')
plt.show()
代码绘制了一个类似于平行坐标的图表,其中红色线表示第二数据集。我们创建了一个新的X轴,它位于第一个X轴正上方,并使用twiny
添加到图表中。注释中的代码将新轴限制为与原始X轴相同的范围。我们还将定位新刻度标签并标记为“X’”。
我们已经覆盖了如何在单个图表中创建一个以上的轴,让我们深入了解如何创建独立的子图。
创建独立的子图
我们经常需要在单个图表中绘制多个子图,每个子图具有自己的X轴和Y轴。Matplotlib的subplot
函数通过将图表分成行或列来帮助我们轻松地创建子图。该函数需要三个参数:
subplot(num_rows, num_columns, plot_number)
num_rows和num_columns分别表示子图网格的行和列数,而plot_number表示当前子图的位置。让我们看一个简单的例子:
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 6 * np.pi, 1000)
y = np.sin(x)
# 创建子图
fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(8, 6))
# 绘制第一个子图
axs[0].plot(x, y, 'r')
axs[0].set_title('Sin(x)')
# 绘制第二个子图
axs[1].plot(x, np.cos(x), 'b')
axs[1].set_title('Cos(x)')
# 将两个子图居中
fig.tight_layout()
# 显示图表
plt.show()
该代码将绘制在一个包含两个子图的网格中,第一个子图将绘制sin(x),而第二个子图将绘制cos(x)。
这两个子图都包含自己的X轴和Y轴,因此它们可以显示不同的数据。同样,Matplotlib还可以使用gridspec
来更精细地进行布局,例如,gridspec
使我们能够绘制不规则形状的子图。
结论
在Matplotlib库中,使用Axes
对象来创建具有独立缩放的多个重叠图的方法是twinx
和twinny
。它们可以在同一张图上绘制多个数据集,而不必担心它们的数据范围和单位之间的差异。除了具有多个Y轴或X轴的复合图表外,我们还可以使用subplot
函数创建独立的子图,并使用gridspec
来调整子图的布局。掌握这些技术可以帮助我们更好地可视化数据并更清晰地传达信息。