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

如何为分类散点图添加带标题的自定义单行图例并任意定位?

散点图图例添加问题解决

问题背景

已实现按ABC列数值区间(<2浅蓝、2-4蓝色、4-6橙色、≥6棕色)分类的散点图,但无法正常添加符合要求的图例:

  • 图例需包含标题
  • 单行显示
  • 使用colour_names作为标签
  • 可自定义位置

当前绘图代码:

import numpy as np
import matplotlib.pyplot as plt

# 假设df是已加载的DataFrame
x = np.array(df['Date'])
y = np.array(df['PR'])
colours = np.array(df['colour'])
colormap = np.array(['cyan', 'dodgerblue', 'orangered','brown'])
colour_names = ['very less', 'less', 'good', 'more']

scatter = plt.scatter(x,y, c = colormap[colours], s = 5)

尝试添加图例的代码无效,且出现以下警告:

UserWarning: 未使用带数组的集合。请确保通过c参数指定要进行颜色映射的值。
WARNING:matplotlib.legend: 未找到可放入图例的带标签的元素。请注意,当不带参数调用legend()时,标签以下划线开头的元素会被忽略。

问题原因

scatter.legend_elements()方法仅适用于通过数值数组映射颜色的场景(即c参数传入数值而非直接的颜色值)。而当前代码直接传入了颜色数组,导致该方法无法生成有效的图例元素,因此无法正常显示图例。

解决方案

手动创建图例的标记元素,对应每个颜色类别,再添加图例并设置相关参数:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

# 原有绘图代码
x = np.array(df['Date'])
y = np.array(df['PR'])
colours = np.array(df['colour'])
colormap = np.array(['cyan', 'dodgerblue', 'orangered','brown'])
colour_names = ['very less', 'less', 'good', 'more']

scatter = plt.scatter(x,y, c = colormap[colours], s = 5)

# 手动创建图例handles
legend_handles = [
    Line2D([0], [0], marker='o', color='w', markerfacecolor=color, markersize=8, label=name)
    for color, name in zip(colormap, colour_names)
]

# 添加图例:设置标题、单行显示、位置(loc可选值如'upper right'、'lower left'等)
plt.legend(
    handles=legend_handles,
    title='ABC',
    ncol=4,  # 设置为4列实现单行显示
    loc='upper right'  # 自定义位置,可根据需求修改
)

plt.show()

参数说明

  • ncol=4:将图例设置为4列,实现单行显示
  • loc:设置图例位置,可选值包括'upper left'、'lower right'、'center'等,也可传入坐标元组如(0.5, 0.95)实现精确定位
  • markersize:调整图例中标记的大小,可根据需求修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:05:15