Установите научную нотацию с фиксированным показателем и значащими цифрами для нескольких подсетей

Я пытаюсь зафиксировать оси для научной нотации двух разных наборов данных, где один [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() 

введите описание изображения здесь

    Вы можете подclassифицировать matplotlib.ticker.ScalarFormatter и исправить атрибут orderOfMagnitude до 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 всегда -4 а self.format всегда "%1.1f" .

    введите описание изображения здесь

    Давайте будем гением компьютера.