¿Cómo configuro el tamaño de fuente de las etiquetas de título y ejes de la figura en Matplotlib?

531

Estoy creando una figura en Matplotlib como esta:

from matplotlib import pyplot as plt

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
fig.savefig('test.jpg')

Quiero especificar tamaños de fuente para el título de la figura y las etiquetas del eje. Necesito que los tres tengan diferentes tamaños de fuente, por lo que establecer un tamaño de fuente global ( mpl.rcParams['font.size']=x) no es lo que quiero. ¿Cómo configuro los tamaños de fuente para el título de la figura y las etiquetas del eje individualmente?

vasek1
fuente
1
Tenía curiosidad, así que traté de agregar su mpl.rcParams['font.size'] = 20e intenté cambiar los valores a 10 y 14. Primero descubrí que recibía errores a menos que cambiara mpla plt. Ese cambio borró el error, pero luego la línea de código no tuvo efecto en mis títulos o etiquetas. ¿Seguro que esta sintaxis es correcta?
TMWP
Ahora estoy pensando en los comentarios sobre la respuesta aceptada que el problema podría ser mi declaración de importación, aunque el motivo por el que no arroja un error si no importé el comando está más allá de mí. ¿Hay otra línea de importación que usó al probar el mplcomando?
TMWP

Respuestas:

774

Funciones relacionadas con el texto como label, title, etc. aceptan parámetros mismos como matplotlib.text.Text. Para el tamaño de fuente que puede usar size/fontsize:

from matplotlib import pyplot as plt    

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title', fontsize=20)
plt.xlabel('xlabel', fontsize=18)
plt.ylabel('ylabel', fontsize=16)
fig.savefig('test.jpg')

Para ajustes titley labeltamaños globales , mpl.rcParamscontiene axes.titlesizey axes.labelsize. (De la página):

axes.titlesize      : large   # fontsize of the axes title
axes.labelsize      : medium  # fontsize of the x any y labels

(Hasta donde puedo ver, no hay forma de establecer xy yetiquetar los tamaños por separado).

Y veo que eso axes.titlesizeno afecta suptitle. Supongo que debes configurarlo manualmente.

Avaris
fuente
¡Gracias! ¿hay alguna manera de configurarlo globalmente pero explícitamente para (suptitle, xlabel, ylabel)? Estoy haciendo muchos gráficos y solo quiero especificarlo una vez ...
vasek1
@ vasek1: pensé que no querías una configuración global :). Para eso necesitas mpl.rcParams. He editado mi respuesta.
Avaris
16
Para cualquier otra persona como yo que busca la solución para cambiar el tamaño del título:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen
Desde el rcParamsenlace, use figure.titlesizeademás de axes.titlesize.
Físico loco
1
@AlexanderMcFarlane. Me encontré python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. El resultado es 1.5.1, True. 1) ¿Qué versión de matplotlib está utilizando? ¿Qué versión de Python? 2) ¿Podría ser un error donde, por alguna razón, acepta strpero no unicodeen Py2?
Físico loco
90

También puede hacer esto globalmente a través de un diccionario rcParams:

import matplotlib.pylab as pylab
params = {'legend.fontsize': 'x-large',
          'figure.figsize': (15, 5),
         'axes.labelsize': 'x-large',
         'axes.titlesize':'x-large',
         'xtick.labelsize':'x-large',
         'ytick.labelsize':'x-large'}
pylab.rcParams.update(params)
tsando
fuente
55
¿Qué son otros tamaños además 'x-large'?
Martin Thoma
15
'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'. Ver matplotlib.org/api/…
tsando
Use pylab.rcParams.keys()para ver la lista completa de parámetros.
Nirmal
Gracias. ¿Hay una manera de establecer a nivel mundial tamaños explícitos numéricos para el título y el eje de las etiquetas en lugar de hacer siempre ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Parece que rcParamssolo acepta cadenas.
timgeb
44
También puedes usar números ...'axes.labelsize': 32,
mimoralea
65

