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

