You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修正细节

  1. 变量名对齐:确保plt.bar的参数和你定义的变量一致,比如原代码里要改成plt.bar(year_array, mean_sales_array)。
  2. 二维转一维:
    • 用循环逻辑时,不要用np.delete,直接通过索引取列:year_array = mean_per_year_array[:,0],这样直接得到一维数组。
    • 若已有二维数组,也可以用flatten()转换:year_array.flatten()、mean_sales_array.flatten()后传入plt.bar。
  3. 高效均值计算:用np.unique配合np.bincount可以避免循环,数据量较大时效率更高,同时避免手动处理数组维度的麻烦。

内容的提问来源于stack exchange,提问作者usama hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:00:50