为多个子图设置固定指数和有效数字的科学记数法

时间:2017-03-07 18:58:53

标签: python-2.7 matplotlib label axes

我正在尝试将轴固定为两个不同数据集的科学记数法,其中一个是[1-9] x1e-3,另一个是[1-9] x1e-4。我想将两个轴设置为10 ^ -4并且在十进制之后具有一位数(例如%。1e)。这是一个我尝试过的简单版本:我希望轴上的数字至少为1,我希望两种力量都相同。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1,9,9)
y1 = x*10**(-4)
y2 = x*10**(-3)

fig, ax = plt.subplots(2,1,sharex=True)

ax[0].plot(x,y1)
ax[0].ticklabel_format(axis='y', style='sci', scilimits=(-4,-4))
ax[0].yaxis.major.formatter._useMathText = True
ax[1].plot(x,y2)
ax[1].ticklabel_format(axis='y', style='sci', scilimits=(-4,-4))
ax[1].yaxis.major.formatter._useMathText = True

plt.show()

enter image description here

1 个答案:

答案 0 :(得分:6)

您可以将matplotlib.ticker.ScalarFormatter子类化并将orderOfMagnitude属性修改为您喜欢的数字(在本例中为-4)。
以同样的方式,您可以修复要使用的格式。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker

class OOMFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, order=0, fformat="%1.1f", offset=True, mathText=True):
        self.oom = order
        self.fformat = fformat
        matplotlib.ticker.ScalarFormatter.__init__(self,useOffset=offset,useMathText=mathText)
    def _set_orderOfMagnitude(self, nothing):
        self.orderOfMagnitude = self.oom
    def _set_format(self, vmin, vmax):
        self.format = self.fformat
        if self._useMathText:
            self.format = '$%s$' % matplotlib.ticker._mathdefault(self.format)



x = np.linspace(1,9,9)
y1 = x*10**(-4)
y2 = x*10**(-3)

fig, ax = plt.subplots(2,1,sharex=True)

ax[0].plot(x,y1)
ax[1].plot(x,y2)

for axe in ax:
    axe.yaxis.set_major_formatter(OOMFormatter(-4, "%1.1f"))
    axe.ticklabel_format(axis='y', style='sci', scilimits=(-4,-4))

plt.show()

虽然这看起来似乎很复杂,但它真正做的唯一事情就是覆盖私有方法_set_orderOfMagnitude_set_format,从而阻止他们在后台做一些复杂的事情。不想要。因为最终,我们所需要的只是,self.orderOfMagnitude始终是-4self.format总是"%1.1f"

enter image description here