创建带有图例的散点图

MatplotlibMatplotlibBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

散点图用于可视化两个变量之间的关系。当数据中有多个组,并且我们希望在图中区分它们时,带有图例的散点图会很有用。在本实验中,我们将学习如何使用Matplotlib库在Python中创建带有图例的散点图。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问Jupyter Notebook进行练习。

有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向Labby提问。课程结束后提供反馈,我们将立即为你解决问题。

导入所需库

我们首先导入必要的库,包括NumPy和Matplotlib。

import matplotlib.pyplot as plt
import numpy as np

创建带有多个组的散点图

我们可以通过遍历每个组并为该组创建一个散点图来创建带有多个组的散点图。我们分别使用 csalpha 参数为每个组指定标记的颜色、大小和透明度。我们还将 label 参数设置为组名,该组名将用于图例中。

fig, ax = plt.subplots()
for color in ['tab:blue', 'tab:orange', 'tab:green']:
    n = 750
    x, y = np.random.rand(2, n)
    scale = 200.0 * np.random.rand(n)
    ax.scatter(x, y, c=color, s=scale, label=color,
               alpha=0.3, edgecolors='none')

ax.legend()
ax.grid(True)

plt.show()

自动创建图例

我们还可以使用 PathCollection.legend_elements 方法为散点图自动创建图例。此方法将尝试确定要显示的有用数量的图例条目,并返回句柄和标签的元组。

N = 45
x, y = np.random.rand(2, N)
c = np.random.randint(1, 5, size=N)
s = np.random.randint(10, 220, size=N)

fig, ax = plt.subplots()

scatter = ax.scatter(x, y, c=c, s=s)

## 从散点图中使用唯一颜色生成一个图例
legend1 = ax.legend(*scatter.legend_elements(),
                    loc="lower left", title="Classes")
ax.add_artist(legend1)

## 从散点图中使用大小的一个横截面生成一个图例
handles, labels = scatter.legend_elements(prop="sizes", alpha=0.6)
legend2 = ax.legend(handles, labels, loc="upper right", title="Sizes")

plt.show()

自定义图例元素

我们可以通过在 PathCollection.legend_elements 方法中使用其他参数来进一步自定义图例元素。例如,我们可以指定要创建的图例条目的数量以及它们应该如何标注。

volume = np.random.rayleigh(27, size=40)
amount = np.random.poisson(10, size=40)
ranking = np.random.normal(size=40)
price = np.random.uniform(1, 10, size=40)

fig, ax = plt.subplots()

## 因为当将价格作为 `s` 的大小提供时,价格太小了,
## 所以我们将其归一化为一些有用的点大小,s = 0.3 * (价格 * 3) ** 2
scatter = ax.scatter(volume, amount, c=ranking, s=0.3 * (price * 3) ** 2,
                     vmin=-3, vmax=3, cmap="Spectral")

## 为排名(颜色)生成一个图例。即使有40种不同的排名,
## 我们只想在图例中显示其中的5种。
legend1 = ax.legend(*scatter.legend_elements(num=5),
                    loc="upper left", title="Ranking")
ax.add_artist(legend1)

## 为价格(大小)生成一个图例。因为我们想用美元显示价格,
## 所以我们使用 *func* 参数来提供用于从上面计算大小的函数的反函数。
## *fmt* 确保以美元显示价格。请注意,我们这里目标是5个元素,
## 但由于为我们自动选择的舍入价格,在创建的图例中只得到了4个。
kw = dict(prop="sizes", num=5, color=scatter.cmap(0.7), fmt="$ {x:.2f}",
          func=lambda s: np.sqrt(s/.3)/3)
legend2 = ax.legend(*scatter.legend_elements(**kw),
                    loc="lower right", title="Price")

plt.show()

总结

在本实验中,我们学习了如何使用Matplotlib库在Python中创建带有图例的散点图。我们创建了带有多个组的散点图并实现了自动创建图例。我们还使用 PathCollection.legend_elements 方法自定义了图例元素。带有图例的散点图对于可视化具有多个组的两个变量之间的关系很有用。