如何在Matplotlib中为同-NumPy数组的分组散点图添加图例
解决Matplotlib中同一数组分组数据的图例添加问题
嘿,我刚好碰到过类似的需求,给你分享几个简单有效的方案,帮你给散点图加上清晰的图例!
你的核心问题在于:一次性绘制所有散点时,Matplotlib无法区分不同分组的点,自然没法自动生成图例。所以我们需要按标签分组,分别绘制每个组的点,这样每个组就能对应一个图例项了。
方案一:按标签分组循环绘制(最直观)
这是最容易理解和实现的方法,步骤很简单:
- 获取所有唯一的标签值
- 循环每个标签,筛选出对应的数据点单独绘制
- 给每个分组的
scatter调用指定label参数 - 最后调用
legend()生成图例
完整代码示例
import matplotlib.pyplot as plt import numpy as np # 模拟你的四列数据集(替换成你自己的数据即可) data = np.random.rand(100, 4) data[:, 3] = np.random.choice([1, 2, 3], size=100) # 最后一列是1/2/3的标签 x = data[:, 0] y = data[:, 1] labels = data[:, 3] fig = plt.figure() ax = fig.add_subplot(111) # 获取所有不重复的标签 unique_labels = np.unique(labels) # 自定义颜色列表(可选,也可以用Matplotlib默认颜色循环) colors = ['#FF5733', '#33FF57', '#3357FF'] # 循环绘制每个分组 for idx, label in enumerate(unique_labels): # 筛选当前标签对应的所有点 group_mask = labels == label # 绘制散点:大小用15*label,颜色对应自定义列表,同时设置label ax.scatter( x[group_mask], y[group_mask], s=15*label, c=colors[idx], label=f'Group {int(label)}' ) # 添加图例,还可以用loc参数调整位置,比如loc='upper left' ax.legend(title='Groups') plt.show()
补充说明
- 如果你不想自定义颜色,Matplotlib的默认颜色循环(
C0、C1、C2...)也能直接用,比如c=f'C{idx}' - 图例的样式可以通过
legend()的参数调整,比如title设置图例标题,bbox_to_anchor=(1.05, 1)把图例放在图的右侧外面,避免遮挡数据 - 要是你的标签不是数字,也完全适用,只需要把
label=f'Group {int(label)}'改成对应的名称就行
这样操作后,你就能得到每个分组对应的清晰图例啦!
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

