Python绘制逐个垂直柱状图报错:str与float运算不支持
问题原因与解决办法
核心原因
你使用的Matplotlib版本过低(当前是适配Python3.6的旧版本),在该版本中plt.bar()的第一个参数(x轴位置)不支持直接传入字符串列表,内部会尝试对字符串执行数值运算(如报错中的减法操作),从而触发类型错误。
解决方法
有两种可行的修复方式:
升级Matplotlib版本:更新到支持直接传入字符串作为x轴标签的新版本(推荐,旧版本存在较多兼容性问题),执行命令:
pip install --upgrade matplotlib升级后原有代码可直接正常运行,
plt.bar()会自动处理字符串标签。手动指定x轴位置与标签:若无法升级版本,修改代码先传入数值型x轴位置,再通过
plt.xticks()设置字符串标签:for state in us_census_new.State: data = us_census_new[us_census_new['State'] == state] if data[['Hispanic_freq', 'White_freq']].isnull().values.any(): print(f'Missing value in {state}') else: values = data[['Hispanic_freq', 'White_freq']].values.tolist()[0] # 用数值作为x轴位置,再设置对应标签 x_pos = [0, 1] labels = ['Hispanic_freq', 'White_freq'] plt.bar(x_pos, values) plt.xticks(x_pos, labels) plt.title(f'{state} Demographic Frequencies') # 可选:添加标题区分不同州 plt.show() plt.clf()
额外优化建议
可以改用groupby优化循环逻辑,避免每次循环重复过滤数据,提升效率:
for state, data in us_census_new.groupby('State'): values = data[['Hispanic_freq', 'White_freq']].iloc[0].tolist() x_pos = [0, 1] labels = ['Hispanic_freq', 'White_freq'] plt.bar(x_pos, values) plt.xticks(x_pos, labels) plt.title(state) plt.show() plt.clf()
内容的提问来源于stack exchange,提问作者Konrad Lubelski
相关产品推荐
相关产品推荐

