Matplotlib:如何在刻度上显示所有数字?
可能重复的问题:
如何去掉matplotlib坐标轴的相对偏移
我正在绘制一些五位数的数字(比如210.10、210.25、211.35等),这些数字是和日期对应的。我希望y轴的刻度能够显示完整的数字(比如显示'214.20'而不是'0.20 + 2.14e2'),但是我一直没能搞定。我尝试过把刻度标签的格式设置为普通格式,但似乎没有任何效果。
plt.ticklabel_format(style='plain', axis='y')
有没有什么明显的地方是我忽略了的提示呢?
2 个回答
坐标轴上的数字是根据一个特定的Formatter
来定义的。不过,遗憾的是(据我所知),matplotlib并没有提供一个方法来控制从数字变成更小的数字加上偏移量的阈值。一个比较粗暴的方法就是直接设置所有的xtick字符串:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(100, 100.1, 100)
y = np.arange(100)
fig = plt.figure()
plt.plot(x, y)
plt.show() # original problem
# setting the xticks to have 3 decimal places
xx, locs = plt.xticks()
ll = ['%.3f' % a for a in xx]
plt.xticks(xx, ll)
plt.show()
这实际上和使用固定格式化器(FixedFormatter)设置字符串是一样的:
from matplotlib.ticker import FixedFormatter
plt.gca().xaxis.set_major_formatter(FixedFormatter(ll))
不过,这种方法的问题在于标签是固定的。如果你想调整图表的大小或位置,就得重新开始设置。一个更灵活的方法是使用函数格式化器(FuncFormatter):
def form3(x, pos):
""" This function returns a string with 3 decimal places, given the input x"""
return '%.3f' % x
from matplotlib.ticker import FuncFormatter
formatter = FuncFormatter(form3)
gca().xaxis.set_major_formatter(FuncFormatter(formatter))
这样你就可以移动图表,同时保持相同的精度。但是有时候,这并不是最理想的选择。并不是总想要固定的精度。我们希望保留默认的格式化器行为,只是增加一个阈值,让它在达到这个阈值后才开始添加偏移量。可惜的是,没有现成的方法可以做到这一点,所以我最终选择修改源代码。这其实很简单,只需要在ticker.py
文件中的一行改一个字符。如果你查看那个github版本,修改的地方在第497行:
if np.absolute(ave_oom - range_oom) >= 3: # four sig-figs
我通常会把它改成:
if np.absolute(ave_oom - range_oom) >= 5: # four sig-figs
这样发现对我的使用效果很好。修改完matplotlib安装中的这个文件后,记得重启python才能生效。
你也可以直接关闭偏移量:这几乎是对如何去掉matplotlib坐标轴中的相对偏移的一个精确复制。
import matlplotlib is plt
plt.plot([1000, 1001, 1002], [1, 2, 3])
plt.gca().get_xaxis().get_major_formatter().set_useOffset(False)
plt.draw()
这段代码获取当前的axes
,然后获取x轴的axis
对象,再获取主要的格式化对象,并把useOffset
设置为false(详细信息可以查看文档)。