Matplotlib set_yticklabels移位

时间:2018-04-20 17:45:57

标签: matplotlib bar-chart

给出以下代码:

import matplotlib.pyplot as plt
import numpy as np

x = [1.0, 1.1, 2.0, 5.7]
y = np.arange(len(x))
fsize=(2,2)
fig, ax = plt.subplots(1,1,figsize=fsize)
ax.set_yticklabels(['a','b','c','d'])
ax.barh(y,x,align='center',color='grey')
plt.show()

为什么标签没有按预期显示('a'没有显示,所有内容都向下移动了1个位置?)

enter image description here

2 个答案:

答案 0 :(得分:2)

定位器在每一侧都生成额外的刻度(由于它们在绘制的数据之外,因此未显示)。请尝试以下方法:

>>> ax.get_yticks()
array([-1.,  0.,  1.,  2.,  3.,  4.])

你有几个选择。您可以对刻度标签进行硬编码以包含额外的刻度(我认为这是一个坏主意):

ax.set_yticklabels(list(' abcd')) # You don't really need 'e'

或者,您可以将标记设置为您希望它们与标签一起显示的位置:

ax.set_yticks(y)
ax.set_yticklabels(list('abcd'))

对滴答问题更正式的解决方案是在y轴上设置Locator对象。通过为y轴设置Formatter来正式解决刻度标签问题。无论如何,当你拨打set_yticksset_yticklabels时,这基本上就是在幕后发生的事情,但这样你就可以完全控制:

from matplotlib.ticker import FixedLocator, FixedFormatter

...

ax.yaxis.set_major_locator(FixedLocator(y))
ax.yaxis.set_major_formatter(FixedFormatter(list('abcd')))

答案 1 :(得分:0)

不,在Windows Python 3.7上,这些都不适合我。 只需将其打印为x轴位置在x最小值左侧的文本即可。

import matplotlib.pyplot as plt
import numpy as np

ax.set_yticklabels("")
x = [1.0, 1.1, 2.0, 5.7]
y = np.arange(len(x))
fsize=(2,2)
fig, ax = plt.subplots(1,1,figsize=fsize)
    names = ['a','b','c','d']
    for i in np.arange(len(x)):
        plt.text(-0.05,len(x)-i-1,names[i])
    plt.show()