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
相关产品推荐
相关产品推荐

