seaborn relplot使用字符串列作hue时触发数值解析报错
问题根因
报错和children列的格式转换无关,核心触发点是你传入了hue_norm=(0, 1)参数。
Seaborn的颜色映射逻辑中,只要检测到hue_norm参数传入,就会强制将hue绑定的列按连续数值型变量处理,主动调用pd.to_numeric()做类型转换,完全不会参考列本身的dtype设置。哪怕你提前把列转成string类型,依然会走数值转换流程,遇到-1_0这类无法解析为数值的字符串就会抛出ValueError。
你之前测试hue="labels"时没有报错,本质是测试时没有同步传入hue_norm参数——如果给labels列也配置hue_norm,会触发完全相同的转换错误。
修复方案
分类变量的颜色映射不需要数值归一化参数,直接从参数字典中删除hue_norm即可正常绘图,修改后的可运行代码:
import pandas as pd import seaborn as sns data = {0: [0.187041, -0.07495, 0.383563, -0.258548, -0.137496], 1: [0.086416, 0.281447, 0.059027, 0.004486, 0.49186], 'node_idx': [0, 1, 2, 3, 4], 'labels': ['tech', 'business', 'tech', 'business', 'business'], 'on': ['train', 'train', 'train', 'train', 'train'], 'likelihoods': [0.205434, 0.113467, 0.130263, 0.192061, 0.05352], 'children': ['-1_0', '-1_1', '-1_0', '-1_15', '-1_1']} df = pd.DataFrame(data) sns_kwargs = {'hue': 'children'} g = sns.relplot(data=df, x=0, y=1, **sns_kwargs)
补充说明
hue_norm仅适用于连续数值型的hue映射,作用是将数值范围归一化到指定区间后再映射渐变色,分类hue走的是离散调色板逻辑,不需要该参数。- 如果需要自定义分类hue的显示颜色,不要用
hue_norm,改用palette参数传入自定义色板或分类-颜色映射字典即可,示例:
# 为每个children分类指定对应显示颜色 custom_palette = { '-1_0': '#1f77b4', '-1_1': '#ff7f0e', '-1_15': '#2ca02c' } sns_kwargs = {'hue': 'children', 'palette': custom_palette} g = sns.relplot(data=df, x=0, y=1, **sns_kwargs)
内容的提问来源于stack exchange,提问作者Alex L
相关产品推荐
相关产品推荐

