使用Matplotlib绘制柱状图时遇TypeError错误求解(已筛选total>400行)
问题分析与解决
你的报错核心原因是传给plt.bar的y轴参数不是单个数值序列,而是包含数组/无效对象的集合,再加上代码里存在冗余逻辑、未定义变量的问题,导致Matplotlib无法解析数据。
先拆解你代码里的几个明显问题:
- 已经用pandas筛选出了符合条件的
df3,却又重复用numpy读取同一份文件,完全没必要,反而增加了复杂度。 - 代码里
total和df1两个变量根本没定义,循环里的valuesforlevel = total[levels_values['month']==i]和m = df1都是无效操作,最终total_amount里存的都是错误值。 - 用
set处理month会打乱原有顺序,而且你已经筛选出了total>400的行,不需要再做多余的分组操作。
简化后的正确代码
直接利用你已经筛选好的df3来绘制柱状图即可,步骤如下:
import pandas as pd import matplotlib.pyplot as plt # 读取数据并筛选符合条件的行 df2 = pd.read_csv("1.csv", index_col='month') df3 = df2[df2.total > 400] # 绘制柱状图 plt.figure(figsize=(10, 6)) # 调整合适的尺寸,不用设50这么大 plt.bar(df3.index, df3['total'], color='teal') # 添加标签和标题,优化显示 plt.xlabel('月份') plt.ylabel('总金额') plt.title('总金额大于400的月份统计') plt.xticks(rotation=45) # 旋转x轴标签避免重叠 plt.tight_layout() # 自动调整布局 plt.show()
代码说明
- 直接使用筛选后的
df3,它的index是month,total列就是你需要的数值,直接传给plt.bar的x和y参数即可。 - 调整了画布尺寸,避免过大导致显示异常;添加了标签和旋转x轴标签,提升图表可读性。
- 去掉了冗余的numpy读取和无效的循环逻辑,代码更简洁且逻辑清晰。
如果你的需求是按月份分组求和后筛选总金额大于400的月份,可以再调整代码:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv("1.csv") # 按月份分组求和 month_total = df.groupby('month')['total'].sum() # 筛选求和后总金额大于400的月份 filtered_data = month_total[month_total > 400] # 绘制柱状图 plt.figure(figsize=(10, 6)) plt.bar(filtered_data.index, filtered_data.values, color='teal') plt.xlabel('月份') plt.ylabel('总金额') plt.title('月总金额大于400的统计') plt.xticks(rotation=45) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者unleashed
相关产品推荐
相关产品推荐

