使用viridis色图且handlelength=0时图例无颜色问题
解决Matplotlib中viridis色图配合handlelength=0时图例空白的问题
问题现象
使用viridis色图绘制多条曲线,设置handlelength=0后图例完全空白;不修改该参数时图例正常显示;改用c='C'+str(i)这类字符串颜色时,handlelength=0能正常生效。环境为Matplotlib 3.6.2、Python 3.9.13。
原因分析
问题出在颜色参数的传递方式:plt.cm.viridis([einds[i]/einds.max()])返回的是二维RGBA数组(形状为(1,4)),而plot函数接收二维颜色数组时,会将其解析为多个颜色值,导致图例的handle被拆分成多个极短的不可见片段,再加上handlelength=0的设置,就彻底无法显示。而使用'C'+str(i)这类单值颜色时,不会触发这个解析逻辑。
解决方案
将viridis返回的二维颜色数组转换为一维,有两种方式:
- 去掉方括号,直接传入标量值:
plt.cm.viridis(einds[i]/einds.max()) - 对颜色数组做降维处理:
plt.cm.viridis([einds[i]/einds.max()]).flatten()
修改后的代码
import matplotlib.pyplot as plt import numpy as np energy = np.linspace(40., 75., 36) einds = np.linspace(0, 35, 8).astype(int) fig, ax = plt.subplots(1, 1, figsize=(4,3), dpi=150) for i in range(0, len(einds)): # 关键改动:去掉颜色参数的方括号,传入标量获取一维RGBA数组 ax.plot(energy, energy+i, c=plt.cm.viridis(einds[i]/einds.max()), label='{:.0f}keV'.format(energy[einds[i]])) ax.grid() leg=ax.legend(handlelength=0, handletextpad=0, fancybox=1, framealpha=1, loc='upper right', labelcolor='linecolor') # 注:设置handlelength=0后,图例handle已不可见,可省略下面的循环 # for item in leg.legendHandles: # item.set_visible(False) plt.tight_layout() plt.show()
效果验证
修改后,图例将仅显示带对应颜色的文字,线条handle被隐藏,符合预期效果。
内容的提问来源于stack exchange,提问作者Steven Thomas
相关产品推荐
相关产品推荐

