Python Seaborn绘制分组箱线图y轴数值显示异常问题求解
问题原因及解决方案
核心问题1:CSV表头字段带前导空格,列名不匹配
你提供的CSV表头字段为index, cluster, type, val,逗号后均带有空格,pandas.read_csv默认不会自动裁剪列名前后的空格,因此读取生成的DataFrame实际列名为index、 cluster、 type、 val。你代码中传入的x="cluster"、y="val"为不存在的列,seaborn无法找到对应y轴数值列时,会默认按分组计数展示,就会出现你遇到的异常表现。
可能的问题2:val列被识别为字符串类型
如果CSV的val字段存在非数字异常值,pandas会将该列识别为object字符串类型,seaborn无法将其作为数值字段做箱线图统计,也会 fallback 到计数逻辑。
修复方案
- 读取CSV时增加
skipinitialspace=True参数,自动忽略逗号后的前导空格 - 显式转换val列为数值类型,过滤异常值
- 可添加列名、列类型打印逻辑,提前排查问题
修复后完整代码如下:
import seaborn as sns import pandas as pd sns.set_theme(style="whitegrid") # 读取时跳过字段前导空格 df = pd.read_csv("C:/tmp/all.csv", skipinitialspace=True) # 验证列名与val列类型,排查问题时可打开注释 # print(df.columns.tolist()) # print(df['val'].dtype) # 显式将val列转为数值类型,非数值异常值转为NaN自动忽略 df['val'] = pd.to_numeric(df['val'], errors='coerce') sns.boxplot(x="cluster", y="val", hue="type", palette=["m", "g"], data=df) sns.despine(offset=10, trim=True)
内容的提问来源于stack exchange,提问作者Cenk Ten
相关产品推荐
相关产品推荐

