You need to enable JavaScript to run this app. matplotlib柱状图Y轴显示异常的问题排查与代码修复
优惠活动
大模型
产品
解决方案
定价
更多

matplotlib柱状图Y轴显示异常的问题排查与代码修复

Y轴显示异常的核心原因

这个异常的核心是数据类型不匹配,根源出在numpy数组的构造逻辑上:

  • numpy是典型的同质数据结构,要求数组内所有元素为同一类型。当你构造数组时同时写入字符串和整数元素,numpy会自动触发类型提升,把所有元素强制转换为Unicode字符串类型,不会保留数值列的数字属性。
  • 将这个全字符串的二维数组传给pandas转为DataFrame后,原本计划作为柱高的a[1]列,存储的全是'2'、'1'这类字符串格式的数字,而非可参与数值计算的整型或浮点型。
  • matplotlib的plt.bar函数不会对传入的高度参数做隐式类型转换,接收到字符串类型的序列时,会把每个字符串值识别为独立的分类标签,而非可排序的数值。最终Y轴不会按照数值大小从低到高排布,而是按照字符串值在数据中出现的顺序排列,就出现了刻度混乱、柱高和实际数值不匹配的异常显示。
代码中存在的具体错误
  • 混用不同类型的元素构造numpy数组,没有考虑numpy的同质数据特性,导致原本的数值列被强制转为字符串类型,丢失数值属性。
  • 将全字符串类型的数组直接转为DataFrame后,没有对绘图使用的y轴列做类型校验和转换,直接传入绘图函数触发类型不匹配问题。
修复方法

最小改动修复(保留原有代码结构)

只需要在生成DataFrame之后,把绘图用到的a[1]列从字符串转为数值类型即可,改动量最小:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

b = np.array([['a',2,3],['b',1,3],['c',4,4],['d',5,6],['e',5,5],['f',6,6]])
a = pd.DataFrame(b)
# 新增类型转换行,将字符串格式的数字转为可用于绘图的数值型
a[1] = pd.to_numeric(a[1])

plt.figure(figsize=(8,8))
plt.bar(a[0], a[1], color='r')
plt.show()

源头规范修复

numpy不适合存储字符串、数字混合的异构数据,更推荐直接用pandas原生方式构造DataFrame,让pandas自动推断每列的正确类型,从根源上避免numpy的强制类型转换问题:

import pandas as pd
import matplotlib.pyplot as plt

# 直接传入原生列表构造DataFrame,pandas会逐列匹配正确数据类型
a = pd.DataFrame([
    ['a',2,3],
    ['b',1,3],
    ['c',4,4],
    ['d',5,6],
    ['e',5,5],
    ['f',6,6]
])

plt.figure(figsize=(8,8))
plt.bar(a[0], a[1], color='r')
plt.show()

内容的提问来源于stack exchange,提问作者Sagnik Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 07:54:07