seaborn绘制heatmap报错:无法将'0:00'字符串转为float的ValueError
错误产生原因
sns.heatmap() 要求传入的绘图数据源所有值均为数值类型,内部会将所有数据转换为浮点数完成颜色映射。
你在分组统计后执行了reset_index()操作,原本作为行索引的interval时间文本列被转为普通数据列,该列存储的"0:00"类字符串无法转换为浮点数,直接触发报错。实际上interval是热力图y轴的分类标签,本就不应该作为热力值数据传入绘图逻辑。
修复方案
绘图前将interval列重新设置为DataFrame的行索引即可,seaborn会自动将DataFrame的行索引作为y轴刻度标签、列名作为x轴刻度标签,不会将索引内容纳入热力值的数值计算,同时你之前做的分类排序逻辑会保留,时间刻度会严格按照你定义的0:00-23:30顺序排列。
完整修正后的绘图代码:
# 排序后将interval设为行索引 p7 = p7.set_index('interval') plt.figure(figsize=(15,12)) sns.heatmap(p7, cmap="Greens") plt.show()
如果需要保留interval作为普通列备用,也可以在绘图时只筛选数值列传入,不需要修改原p7结构:
plt.figure(figsize=(15,12)) # 排除interval列,仅传入星期几对应的数值计数列,手动指定y轴刻度标签 sns.heatmap(p7.drop(columns='interval'), cmap="Greens", yticklabels=p7['interval']) plt.show()
两种方法效果一致,第一种写法更简洁。
内容的提问来源于stack exchange,提问作者octaviodiego78
相关产品推荐
相关产品推荐

