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

719

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 de los ejes. 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 de los ejes individualmente?

3
  • 1
    Tenía curiosidad, así que traté de agregar su mpl.rcParams['font.size'] = 20y traté de cambiar los valores a 10 y 14. Primero descubrí que tenía errores a menos que cambiara mpla plt. Ese cambio borró el error, pero luego la línea de código no tuvo ningún efecto en mis títulos o etiquetas. ¿Seguro que esta sintaxis es correcta?
    TMWP
    30/0317 a las 18:20
  • ahora estoy pensando en los comentarios sobre la respuesta aceptada que el problema podría ser mi declaración de importación, aunque no entiendo por qué no arroja un error si no importé el comando. ¿Hay otra línea de importación que usó al probar el mplcomando?
    TMWP
    30 de marzo de 2017 a las 18:31
  • @luc - Creo que el enlace anterior ha expirado. Dice - "Sitio no encontrado". ¿Podría actualizar el enlace, por favor? 18 de junio a las 19:05
1030

Funciones relacionadas con el texto como label, title, etc. aceptan parámetros mismos como matplotlib.text.Text. Para el tamaño de fuente puedes 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 configuraciones 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

(Por lo que puedo ver, no hay forma de establecer xy yetiquetar tamaños por separado).

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

9
  • ¡Gracias! ¿Hay alguna manera de establecer eso globalmente pero explícitamente para (suptitle, xlabel, ylabel)? Estoy haciendo muchos gráficos y solo quiero especificarlo una vez ...
    vasek1
    16 de septiembre de 2012 a las 6:12
  • @ vasek1: Pensé que no querías una configuración global :). Para eso necesitas mpl.rcParams. He editado mi respuesta.
    Avaris
    16 de septiembre de 2012 a las 6:23
  • 28
    Para cualquier otra persona como yo que busque la solución para cambiar el tamaño del título: plt.rcParams.update({'axes.titlesize': 'small'}) 5/06/2015 a las 13:17
  • Desde el rcParamsenlace, utilice figure.titlesizeademás de axes.titlesize. 15 dic.15 a las 19:05
  • 1
    @AlexanderMcFarlane. Yo corrí 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ás usando? ¿Qué versión de Python? 2) ¿Podría ser un error que por alguna razón acepta strpero no unicodeen Py2? 30 de mayo de 2016 a las 1:18
126

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)
5
  • 10
    ¿Qué otros tamaños hay además 'x-large'? 11 oct 2017 a las 7:00
  • 25
    'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'. Ver matplotlib.org/api/…
    tsando
    11/10/2017 a las 8:37
  • 2
    Utilice pylab.rcParams.keys()para ver la lista completa de parámetros.
    Nirmal
    26 oct 2018 a las 5:34
  • 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
    20/01/19 a las 15:57
  • 8
    También puedes usar números ... 'axes.labelsize': 32, 12/06/19 a las 21:38
98

Si está más acostumbrado a usar axobjetos para hacer su trazado, 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 una terminal ipython. Parece necesitar una operación de redibujo después para 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 su creación.

4
  • 1
    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
    14 de junio de 2018 a las 4:03
  • 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 trabajo de forma interactiva con un diagrama de ipython y quiero hacer una evaluación visual rápida de una variedad de tamaños de fuente.
    spinup
    15/06/18 a las 18:12
  • ¿Sabes si hay alguna diferencia (oculta) entre el uso de objetos de hacha y objetos de figura, o ambos son perfectamente equivalentes? ¿Por qué existen diferentes interfaces para algunas de las funciones? (plt.xlabel () frente a ax.set_xlabel ()) 14/11/18 a las 14:33
  • 1
    @normanius, si te refieres a ax y fig en el ejemplo anterior, son objetos bastante diferentes; fig es la figura general, que puede contener varios ejes. Entonces, el higo y el hacha tienen propiedades diferentes. En términos de la diferencia entre las llamadas de tipo pyplot y las llamadas a objetos (por ejemplo, plt.xlabel()vs. ax.set_xlabel()como usted dice), son equivalentes, con la salvedad de que las plt.*funciones funcionan en el eje / figura actual . Entonces, si configura una figura con múltiples ejes, probablemente querrá usar llamadas explícitas como ax1.set_xlabel()para evitar confusiones.
    spinup
    14/11/18 a las 21:48
