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

求助:如何在Matplotlib中实现自定义分类图例

实现分类式外部图例的解决方案

要实现你需要的分类图例(按cat1颜色、cat2标记分组)并将图例放在右侧外部,可按以下方式修改代码:

核心思路

  • 手动创建两组独立的图例条目,避免每个数据点重复生成图例项
  • 分两次添加图例,通过参数控制位置到图表右侧外部,同时调整布局防止图例被截断

修改后的完整代码

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

data = {'x': [0, 1, 2, 3],
        'y': [3, 2, 1, 0],
        'cat1': ['A', 'B', 'A', 'B'],
        'cat2': ['f', 'g', 'h', 'i']}

df = pd.DataFrame(data)

colors = {'A':'tab:red', 'B':'tab:blue'}
markers = {'f':"o", 'g':"v", 'h':"s", 'i':"+"}

fig, ax = plt.subplots()

# 绘制散点图,不设置label,避免每个点都生成图例项
for i in range(df.shape[0]):
    ax.scatter(df.loc[i,'x'], 
               df.loc[i,'y'], 
               color=colors[df.loc[i,'cat1']], 
               marker=markers[df.loc[i,'cat2']])

# 手动创建cat1的颜色图例条目
color_legend_items = [
    Line2D([0], [0], marker='o', color='w', markerfacecolor=color, markersize=10, label=cat) 
    for cat, color in colors.items()
]
# 手动创建cat2的标记图例条目
marker_legend_items = [
    Line2D([0], [0], marker=marker, color='k', linestyle='', markersize=10, label=cat) 
    for cat, marker in markers.items()
]

# 添加第一组图例(cat1颜色),放到右侧外部顶部
first_legend = ax.legend(handles=color_legend_items, title='cat1', loc='upper left', bbox_to_anchor=(1.02, 1))
ax.add_artist(first_legend)  # 保留第一个图例,避免被第二个覆盖

# 添加第二组图例(cat2标记),放到右侧外部中部
ax.legend(handles=marker_legend_items, title='cat2', loc='upper left', bbox_to_anchor=(1.02, 0.7))

# 调整右侧边距,确保图例完整显示
plt.subplots_adjust(right=0.8)

plt.show()

关键细节说明

  1. 取消自动图例:绘制散点时去掉原代码中的label参数,防止每个数据点都生成重复的图例项
  2. 自定义图例元素:用Line2D构建纯颜色/纯标记的图例条目,模拟散点的视觉效果
  3. 双图例布局:通过bbox_to_anchor参数控制图例位置在图表右侧外部,用add_artist保留第一组图例,避免被第二组覆盖
  4. 布局调整:plt.subplots_adjust(right=0.8)缩小图表右侧宽度,给图例留出足够空间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:20:32