使用matplotlib.ticker设置Matplotlib Ytick标签会产生关键错误

时间:2017-01-06 16:48:58

标签: python python-2.7 matplotlib

我想设置y-ticker标签,但仍然将它们绑定到数据上。通过这个问题matplotlib: change yaxis tick labels,我正在尝试使用matplotlib.ticker执行此操作。

我目前只想要三个位置的刻度线:[.25, .5, .75]。图表生成正确,但是使用print语句,我可以看到它遍历每个标签两次以及其他一些不在我的字典中的随机值,从而在这一行产生关键错误:return label_lookup[x]。这些值似乎与每次运行的值不同。是什么导致了这个问题?

import matplotlib as mpl
import matplotlib.pyplot as plt

label_lookup = {.25: 'Label 1',
                .5: 'Label 2',
                .75: 'Label 3'}

def mjrFormatter(x, pos):
    print x, pos
    return label_lookup[x]

ax = plt.gca()
ax.set_yticks([.25,.5,.75], minor=False)
ax.yaxis.set_major_formatter(mpl.ticker.FuncFormatter(mjrFormatter))
plt.draw()
plt.show()

1 个答案:

答案 0 :(得分:2)

我自己并不是matplotlib的专家,但看起来你想要使用FixedFormatter而不是FuncFormatter。 FixedFormatter只接受一系列字符串而不是函数,并发出适当的标签。通过使用FixedFormatter,您只需要3个标签,而使用FuncFormatter时,您必须拥有传入的所有x的有效值。

简单地替换

ax.yaxis.set_major_formatter(mpl.ticker.FuncFormatter(mjrFormatter))

ax.yaxis.set_major_formatter(mpl.ticker.FixedFormatter(['Label 1', 'Label 2', 'Label 3']))

如果没有KeyErrors,您将获得相同的结果。您也可以删除mjrFormatter,因为您已不再使用它。

或者,如果你真的想使用FuncFormatter,你必须能够接受任何x,而不仅仅是0.25,0.5和0.75的精确值。您可以按如下方式重写mjrFormatter

def mjrFormatter(x, pos):
    print x, pos
    if x <= .25:
         return 'Label 1'
    if x <= .5:
         return 'Label 2'
    return 'Label 3'

你的词典label_lookup并没有让我成为理想的做事方式。你可以用足够的努力使它工作,但字典的无序性使得很难有一个简单的不等式检查链,这就是我硬编码值的原因。