Si está más acostumbrado a usar axobjetos para trazar, puede encontrar el ax.xaxis.label.set_size()más fácil de recordar, o al menos más fácil de encontrar usando la pestaña en un terminal ipython. Parece necesitar una operación de redibujo después de ver el efecto. Por ejemplo:

import matplotlib.pyplot as plt

# set up a plot with dummy data
fig, ax = plt.subplots()
x = [0, 1, 2]
y = [0, 3, 9]
ax.plot(x,y)

# title and labels, setting initial sizes
fig.suptitle('test title', fontsize=12)
ax.set_xlabel('xlabel', fontsize=10)
ax.set_ylabel('ylabel', fontsize='medium')   # relative to plt.rcParams['font.size']

# setting label sizes after creation
ax.xaxis.label.set_size(20)
plt.draw()

No conozco una forma similar de establecer el tamaño del título después de crearlo.

girar
fuente
fig.suptitle('test title', fontsize = 20)parece funcionar. ax.set_xlabel('xlabel', fontsize = 20)' also works, in which case we can do away with ax.xaxis.label.set_size (20) `.
T_T
1
@T_T Eso es cierto, y estos formularios son similares a la respuesta de Avaris anterior. Los agregaré para completar. Todavía encuentro un uso para ax.xaxis.label.set_size()cuando estoy trabajando interactivamente con un diagrama de ipython y quiero hacer una evaluación visual rápida de una variedad de tamaños de fuente.
spinup
¿Sabes si hay alguna diferencia (oculta) entre usar objetos de hacha y objetos de figura, o si ambos son perfectamente equivalentes? ¿Por qué hay diferentes interfaces para algunas de las características? (plt.xlabel () vs. ax.set_xlabel ())
normanius
1
@normanius, si te refieres a ax e fig en el ejemplo anterior, son objetos bastante diferentes: fig es la figura general, que puede contener varios ejes. Entonces higo y hacha tienen diferentes propiedades. En términos de la diferencia entre las llamadas de tipo pyplot y las llamadas de objeto (por ejemplo, plt.xlabel()vs. ax.set_xlabel()como usted dice), son equivalentes, con la advertencia de que las plt.*funciones funcionan en el eje / figura actual . Por lo tanto, si configura una figura con varios ejes, probablemente quiera usar llamadas explícitas ax1.set_xlabel()para evitar confusiones.
spinup
20

Para modificar solo la fuente del título (y no la fuente del eje) utilicé esto:

import matplotlib.pyplot as plt
fig = plt.Figure()
ax = fig.add_subplot(111)
ax.set_title('My Title', fontdict={'fontsize': 8, 'fontweight': 'medium'})

El fontdict acepta todos los kwargs de matplotlib.text.Text .

Tammoj
fuente
8

Según la guía oficial , pylabya no se recomienda el uso de. matplotlib.pyplotdebe usarse directamente en su lugar.

La configuración global de los tamaños de fuente a través de rcParamsdebe hacerse con

import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 16
plt.rcParams['axes.titlesize'] = 16

# or

params = {'axes.labelsize': 16,
          'axes.titlesize': 16}
plt.rcParams.update(params)

# or

import matplotlib as mpl
mpl.rc('axes', labelsize=16, titlesize=16)

# or 

axes = {'labelsize': 16,
        'titlesize': 16}
mpl.rc('axes', **axes)

Los valores predeterminados se pueden restaurar utilizando

plt.rcParams.update(plt.rcParamsDefault)

También puede hacer esto creando una hoja de estilo en el stylelibdirectorio bajo el directorio de configuración matplotlib (puede obtener su directorio de configuración matplotlib.get_configdir()). El formato de la hoja de estilo es

axes.labelsize: 16
axes.titlesize: 16

Si tiene una hoja de estilo en /path/to/mpl_configdir/stylelib/mystyle.mplstyle, puede usarla a través de

