Notación científica en el eje (estilo literario): ¿cómo cambiar la fuente predeterminada?

Resuelto vrvn asked hace 10 meses • 1 respuestas

Necesito una notación científica de estilo literario en ambos ejes en matplotlib con una fuente específica.

En mi búsqueda encontré esta pregunta con una respuesta para notación científica de estilo literario de ImportanceOfBeingErnest: Mostrar lugares decimales y notación científica en el eje.

Sin embargo, no hay detalles sobre cómo cambiar la fuente.

Mi código:

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

fig,ax=plt.subplots(1,1,figsize=[7,7])

x=np.linspace(0,0.1,10**3)
y=x**2

ax.plot(x,y)

# code from ImportanceOfBeingErnest
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'%s{\times}%s' % (significand, exponent)
        else:
            s =  r'%s%s' % (significand, exponent)
        return "${}$".format(s)

# Format with 2 decimal places
plt.gca().xaxis.set_major_formatter(MathTextSciFormatter("%1.2e"))
plt.gca().yaxis.set_major_formatter(MathTextSciFormatter("%1.2e"))
# end of code from ImportanceOfBeingErnest

plt.xticks(rotation=45,font="Arial",fontsize=20)

for tick in ax.get_yticklabels():
    tick.set_fontname("Arial")

Resultado: gráfico a partir del código

Se implementa la notación científica de estilo literario, pero ninguno de los dos métodos de cambio de fuente funciona. Curiosamente, el tamaño de fuente se puede cambiar.

¿Alguien podría proporcionar una solución para cambiar la fuente con esta notación?

matplotlib 3.5.3

vrvn avatar Feb 16 '24 19:02 vrvn
Aceptado

Está utilizando matplotlibel procesador de texto matemático interno de 's con r'$...$'sintaxis, pero está cambiando la fuente solo para texto normal. Podrías usar

import matplotlib as mpl

mpl.rcParams["mathtext.fontset"] = 'custom'
mpl.rcParams['mathtext.rm']='Arial'

para cambiar las fuentes matemáticas en todas partes, que es probablemente lo que buscas. Preferiría Arimo , que es una fuente gratuita métricamente compatible con Arial. Consulte la documentación para obtener detalles sobre cómo personalizar fuentes individuales en negrita, caligráficas, etc.

Alternativamente, puede utilizar un renderizador TeX externo con

mpl.rc('text', usetex=True)

pero deberá proporcionar el preámbulo de LaTeX necesario para utilizar la fuente Arial.

Krishnadev N avatar Feb 16 '2024 13:02 Krishnadev N