如何修改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
相关产品推荐
相关产品推荐

