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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:47:19