You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Matplotlib散点图图例的标记尺寸与对应标签为指定值?

自定义Matplotlib散点图图例的标记尺寸与标签

不需要额外的虚拟数据集来获取handles和labels,直接手动构建图例项或者利用legend_elements的参数配合自定义标签就能实现需求,下面是具体方案:

方法1:手动构建图例项(最直接)

直接创建对应目标尺寸的散点标记作为图例手柄,同时指定自定义标签,完全不需要虚拟数据集:

import matplotlib.pyplot as plt
import numpy as np

x = [1,2,3,4,5]
y = [1,2,3,4,5]
size = np.asarray([0.84,0.53,0.24,0.47,0.18]) * 100

# 绘制原散点图
plt.scatter(x, y, s=size)

# 自定义目标尺寸和对应标签
target_sizes = [20, 40, 60, 80]
custom_labels = [str(s) for s in target_sizes]

# 创建图例手柄:用空坐标绘制对应尺寸的散点,颜色和原散点保持一致
handles = [plt.scatter([], [], s=s, color='C0') for s in target_sizes]

# 添加自定义图例
plt.legend(handles, custom_labels, frameon=False, title="Sizes")

plt.show()

方法2:复用原散点的手柄替换标签

如果想基于原数据的尺寸分布生成图例标记,只替换标签,可以用legend_elements先获取手柄,再替换成自定义内容:

import matplotlib.pyplot as plt
import numpy as np

x = [1,2,3,4,5]
y = [1,2,3,4,5]
size = np.asarray([0.84,0.53,0.24,0.47,0.18]) * 100

s1 = plt.scatter(x, y, s=size)
# 指定生成4个图例项,和目标尺寸数量匹配
handles, _ = s1.legend_elements(prop="sizes", num=4)
# 替换为自定义标签
custom_labels = ["20", "40", "60", "80"]
plt.legend(handles, custom_labels, frameon=False, title="Sizes")

plt.show()

关于虚拟数据集的疑问解答

  • 完全不需要虚拟数据集:上面两种方法都能直接实现需求,没必要额外创建虚拟数据。
  • 若一定要尝试虚拟数据集,alpha=0.0是有效的,但要注意虚拟点不能完全超出坐标轴范围(否则Matplotlib会忽略它),可以把虚拟点放在坐标轴外,比如:
    # 示例:虚拟点方式(不推荐,不如手动构建手柄简洁)
    dummy_scatter = plt.scatter([-100], [-100], s=[20,40,60,80], alpha=0.0)
    handles, _ = dummy_scatter.legend_elements(prop="sizes")
    plt.legend(handles, ["20","40","60","80"], frameon=False, title="Sizes")
    

内容的提问来源于stack exchange,提问作者Klem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:01:44