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

Matplotlib中如何同时显示颜色映射与检测方法双图例?

问题原因

你遇到的问题核心是Matplotlib中每次调用ax.legend()都会替换当前坐标轴上已有的图例:第一次调用生成颜色映射图例后,第二次调用ax.legend()会直接覆盖掉之前的图例对象,所以最终只显示最后一次创建的检测方法图例。

解决方法

下面提供两种可靠的解决思路:

方法一:保留第一个图例对象

先生成颜色映射图例并将其保存为独立对象,通过ax.add_artist()将其添加为坐标轴的固定元素,这样后续调用ax.legend()就不会覆盖它:

import numpy as np
import matplotlib.pyplot as plt

a=np.random.uniform(0,100,(10,10)).ravel() #My x
b=np.random.uniform(0,100,(10,10)).ravel() #My y
d=np.random.choice([0,1,2],(10,10)).ravel()  #Color map
e=np.random.choice(["radial","transit"],(10,10)).ravel() #Marker type

a_radial=a[e=="radial"]
b_radial=b[e=="radial"]
d_radial=d[e=="radial"]

a_transit=a[e=="transit"]
b_transit=b[e=="transit"]
d_transit=d[e=='transit']

fig,ax=plt.subplots()

scatter1=ax.scatter(a_radial,b_radial,c=d_radial,marker='o',label="Radial")
scatter2=ax.scatter(a_transit,b_transit,c=d_transit,marker='^',label="Transit")

# 生成颜色映射图例并保存为对象
color_legend = ax.legend(*scatter1.legend_elements(), loc=(1.04, 0), title="Color")
# 将颜色图例添加为轴的固定艺术家,避免被后续图例覆盖
ax.add_artist(color_legend)

# 生成检测方法图例,位置可以根据需要调整
ax.legend(loc=(1.01, 0.3), title="Detection")

plt.tight_layout()
plt.show()

方法二:在图层面创建多个独立图例

直接使用fig.legend()在整个画布层面创建多个图例,每个图例都是独立的,不存在覆盖问题:

import numpy as np
import matplotlib.pyplot as plt

a=np.random.uniform(0,100,(10,10)).ravel() #My x
b=np.random.uniform(0,100,(10,10)).ravel() #My y
d=np.random.choice([0,1,2],(10,10)).ravel()  #Color map
e=np.random.choice(["radial","transit"],(10,10)).ravel() #Marker type

a_radial=a[e=="radial"]
b_radial=b[e=="radial"]
d_radial=d[e=="radial"]

a_transit=a[e=="transit"]
b_transit=b[e=="transit"]
d_transit=d[e=='transit']

fig,ax=plt.subplots()

scatter1=ax.scatter(a_radial,b_radial,c=d_radial,marker='o',label="Radial")
scatter2=ax.scatter(a_transit,b_transit,c=d_transit,marker='^',label="Transit")

# 添加颜色映射图例到图层面
fig.legend(*scatter1.legend_elements(), loc=(1.04, 0), title="Color")
# 添加检测方法图例到图层面,指定对应的散点对象和标签
fig.legend([scatter1, scatter2], ["Radial", "Transit"], loc=(1.01, 0.3), title="Detection")

plt.tight_layout()
plt.show()

注意事项

  • 两种方法都可以调整loc参数来改变图例的位置,避免重叠;
  • 如果颜色映射的取值范围在两个散点组中一致,用scatter1.legend_elements()生成的图例就能代表全部数据的颜色含义;如果两组颜色范围不同,需要单独处理颜色图例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:30:51