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

为Seaborn distplot与表格行配置统一颜色映射的报错解决问询

解决Seaborn distplot颜色映射引发的ValueError问题

我一眼就看出问题出在颜色处理上——你用mcolors.rgb_to_hsv(color)把RGB颜色转成了HSV数组,但Seaborn的distplot(现在更推荐用kdeplot,因为这个函数已经被弃用了)的color参数只接受单个颜色值(比如RGB元组、十六进制字符串,或者命名颜色),而不是数组。当内部代码尝试判断kde_color != color时,面对数组就会抛出"truth value of an array is ambiguous"的错误。

下面是修复后的完整代码,我还顺便优化了几个细节:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import matplotlib.colors as mcolors

# 假设你的item_df已经定义完成
fig, (ax_plot, ax_table) = plt.subplots(nrows=2, figsize=(11.69, 8.27), gridspec_kw=dict(height_ratios=[3, 1]) )
ax_table.axis("off")
item_types = item_df['item_type'].unique()
columns = ('item type', 'Average DR', 'Percent DR passed 50%', 'Percent DR passed 60%', 'Percent DR passed 70%', 'Percent DR passed 80%')
cell_text = []

# 生成统一的颜色映射,直接用RGB格式即可
table_colors = plt.cm.BuPu(np.linspace(0, 0.5, len(item_types)))

for i, item_type in enumerate(item_types):
    item_dr = item_df[item_df['item_type'] == item_type]['interesting_feature'].values
    # 直接使用生成的RGB颜色,不需要转HSV
    color = table_colors[i]
    # 用kdeplot替代distplot(distplot已被废弃),保持颜色一致
    sns.kdeplot(item_dr, fill=False, label=item_type, ax=ax_plot, color=color)
    
    # 计算统计值,保留小数位数让表格更美观
    avg_dr = round(np.mean(item_dr), 2)
    pass50 = round(len(item_dr[item_dr > 0.5]) / len(item_dr) * 100, 1)
    pass60 = round(len(item_dr[item_dr > 0.6]) / len(item_dr) * 100, 1)
    pass70 = round(len(item_dr[item_dr > 0.7]) / len(item_dr) * 100, 1)
    pass80 = round(len(item_dr[item_dr > 0.8]) / len(item_dr) * 100, 1)
    # 把百分比转成带%的字符串,可读性更好
    cell_text.append([str(item_type), f"{avg_dr}", f"{pass50}%", f"{pass60}%", f"{pass70}%", f"{pass80}%"])

# 创建表格,直接用table_colors作为行颜色,和绘图完全匹配
item_table = ax_table.table(cellText=cell_text, colLabels=columns, loc='center', fontsize=20, rowColours=table_colors)
# 调整表格样式提升可读性
item_table.auto_set_font_size(False)
item_table.set_fontsize(12)
item_table.scale(1.2, 1.5)

plt.tight_layout()
plt.show()

关键修复点:

  • 去掉HSV转换:table_colors本身就是可以直接用的RGB颜色数组,不需要转成HSV,直接传给kdeplot的color参数即可。
  • 替换distplot为kdeplot:Seaborn在最新版本中已经标记distplot为废弃函数,用kdeplot替代(加上fill=False就和原来的hist=False效果一致),避免后续版本兼容性问题。
  • 优化表格内容:把统计值保留小数位数并加上百分比符号,让表格更易读;用enumerate替代手动维护i变量,代码更简洁。
  • 统一颜色映射:表格的rowColours和绘图的color用的是同一个颜色数组,确保每行颜色和对应的曲线完全匹配。

这样修改后,不仅解决了ValueError的问题,还让代码更规范,可视化效果也更统一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:52:32