No olvides que en la informática un error casi siempre tiene varias resoluciones, pero nosotros te mostramos lo más óptimo y mejor.
Solución:
Esto es realmente fácil de hacer si usas el matplotlib.ticker.FormatStrFormatter
a diferencia de la LogFormatter
. El siguiente código etiquetará todo con el formato '%.2e'
:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(0, 300, 20)
y = np.linspace(0,300, 20)
y = y*1e16
ax.plot(x,y)
ax.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2e'))
plt.show()
Para obtener etiquetas bien formateadas en notación científica, se pueden usar las capacidades de formato de un ScalarFormatter
que usa MathText (Latex) y lo aplica a las etiquetas.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as mticker
fig, ax = plt.subplots()
x = np.linspace(0, 300, 20)
y = np.linspace(0,300, 20)
y = y*1e16
ax.plot(x,y)
f = mticker.ScalarFormatter(useOffset=False, useMathText=True)
g = lambda x,pos : "$$".format(f._formatSciNotation('%1.10e' % x))
plt.gca().yaxis.set_major_formatter(mticker.FuncFormatter(g))
plt.show()
Si bien esto puede ser útil en muchos casos, en realidad no cumple con los requisitos de la pregunta. Para tener dígitos iguales en todas las etiquetas, se puede usar una versión más personalizada.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as mticker
fig, ax = plt.subplots()
x = np.linspace(0, 300, 20)
y = np.linspace(0,300, 20)
y = y*1e16
ax.plot(x,y)
class MathTextSciFormatter(mticker.Formatter):
def __init__(self, fmt="%1.2e"):
self.fmt = fmt
def __call__(self, x, pos=None):
s = self.fmt % x
decimal_point = '.'
positive_sign = '+'
tup = s.split('e')
significand = tup[0].rstrip(decimal_point)
sign = tup[1][0].replace(positive_sign, '')
exponent = tup[1][1:].lstrip('0')
if exponent:
exponent = '10^%s%s' % (sign, exponent)
if significand and exponent:
s = r'%stimes%s' % (significand, exponent)
else:
s = r'%s%s' % (significand, exponent)
return "$$".format(s)
# Format with 2 decimal places
plt.gca().yaxis.set_major_formatter(MathTextSciFormatter("%1.2e"))
plt.show()
Si piensas que te ha sido de provecho nuestro artículo, sería de mucha ayuda si lo compartieras con más desarrolladores de esta forma nos ayudas a difundir esta información.