Matplotlib X 轴刻度标签无效
1. X轴标签不显示
我正在使用Matplotlib来生成一个直方图,数据来自一些测量值:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as pyplot
...
fig = pyplot.figure()
ax = fig.add_subplot(1,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图像看起来不错,但有两个问题:
- 标题(“Spam and Ham”)在PNG中缺失。虽然x轴和y轴的标签都有显示(不过我在下面的示例中没有开启它们)。
- x轴的标签似乎完全不正常——它没有在所有柱子底下显示,而是被渲染成一行数字,位于图的左下角,且被截断了。这似乎还影响了我的Y轴标签的显示。
2. 单位和国际单位制前缀
注意:这不是Matplotlib特有的问题。
这个直方图的x轴上是时间测量值,范围从微秒到毫秒和秒。目前,图表将x轴的标签显示为标准的秒数。
我希望能更友好地显示时间,想要以毫秒或微秒的值来表示,并且显示单位。这意味着我希望有一些方法可以友好地格式化时间值,并考虑到国际单位制的前缀。
实际上,这可能和这里的示例程序很相似:
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/
不过,从我所了解的情况来看,上述库似乎都没有处理国际单位制前缀,或者没有提供这种友好的格式化功能。有什么建议或替代方案吗?
2 个回答
如果你想在坐标轴标签上添加国际单位制的前缀,可以使用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)
1.1: PNG中缺少标题('Spam and Ham')。
你写了
pyplot.title='Foobar'
你想要
pyplot.title("Spam and Ham")
pyplot.title='Foobar' 只是把标题功能替换成了一个字符串。
1.2: x轴刻度标签似乎完全不对劲
我觉得 ax.set_xticklabels([n], rotation='vertical')
可能不是你想要的,因为我觉得 n 不是你想的那样。对于测量值 [1,2,3,4],我们得到:
>>> n, bins, patches = ax.hist([1,2,3,4])
>>> n
array([1, 0, 0, 1, 0, 0, 1, 0, 0, 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] 其实也没必要。我不太确定你想做什么,但你可以从区间生成字符串标签(除非你想要很多数字!),或者如果你只是想让 x 轴的刻度标签竖着显示,你可以使用
for label in ax.get_xticklabels():
label.set_rotation('vertical')
抱歉,我对单位库的事情一无所知。