Python 带有Qt5Agg后端的matplotlib返回空标签

Python 带有Qt5Agg后端的matplotlib返回空标签,python,matplotlib,pyqt5,Python,Matplotlib,Pyqt5,在以下代码段中,我想在绘图的所有Y轴刻度标签上附加一个百分号: import matplotlib as mpl import pandas as pd from matplotlib import pyplot as plt print mpl.__version__, mpl.get_backend() df = pd.DataFrame({'a': [10, 40], 'b': [20, 30]}) ax = df.plot(kind='bar', title='Plot of Perc

在以下代码段中,我想在绘图的所有Y轴刻度标签上附加一个百分号:

import matplotlib as mpl
import pandas as pd
from matplotlib import pyplot as plt
print mpl.__version__, mpl.get_backend()

df = pd.DataFrame({'a': [10, 40], 'b': [20, 30]})
ax = df.plot(kind='bar', title='Plot of Percentage')
plt.draw()
ax.set_yticklabels([x.get_text() + '%' for x in ax.get_yticklabels()])
ax.get_figure().savefig('test.png', bbox_inches='tight')
在python 2.7.13+matplotlib 1.5.3中,使用后端Qt5Agg,
ax.get\u yticklabels()
返回空
文本
对象的列表,产生以下输出图像:

上述代码段在Python2.6.9+matplotlib 1.4.2+Qt4Agg后端和Python2.6.6+matplotlib 1.3.1+TkAgg后端下正常工作


可能与以下内容有关:

在画布完全绘制之前,标签不会实际填充。由于tickLabel是由
matplotlib.ticker.**Formatter
确定的,因此最好的解决方案当然不是尝试更改tickLabel本身,而是使用一个方便的格式化程序

这里的
FuncFormatter
似乎是一个不错的选择

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker

df = pd.DataFrame({'a': [10, 40], 'b': [20, 30]})
ax = df.plot(kind='bar', title='Plot of Percentage')

func = lambda x, pos: "{} %".format(x)
ax.yaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(func))
plt.show()


无需绘制任何内容,此解决方案也独立于后端。

这不是最佳解决方案,但它可以工作。关闭窗口后,将plt.draw()更改为plt.show(),并使用修改后的labels@eyllanesc:感谢您在线编辑图像。我试图用plt.show()替换sivefig行,但它似乎不起作用。还有其他我错过的环境吗?导入matplotlib作为mpl导入pandas作为pd从matplotlib导入pyplot作为plt打印(mpl.\uu版本,mpl.get\u backend())df=pd.DataFrame({'a':[10,40],'b':[20,30]})ax=df.plot(kind='bar',title='plot of Percentage')plt.show()ax在ax.get_yticklabels()])ax.get_figure().savefig('test.png',bbox_inches='tight')@eyllansc:是的,它起作用了。非常感谢!漫游:首先使用
ax.yaxis.get_ticklocs()
从Ytick中提取数字,然后使用
ax.yaxis.set_ticklegals()
设置带有百分号的新刻度标签。感谢@WuSun的贡献。