求助:如何在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()
关键细节说明
- 取消自动图例:绘制散点时去掉原代码中的
label参数,防止每个数据点都生成重复的图例项 - 自定义图例元素:用
Line2D构建纯颜色/纯标记的图例条目,模拟散点的视觉效果 - 双图例布局:通过
bbox_to_anchor参数控制图例位置在图表右侧外部,用add_artist保留第一组图例,避免被第二组覆盖 - 布局调整:
plt.subplots_adjust(right=0.8)缩小图表右侧宽度,给图例留出足够空间
内容的提问来源于stack exchange,提问作者EVS_93
相关产品推荐
相关产品推荐

