Matplotlib barh报错:不支持unicode与float的减法运算求解
解决matplotlib barh设置yticklabels时的TypeError问题
嘿,这个坑我之前踩过!其实问题根本不是列表和数组的差异,而是你对barh()函数的参数用法理解错啦~
问题根源
barh()的第一个参数需要的是y轴上的数值位置(比如0、1、2这样的整数),但你直接传了unicode字符串列表a。matplotlib在计算条形的布局、间距时会做一些数值运算(比如减去浮点数来调整对齐),当它尝试对字符串做减法时,就会抛出那个TypeError: unsupported operand type(s) for -: 'unicode' and 'float'错误。
修正步骤
你需要先给每个条形分配一个数值型的y轴位置,再通过yticks()把这些位置映射成你的标签:
- 用
np.arange(len(a))生成和标签数量对应的数值序列(比如[0,1,2]) - 把这个数值序列传给
barh()的第一个参数 - 调用
yticks(),把数值位置和你的标签列表对应起来
修正后的完整代码
from matplotlib.pyplot import figure, xlabel, barh, yticks import numpy as np a = [u'name1', u'name2', u'name3'] b = np.array([6.35, 6.414, 6.400]) figure('bar', figsize=(11,5)) # 生成数值型y轴位置 y_positions = np.arange(len(a)) # 用数值位置调用barh barh(y_positions, b, align='center', alpha=0.5) # 映射数值位置到自定义标签 yticks(y_positions, a) xlabel('yield (%)')
这样运行就不会报错啦,而且y轴会正确显示你设置的标签。
内容的提问来源于stack exchange,提问作者Noob Programmer
相关产品推荐
相关产品推荐

