Matplotlib绘制柱状图报错:float()参数不能为NoneType
解决Matplotlib柱状图的NoneType错误问题
问题根源分析
你遇到的错误主要来自两个问题:
- 变量名不匹配:代码里定义的是
year_array和mean_sales_array,但调用plt.bar时用了未定义的year和mean_sales,这会直接引发变量未定义问题(你提到报错为NoneType,大概率是实际代码里变量名写对了,但数组维度不符合要求)。 - 数组维度错误:你的
year_array和mean_sales_array是二维数组(格式类似[[2001], [2002]],shape为(n,1)),而plt.bar要求传入一维数组,二维数组会被解析成嵌套序列,导致内部处理时出现NoneType异常。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt # 假设array_converted是你的原始数据数组,shape为(m,2),第一列年份、第二列销售额 # 方式1:更高效的均值计算(替代循环) years_unique, indices = np.unique(array_converted[:,0], return_inverse=True) mean_per_year = np.bincount(indices, weights=array_converted[:,1]) / np.bincount(indices) # 方式2:保留你的循环逻辑,修正数组处理 # mean_per_year = [] # for x in sorted(np.unique(array_converted[...,0])): # mean_per_year.append([x, np.average(array_converted[np.where(array_converted[...,0]==x)][...,1])]) # mean_per_year_array = np.array(mean_per_year) # year_array = mean_per_year_array[:,0].astype('int64') # 直接取第一列,得到一维数组 # mean_sales_array = mean_per_year_array[:,1].astype('int64') # 直接取第二列,得到一维数组 # 绘制柱状图 plt.bar(years_unique.astype('int64'), mean_per_year.astype('int64')) plt.xlabel('Years') plt.ylabel('Mean Sales per Year') plt.title('Mean Sales by Year') plt.show()
关键修正细节
- 变量名对齐:确保
plt.bar的参数和你定义的变量一致,比如原代码里要改成plt.bar(year_array, mean_sales_array)。 - 二维转一维:
- 用循环逻辑时,不要用
np.delete,直接通过索引取列:year_array = mean_per_year_array[:,0],这样直接得到一维数组。 - 若已有二维数组,也可以用
flatten()转换:year_array.flatten()、mean_sales_array.flatten()后传入plt.bar。
- 用循环逻辑时,不要用
- 高效均值计算:用
np.unique配合np.bincount可以避免循环,数据量较大时效率更高,同时避免手动处理数组维度的麻烦。
内容的提问来源于stack exchange,提问作者usama hussain
相关产品推荐
相关产品推荐

