Saltar al contenido

Mostrar lugares decimales y notación científica en el eje de un diagrama de matplotlib

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()

Ejemplo de parcela

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()

ingrese la descripción de la imagen aquí

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()

ingrese la descripción de la imagen aquí

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *