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

Matplotlib散点图:图例置绘图区外及多组数据共用色条报错

解决Matplotlib外部图例与多散点图共享色条问题

错误原因解析

  1. 第一个报错:plt.legend()默认创建轴级图例,而loc="outside center left"仅支持图级图例(属于整个画布的图例),参数不兼容导致报错。
  2. 第二个报错:plt.scatter()返回的是PathCollection(散点集合对象),并非Figure画布对象,因此没有legend()方法。

修正后的代码

import matplotlib.pyplot as plt

norm = plt.Normalize(55, 1954)
# 显式创建画布和绘图区域对象,明确层级关系
fig, ax = plt.subplots()

# 在指定绘图区域绘制散点,保存其中一组的返回值用于共享色条
scatter1 = ax.scatter(
    [75,75,63,145,47], [0.979687,1.07782,2.83995,4.35468,4.44244],
    c=[75,75,70,70,70], norm=norm, label='s1', cmap='gist_rainbow', marker='o'
)
ax.scatter(
    [173,65], [0.263218,3.12112],
    c=[77,68], norm=norm, label='s2', cmap='gist_rainbow', marker='v'
)

# 基于其中一组散点创建色条,确保多组数据共享同一色条映射
fig.colorbar(scatter1, ax=ax).set_label('score')

# 使用画布级别的legend方法,设置外部位置
fig.legend(loc="outside center left", bbox_to_anchor=(0, 0.5))

# 保存时自动适配图例和色条的位置,避免截断
plt.savefig('file.svg', bbox_inches='tight', pad_inches=0.1)
plt.show()

关键修改说明

  • 显式创建fig和ax:区分画布(figure)和绘图区域(axes),避免依赖pyplot隐式调用,更精准控制元素位置。
  • 共享色条:将其中一组散点的PathCollection对象传给fig.colorbar(),因多组数据使用了相同的norm和cmap,色条能正确映射所有数据的颜色值。
  • 图级图例:调用fig.legend()而非轴级的ax.legend(),支持outside位置参数;通过bbox_to_anchor可微调图例位置(如(0.02, 0.5)可增加与绘图区域的间距)。

额外说明

关于Axes3D的警告,是由于系统中可能存在多个Matplotlib版本冲突导致,若无需3D绘图可忽略;如需解决,建议卸载多余版本后重新安装单一版本的Matplotlib。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:31:10