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

