matplotlib:将轴的偏移值格式化为整数或特定的数字

我有一个matplotlib图,我绘制的数据总是被称为纳秒(1e-9)。 在y轴上,如果我有数十纳秒的数据,即。 44e-9,轴上的数值显示为4.4,a + 1e-8作为偏移量。 有没有办法迫使轴显示44 + 1e-9偏移量?

我的x轴也是一样,轴显示+ 5.54478e4,我宁愿显示偏移量+55447(整数,无小数 – 这里的值是以天为单位)。

我已经尝试了几个这样的事情:

p = axes.plot(x,y) p.ticklabel_format(style='plain') 

对于X轴,但这不起作用,虽然我可能使用它不正确或错误地解释文档的东西,有人可以指出我在正确的方向吗?

谢谢,乔纳森

问题例证


我试着用格式化程序做一些事情,但还没有find任何解决scheme…:

 myyfmt = ScalarFormatter(useOffset=True) myyfmt._set_offset(1e9) axes.get_yaxis().set_major_formatter(myyfmt) 

 myxfmt = ScalarFormatter(useOffset=True) myxfmt.set_portlimits((-9,5)) axes.get_xaxis().set_major_formatter(myxfmt) 

在一个侧面说明中,我实际上对于“偏移号码”对象实际所在的位置感到困惑……它是主要/次要蜱的一部分吗?

我有完全相同的问题,这两行解决了这个问题:

 y_formatter = matplotlib.ticker.ScalarFormatter(useOffset=False) ax.yaxis.set_major_formatter(y_formatter) 

更简单的解决scheme是简单地自定义刻度标签。 以这个例子:

 from pylab import * # Generate some random data... x = linspace(55478, 55486, 100) y = random(100) - 0.5 y = cumsum(y) y -= y.min() y *= 1e-8 # plot plot(x,y) # xticks locs,labels = xticks() xticks(locs, map(lambda x: "%g" % x, locs)) # ytikcs locs,labels = yticks() yticks(locs, map(lambda x: "%.1f" % x, locs*1e9)) ylabel('microseconds (1E-9)') show() 

替代文字

注意在y轴的情况下,我乘以1e9的值,然后在y标签中提到这个常量


编辑

另一种方法是通过手动将文本添加到图的顶部来伪造指数乘数:

 locs,labels = yticks() yticks(locs, map(lambda x: "%.1f" % x, locs*1e9)) text(0.0, 1.01, '1e-9', fontsize=10, transform = gca().transAxes) 

EDIT2

您也可以用相同的方式格式化x轴偏移值:

 locs,labels = xticks() xticks(locs, map(lambda x: "%g" % x, locs-min(locs))) text(0.92, -0.07, "+%g" % min(locs), fontsize=10, transform = gca().transAxes) 

替代文字

你必须ScalarFormatter来做你所需要的… _set_offset只是添加一个常量,你想设置ScalarFormatter.orderOfMagnitude 。 不幸的是,手动设置orderOfMagnitude将不会执行任何操作,因为当调用ScalarFormatter实例来格式化轴刻度标签时,它会被重置。 它不应该是这个复杂的,但我找不到一个更简单的方法去做你想要的…这是一个例子:

 import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import ScalarFormatter, FormatStrFormatter class FixedOrderFormatter(ScalarFormatter): """Formats axis ticks using scientific notation with a constant order of magnitude""" def __init__(self, order_of_mag=0, useOffset=True, useMathText=False): self._order_of_mag = order_of_mag ScalarFormatter.__init__(self, useOffset=useOffset, useMathText=useMathText) def _set_orderOfMagnitude(self, range): """Over-riding this to avoid having orderOfMagnitude reset elsewhere""" self.orderOfMagnitude = self._order_of_mag # Generate some random data... x = np.linspace(55478, 55486, 100) y = np.random.random(100) - 0.5 y = np.cumsum(y) y -= y.min() y *= 1e-8 # Plot the data... fig = plt.figure() ax = fig.add_subplot(111) ax.plot(x, y, 'b-') # Force the y-axis ticks to use 1e-9 as a base exponent ax.yaxis.set_major_formatter(FixedOrderFormatter(-9)) # Make the x-axis ticks formatted to 0 decimal places ax.xaxis.set_major_formatter(FormatStrFormatter('%0.0f')) plt.show() 

这产生了类似的东西: 替代文字

而默认的格式将如下所示: 替代文字

希望有所帮助!

编辑:为什么它的价值,我不知道抵消标签居住在哪里…只是手动设置它会稍微容易,但我不知道如何做到这一点…我感觉必须有比这一切更简单的方法。 它工作,虽然!

与Amro的答案类似,您可以使用FuncFormatter

 import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter # Generate some random data... x = np.linspace(55478, 55486, 100) y = np.random.random(100) - 0.5 y = np.cumsum(y) y -= y.min() y *= 1e-8 # Plot the data... fig = plt.figure() ax = fig.add_subplot(111) ax.plot(x, y, 'b-') # Force the y-axis ticks to use 1e-9 as a base exponent ax.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: ('%.1f')%(x*1e9))) ax.set_ylabel('microseconds (1E-9)') # Make the x-axis ticks formatted to 0 decimal places ax.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: '%.0f'%x)) plt.show() 

我认为更优雅的方式是使用股​​票格式化程序。 这是一个xaxis和yaxis的例子:

 from pylab import * from matplotlib.ticker import MultipleLocator, FormatStrFormatter majorLocator = MultipleLocator(20) xFormatter = FormatStrFormatter('%d') yFormatter = FormatStrFormatter('%.2f') minorLocator = MultipleLocator(5) t = arange(0.0, 100.0, 0.1) s = sin(0.1*pi*t)*exp(-t*0.01) ax = subplot(111) plot(t,s) ax.xaxis.set_major_locator(majorLocator) ax.xaxis.set_major_formatter(xFormatter) ax.yaxis.set_major_formatter(yFormatter) #for the minor ticks, use no labels; default NullFormatter ax.xaxis.set_minor_locator(minorLocator) 

贡萨洛的解决scheme在joinset_scientific(False)后开始为我工作:

 ax=gca() fmt=matplotlib.ticker.ScalarFormatter(useOffset=False) fmt.set_scientific(False) ax.xaxis.set_major_formatter(fmt) 

正如在评论和这个答案中已经指出的那样,可以通过执行以下操作来全局地closures偏移量:

 matplotlib.rcParams['axes.formatter.useoffset'] = False 

对于第二部分,没有手动重置所有的滴答,这是我的解决scheme:

 class CustomScalarFormatter(ScalarFormatter): def format_data(self, value): if self._useLocale: s = locale.format_string('%1.2g', (value,)) else: s = '%1.2g' % value s = self._formatSciNotation(s) return self.fix_minus(s) xmajorformatter = CustomScalarFormatter() # default useOffset=True axes.get_xaxis().set_major_formatter(xmajorformatter) 

显然你可以将格式string设置为任何你想要的。