plt.style.use('mystyle')

# or, for a single section

with plt.style.context('mystyle'):
    # ...

También puede crear (o modificar) un archivo matplotlibrc que comparta el formato

axes.labelsize = 16
axes.titlesize = 16

Según el archivo matplotlibrc que modifique, estos cambios se usarán solo para el directorio de trabajo actual, para todos los directorios de trabajo que no tengan un archivo matplotlibrc o para todos los directorios de trabajo que no tengan un archivo matplotlibrc y donde ningún otro archivo matplotlibrc tenga ha sido especificado Ver esta sección de la página de personalización de matplotlib para obtener más detalles.

Puede obtener una lista completa de las rcParamsclaves plt.rcParams.keys(), pero para ajustar los tamaños de fuente que tiene (cursiva citada desde aquí )

  • axes.labelsize- Tamaño de fuente de las etiquetas x e y
  • axes.titlesize- Tamaño de fuente del título de los ejes
  • figure.titlesize- Tamaño del título de la figura ( Figure.suptitle())
  • xtick.labelsize- Tamaño de fuente de las etiquetas de marca
  • ytick.labelsize- Tamaño de fuente de las etiquetas de marca
  • legend.fontsize- Fontsize para leyendas ( plt.legend(), fig.legend())
  • legend.title_fontsize- Tamaño de fuente para títulos de leyenda, se Noneestablece en los mismos que los ejes predeterminados. Vea esta respuesta para el ejemplo de uso.

todos los cuales aceptan tamaños de cadena {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}o una floatpulg pt. Los tamaños de cadena se definen en relación con el tamaño de fuente predeterminado que se especifica mediante

  • font.size- el tamaño de fuente predeterminado para el texto, dado en pts. 10 pt es el valor estándar

Además, el peso se puede especificar (aunque solo para el valor predeterminado que aparece) por

  • font.weight- El peso predeterminado de la fuente utilizada por text.Text. Acepta {100, 200, 300, 400, 500, 600, 700, 800, 900}o 'normal'(400), 'bold'(700) 'lighter', y 'bolder'(en relación con el peso actual ).
William Miller
fuente
2

Una solución alternativa para cambiar el tamaño de fuente es cambiar el relleno. Cuando Python guarda su PNG, puede cambiar el diseño utilizando el cuadro de diálogo que se abre. El espacio entre los ejes, el relleno, si lo desea, puede modificarse en esta etapa.

Naz
fuente
2

Colocar right_axantesset_ylabel()

ax.right_ax.set_ylabel('AB scale')

Chane Badr Eddine
fuente
-3

7 (mejor solución)

 from numpy import*
 import matplotlib.pyplot as plt
 X = linspace(-pi, pi, 1000)

class Crtaj:

    def nacrtaj(self,x,y):
         self.x=x
         self.y=y
         return plt.plot (x,y,"om")

def oznaci(self):
    return plt.xlabel("x-os"), plt.ylabel("y-os"), plt.grid(b=True)

6 (solución ligeramente peor)

from numpy import*
M = array([[3,2,3],[1,2,6]])
class AriSred(object):
    def __init__(self,m):
    self.m=m

def srednja(self):
    redovi = len(M)
    stupci = len (M[0])
    lista=[]
    a=0
    suma=0
    while a<stupci:
        for i in range (0,redovi):
            suma=suma+ M[i,a]
        lista.append(suma)
        a=a+1
        suma=0
    b=array(lista) 
    b=b/redovi
    return b



OBJ = AriSred(M)
sr = OBJ.srednja()
cambiaformas123
fuente
2
Si bien este código puede proporcionar una solución al problema de OP, se recomienda encarecidamente que proporcione un contexto adicional sobre por qué y / o cómo este código responde a la pregunta. Las respuestas de código solo generalmente se vuelven inútiles a largo plazo porque los futuros espectadores que experimentan problemas similares no pueden entender el razonamiento detrás de la solución.
E. Zeytinci