Matplotlib Xticklabels不起作用

问题描述

1. X-ticklabel不起作用 我正在使用Matplotlib从一些测量结果生成直方图:
import matplotlib
matplotlib.use(\'Agg\')
import matplotlib.pyplot as pyplot
...
fig = pyplot.figure()
ax = fig.add_subplot(1,1,)
n,bins,patches = ax.hist(measurements,bins=50,range=(graph_minimum,graph_maximum),histtype=\'bar\')

ax.set_xticklabels([n],rotation=\'vertical\')


for patch in patches:
    patch.set_facecolor(\'r\')

pyplot.title=\'Foobar\'
#pyplot.grid(True)
pyplot.xlabel(\'X-Axis\')
pyplot.ylabel(\'Y-Axis\')
pyplot.savefig(output_filename)
产生的PNG看起来不错,除了两个问题: PNG中缺少标题(\'Spam and Ham \')。 x和y轴标签都存在(尽管我没有为下面的示例打开它们)。 x-tick-lables似乎已完全损坏-而不是沿着所有条形图的底部显示,而是将其渲染为图形左下角下方的单线数字。它似乎也禁用了我的Y轴标签。 2.单位和SI前缀 注意:不是Matplotlib特有的。 直方图沿x轴具有时间测量值。这些范围从微秒范围到毫秒和秒范围。此刻,该图形将x轴标签呈现为标准表示法中的秒数。 我想对格式进行友好格式化,宁愿以毫秒/微秒为单位给出时间,并以单位为单位。因此,这意味着我希望可以通过SI前缀来友好地格式化时间值。 实际上,它可能与此处的示例程序非常相似: http://diveintopython3.org/your-first-python-program.html 我确实注意到有一些可以处理单位的Python库: http://juanreyero.com/open/magnitude/index.html http://home.scarlet.be/be052320/Unum.html http://pypi.python.org/pypi/units/ 但是,据我所读,上面的任何句柄似乎都不是SI前缀,也不是进行这种友好的格式化。有什么建议/替代品吗?     

解决方法

        1.1:PNG中缺少标题(\'Spam and Ham \')。 你写了
pyplot.title=\'Foobar\'
你要
pyplot.title(\"Spam and Ham\")
pyplot.title = \'Foobar \'只是将标题函数替换为字符串。 1.2:x刻度符号似乎完全损坏 ISTM
ax.set_xticklabels([n],rotation=\'vertical\')
可能不是您想要执行的操作,因为我不认为n是您认为的。对于度量[1,2,3,4],我们得到:
>>> n,bins,patches = ax.hist([1,4])
>>> n
array([1,1,1])
>>> bins
array([ 1.,1.3,1.6,1.9,2.2,2.5,2.8,3.1,3.4,3.7,4. ])
>>> patches
<a list of 10 Patch objects>
n是一个数组,在箱中包含计数,而不是箱位置;它是y轴,而不是x。而且,它已经是列表,因此无论如何都不需要使用[n]。我不确定您要做什么,但是您可以从垃圾箱中制作字符串标签(除非您想要很多数字!),或者,如果您只希望xtick标签是垂直的,则可以使用
for label in ax.get_xticklabels():
    label.set_rotation(\'vertical\')
恐怕我对单元库一无所知。     ,        要将SI前缀添加到轴标签中,您要使用QuantiPhy。实际上,在其文档中有一个示例显示了如何执行此操作:MatPlotLib示例。 我认为您可以在代码中添加以下内容:
from matplotlib.ticker import FuncFormatter
from quantiphy import Quantity

time_fmtr = FuncFormatter(lambda v,p: Quantity(v,\'s\').render(prec=2))
ax.xaxis.set_major_formatter(time_fmtr)