python 2.7 - suma - Establezca notación científica con exponente fijo y dígitos significativos para múltiples subtramas
para que sirve la notacion cientifica (1)
Puede subclasificar
matplotlib.ticker.ScalarFormatter
y fijar el atributo
orderOfMagnitude
al número que desee (en este caso
-4
).
De la misma manera, puede arreglar el formato que se utilizará.
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()
Si bien esto puede parecer complicado a primera vista, lo único que realmente hace es sobrescribir los métodos privados
_set_orderOfMagnitude
y
_set_format
y evitar así que hagan algunas cosas sofisticadas en el fondo que no queremos.
Porque al final, todo lo que necesitamos es que, independientemente de lo que ocurra internamente,
self.orderOfMagnitude
sea siempre
-4
y
self.format
sea siempre
"%1.1f"
.
Estoy tratando de arreglar los ejes a la notación científica de dos conjuntos diferentes de datos donde uno es [1-9] x1e-3 y el otro es [1-9] x1e-4. Me gustaría establecer que ambos ejes sean 10 ^ -4 y que tengan un dígito después del decimal (por ejemplo,% .1e). Aquí hay una versión simple con la que he intentado jugar: me gustaría que los números en los ejes sean al menos 1 y quiero que ambas potencias sean iguales.
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()