34

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 .

28

Per the official guide, use of pylab is no longer recommended. matplotlib.pyplot should be used directly instead.

La configuración global de tamaños de fuente a través 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 usando

plt.rcParams.update(plt.rcParamsDefault)

También puede hacer esto creando una hoja de estilo en el stylelibdirectorio bajo el directorio de configuración de 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 comparte el formato

axes.labelsize = 16
axes.titlesize = 16

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

Se puede obtener una lista completa de las rcParamsclaves a través de plt.rcParams.keys(), pero para ajustar los tamaños de fuente que tiene (las cursivas se citan aquí )

  • axes.labelsize- Tamaño de fuente de las etiquetas xey
  • 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 tick
  • ytick.labelsize- Tamaño de fuente de las etiquetas de tick
  • legend.fontsize- Tamaño de fuente para leyendas ( plt.legend(), fig.legend())
  • legend.title_fontsize- Tamaño de fuente para títulos de leyenda, se Noneestablece igual que los ejes predeterminados. Consulte esta respuesta para ver un 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 floatpulgada pt. Los tamaños de cadena se definen en relación con el tamaño de fuente predeterminado que se especifica por

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

Además, el peso se puede especificar (aunque solo aparece por defecto) mediante

  • 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'( relativo con respecto al peso actual ).
7

Otros han proporcionado respuestas sobre cómo cambiar el tamaño del título, pero en cuanto al tamaño de la etiqueta de tick de los ejes, también puede usar el método set_tick_params .

Por ejemplo, para hacer que el tamaño de la etiqueta de marca del eje x sea pequeño:

ax.xaxis.set_tick_params(labelsize='small')

o, para hacer que la etiqueta de marca del eje y sea grande:

ax.yaxis.set_tick_params(labelsize='large')

También puede ingresar labelsizecomo flotante o cualquiera de las siguientes opciones de cadena: 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large' o 'xx -grande'.

4
  • Sin embargo, esto es para la etiqueta de marca, no para la etiqueta del eje.
    irene
    18/08/20 a las 10:49
  • 1
    Sí, tiene razón con respecto al OP. Sin embargo, otras respuestas también mencionaron los tamaños de las etiquetas de marca, y pensé que sería útil para los usuarios conocer este método también. 19/08/20 a las 19:44
  • Lo voté a favor por la misma razón :) Pero creo que, dado que la respuesta especifica "tamaño de la etiqueta de los ejes", creo que debería corregirse a "marcar el tamaño de la etiqueta"
    irene
    20/08/20 a las 8:10
  • Buen punto. Hice las ediciones. Y gracias por el voto a favor. 20/08/20 a las 20:15
3

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

3

Colocar right_axantesset_ylabel()

ax.right_ax.set_ylabel('AB scale')

0
0

bibliotecas

importar numpy como np

importar matplotlib.pyplot como plt

crear conjunto de datos

altura = [3, 12, 5, 18, 45]

barras = ('A', 'B', 'C', 'D', 'E')

x_pos = np.arange (len (barras))

Crea barras y elige color

plt.bar (x_pos, altura, color = (0.5,0.1,0.5,0.6))

Agregar títulos y nombres de ejes

plt.title ('Mi título')

plt.xlabel ('categorías')

plt.ylabel ('valores')

Crea nombres en el eje x

plt.xticks (x_pos, barras)

Mostrar trama

plt.show ()

1
  • ¡Bienvenido Tejas! Considere formatear su respuesta para que sea más fácil de leer. Dar formato a algunas partes en código sería un buen comienzo. 4 de agosto a las 19:16
-4

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()
1
  • 3
    Si bien este código puede proporcionar una solución al problema de OP, se recomienda encarecidamente que brinde un contexto adicional sobre por qué y / o cómo este código responde a la pregunta. Las respuestas de solo código generalmente se vuelven inútiles a largo plazo porque los futuros espectadores que experimentan problemas similares no pueden comprender el razonamiento detrás de la solución. 14 de enero de 2020 a las 7:45