Cómo cambiar el tamaño de fuente en un gráfico matplotlib

¿Cómo se cambia el tamaño de fuente para todos los elementos (marcas, etiquetas, título) en un gráfico de matplotlib?

Sé cómo cambiar los tamaños de las etiquetas de tick, esto se hace con:

import matplotlib 
matplotlib.rc('xtick', labelsize=20) 
matplotlib.rc('ytick', labelsize=20) 

Pero, ¿cómo se cambia el resto?

preguntado Oct 10 '10, 07:10

13 Respuestas

Desde el documentación de matplotlib,

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 22}

matplotlib.rc('font', **font)

Esto establece la fuente de todos los elementos en la fuente especificada por el objeto kwargs, font.

Alternativamente, también puede utilizar el rcParams update método como se sugiere en esta respuesta:

matplotlib.rcParams.update({'font.size': 22})

or

import matplotlib.pyplot as plt
plt.rcParams.update({'font.size': 22})

Puede encontrar una lista completa de propiedades disponibles en el Personalización de la página de matplotlib.

Respondido el 16 de Septiembre de 18 a las 20:09

agradable, excepto que anula cualquier propiedad de tamaño de fuente que se encuentre en su camino è_é - Yota

¿Dónde puedo encontrar más opciones para elementos como 'family', 'weight', etc? - hacks

Dado que muchas personas comienzan con import matplotlib.pyplot as plt, le gustaría señalar que pyplot tiene rc también. Tu puedes hacer plt.rc(... sin tener que cambiar sus importaciones. - LondresRob

Para los impacientes: el tamaño de fuente predeterminado es 10, como en el segundo enlace. - FvD

@ user32882: no de forma permanente, no se guarda en el disco, pero supongo que cambiaría los gráficos posteriores generados en el mismo código a menos que el valor original se almacene y restaure, lo cual no siempre es conveniente. Puedes hacer algo como for label in (ax.get_xticklabels() + ax.get_yticklabels()): label.set_fontsize(22) para afectar el tamaño del texto en una sola figura. - terry marrón

Si eres un fanático del control como yo, es posible que desees establecer explícitamente todos los tamaños de fuente:

import matplotlib.pyplot as plt

SMALL_SIZE = 8
MEDIUM_SIZE = 10
BIGGER_SIZE = 12

plt.rc('font', size=SMALL_SIZE)          # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes title
plt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labels
plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsize
plt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title

Tenga en cuenta que también puede establecer los tamaños llamando al rc método en matplotlib:

import matplotlib

SMALL_SIZE = 8
matplotlib.rc('font', size=SMALL_SIZE)
matplotlib.rc('axes', titlesize=SMALL_SIZE)

# and so on ...

Respondido el 31 de enero de 17 a las 17:01

Probé muchas de las respuestas. Este se ve mejor, al menos en los cuadernos de Jupyter. Simplemente copie el bloque anterior en la parte superior y personalice las tres constantes de tamaño de fuente. - fviktor

De acuerdo con fvitkor, ¡esa es la mejor respuesta! - Sef

Para mí, el tamaño del título no funcionó. Solía: plt.rc('axes', titlesize=BIGGER_SIZE) - Fernando Irarrázaval G.

Creo que puedes combinar todas las configuraciones para el mismo objeto en una línea. P.ej, plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE) - Bolígrafo Ben

Si desea cambiar el tamaño de fuente solo para un gráfico específico que ya se ha creado, intente esto:

import matplotlib.pyplot as plt

ax = plt.subplot(111, xlabel='x', ylabel='y', title='title')
for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
             ax.get_xticklabels() + ax.get_yticklabels()):
    item.set_fontsize(20)

Respondido 20 Feb 13, 02:02

Mi propósito era que la fuente de las etiquetas xy, las marcas y los títulos fueran de diferentes tamaños. Una versión modificada de esto funcionó muy bien para mí. - Ébe Isaac

Para obtener las leyendas también use ax.legend (). Get_texts (). Probado en Matplotlib 1.4. - James S.

Esto responde a la pregunta de manera más directa. Gracias. - Jimh

Podría necesitar un ax=plt.gca() si el gráfico se creó sin definir un eje. - dylnan

@JamesS. Prefiero usar ax.get_legend().get_texts(), porque ax.legend() vuelve a dibujar la leyenda completa con los parámetros predeterminados además de devolver el valor de ax.get_legend(). - Guimoute

matplotlib.rcParams.update({'font.size': 22})

Respondido el 22 de junio de 11 a las 15:06

En caso de que esta solución funcione sólo si creo un primer gráfico, luego "actualizo" como se sugiere, lo que conduce a un tamaño de fuente actualizado para nuevas figuras. Quizás el primer gráfico sea necesario para inicializar rcParams ... - Songio

Actualizar: Consulte la parte inferior de la respuesta para conocer una forma un poco mejor de hacerlo.
Actualización #2: También descubrí cambiar las fuentes de los títulos de las leyendas.
Actualización #3: Hay un error en Matplotlib 2.0.0 eso está provocando que las etiquetas de marca de los ejes logarítmicos vuelvan a la fuente predeterminada. Debería corregirse en 2.0.1 pero he incluido la solución en la segunda parte de la respuesta.

Esta respuesta es para cualquiera que intente cambiar todas las fuentes, incluida la leyenda, y para cualquiera que intente usar diferentes fuentes y tamaños para cada cosa. No usa rc (que no parece funcionar para mí). Es bastante engorroso, pero no pude familiarizarme con ningún otro método personalmente. Básicamente, combina la respuesta de ryggyr aquí con otras respuestas sobre SO.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager

# Set the font dictionaries (for plot title and axis titles)
title_font = {'fontname':'Arial', 'size':'16', 'color':'black', 'weight':'normal',
              'verticalalignment':'bottom'} # Bottom vertical alignment for more space
axis_font = {'fontname':'Arial', 'size':'14'}

# Set the font properties (for use in legend)   
font_path = 'C:\Windows\Fonts\Arial.ttf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Defines ax variable by creating an empty plot

# Set the tick labels font
for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontname('Arial')
    label.set_fontsize(13)

x = np.linspace(0, 10)
y = x + np.random.normal(x) # Just simulates some data

plt.plot(x, y, 'b+', label='Data points')
plt.xlabel("x axis", **axis_font)
plt.ylabel("y axis", **axis_font)
plt.title("Misc graph", **title_font)
plt.legend(loc='lower right', prop=font_prop, numpoints=1)
plt.text(0, 0, "Misc text", **title_font)
plt.show()

El beneficio de este método es que, al tener varios diccionarios de fuentes, puede elegir diferentes fuentes / tamaños / pesos / colores para los distintos títulos, elegir la fuente para las etiquetas de marca y elegir la fuente para la leyenda, todo de forma independiente.


ACTUALIZACIÓN:

He elaborado un enfoque ligeramente diferente y menos desordenado que elimina los diccionarios de fuentes y permite cualquier fuente en su sistema, incluso fuentes .otf. Para tener fuentes separadas para cada cosa, simplemente escriba más font_path y font_prop como variables.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
import matplotlib.ticker
# Workaround for Matplotlib 2.0.0 log axes bug https://github.com/matplotlib/matplotlib/issues/8017 :
matplotlib.ticker._mathdefault = lambda x: '\\mathdefault{%s}'%x 

# Set the font properties (can use more variables for more fonts)
font_path = 'C:\Windows\Fonts\AGaramondPro-Regular.otf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Defines ax variable by creating an empty plot

# Define the data to be plotted
x = np.linspace(0, 10)
y = x + np.random.normal(x)
plt.plot(x, y, 'b+', label='Data points')

for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontproperties(font_prop)
    label.set_fontsize(13) # Size here overrides font_prop

plt.title("Exponentially decaying oscillations", fontproperties=font_prop,
          size=16, verticalalignment='bottom') # Size here overrides font_prop
plt.xlabel("Time", fontproperties=font_prop)
plt.ylabel("Amplitude", fontproperties=font_prop)
plt.text(0, 0, "Misc text", fontproperties=font_prop)

lgd = plt.legend(loc='lower right', prop=font_prop) # NB different 'prop' argument for legend
lgd.set_title("Legend", prop=font_prop)

plt.show()

Con suerte, esta es una respuesta completa.

Respondido 14 Abr '17, 21:04

Aquí hay un una experiencia diferente enfoque que funciona sorprendentemente bien para cambiar los tamaños de fuente:

Cambie el tamaño de la figura!

Normalmente uso un código como este:

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(4,3))
ax = fig.add_subplot(111)
x = np.linspace(0,6.28,21)
ax.plot(x, np.sin(x), '-^', label="1 Hz")
ax.set_title("Oscillator Output")
ax.set_xlabel("Time (s)")
ax.set_ylabel("Output (V)")
ax.grid(True)
ax.legend(loc=1)
fig.savefig('Basic.png', dpi=300)

La menores haces el tamaño de la figura, el mayores la fuente es relativo a la trama. Esto también mejora los marcadores. Tenga en cuenta que también configuro el dpi o punto por pulgada. Aprendí esto de una publicación en el foro AMTA (American Modeling Teacher of America). Ejemplo del código anterior: enter image description here

Respondido 05 ago 18, 19:08

Para evitar que se corte la etiqueta del eje, guarde la figura con el bbox_inches argumento fig.savefig('Basic.png', bbox_inches="tight") - Pata

¿Qué pasa si NO estoy guardando la figura? Estoy trazando en Juypter Notebook y las etiquetas de eje resultantes se cortan. - Zythyr

¡Gracias! Señalar la configuración de dpi fue extremadamente útil para mí al preparar versiones imprimibles de mis gráficos sin tener que ajustar todos los tamaños de línea, tamaños de fuente, etc. toro

Para evitar que la etiqueta se corte, también en el cuaderno, como pregunta @Zythyr, puede usar plt.tight_layout() - Ramón Crehuet

@Zythyr Puede usar el argumento dpi = XXX también en la llamada de plt.figure (): plt.figure(figsize=(4,3), dpi=300) para lograr el mismo resultado sin ahorrar - dnalow

Utiliza plt.tick_params(labelsize=14)

Respondido 31 Oct 18, 14:10

Gracias por el fragmento de código, que puede proporcionar ayuda inmediata y limitada. Una explicación adecuada mejoraría enormemente su valor a largo plazo describiendo por qué esta es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Edite su respuesta para agregar alguna explicación, incluidas las suposiciones que hizo. - Sepehr

¿No cambia esto simplemente el tamaño de la fuente de la marca? - JiK

Puede usar el plt.rcParams["font.size"] para configurar font_size in matplotlib y también puedes usar plt.rcParams["font.family"] para configurar font_family in matplotlib. Prueba este ejemplo:

import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')

label = [1,2,3,4,5,6,7,8]
x = [0.001906,0.000571308,0.0020305,0.0037422,0.0047095,0.000846667,0.000819,0.000907]
y = [0.2943301,0.047778308,0.048003167,0.1770876,0.532489833,0.024611333,0.157498667,0.0272095]


plt.ylabel('eigen centrality')
plt.xlabel('betweenness centrality')
plt.text(0.001906, 0.2943301, '1 ', ha='right', va='center')
plt.text(0.000571308, 0.047778308, '2 ', ha='right', va='center')
plt.text(0.0020305, 0.048003167, '3 ', ha='right', va='center')
plt.text(0.0037422, 0.1770876, '4 ', ha='right', va='center')
plt.text(0.0047095, 0.532489833, '5 ', ha='right', va='center')
plt.text(0.000846667, 0.024611333, '6 ', ha='right', va='center')
plt.text(0.000819, 0.157498667, '7 ', ha='right', va='center')
plt.text(0.000907, 0.0272095, '8 ', ha='right', va='center')
plt.rcParams["font.family"] = "Times New Roman"
plt.rcParams["font.size"] = "50"
plt.plot(x, y, 'o', color='blue')

Por favor, vea el resultado:

Respondido 03 Jul 20, 21:07

Esto es lo que generalmente uso en Jupyter Notebook:

# Jupyter Notebook settings

from IPython.core.display import display, HTML
display(HTML("<style>.container { width:95% !important; }</style>"))
%autosave 0
%matplotlib inline
%load_ext autoreload
%autoreload 2

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"


# Imports for data analysis
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.max_rows', 2500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.max_colwidth', 2000)
pd.set_option('display.width', 2000)
pd.set_option('display.float_format', lambda x: '%.3f' % x)

#size=25
size=15
params = {'legend.fontsize': 'large',
          'figure.figsize': (20,8),
          'axes.labelsize': size,
          'axes.titlesize': size,
          'xtick.labelsize': size*0.75,
          'ytick.labelsize': size*0.75,
          'axes.titlepad': 25}
plt.rcParams.update(params)

Respondido el 16 de enero de 20 a las 16:01

Basado en lo anterior:

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

fontPath = "/usr/share/fonts/abc.ttf"
font = fm.FontProperties(fname=fontPath, size=10)
font2 = fm.FontProperties(fname=fontPath, size=24)

fig = plt.figure(figsize=(32, 24))
fig.text(0.5, 0.93, "This is my Title", horizontalalignment='center', fontproperties=font2)

plot = fig.add_subplot(1, 1, 1)

plot.xaxis.get_label().set_fontproperties(font)
plot.yaxis.get_label().set_fontproperties(font)
plot.legend(loc='upper right', prop=font)

for label in (plot.get_xticklabels() + plot.get_yticklabels()):
    label.set_fontproperties(font)

respondido 19 nov., 14:18

Estoy totalmente de acuerdo con el profesor Huster en que la forma más sencilla de proceder es cambiar el tamaño de la figura, lo que permite mantener las fuentes predeterminadas. Solo tuve que complementar esto con una opción bbox_inches al guardar la figura como pdf porque se cortaron las etiquetas de los ejes.

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')

Respondido 18 ago 17, 15:08

Esta es una extensión de Marius Retegan https://www.youtube.com/watch?v=xB-eutXNUMXJtA&feature=youtu.be. Puede crear un archivo JSON separado con todas sus modificaciones y luego cargarlo con rcParams.update. Los cambios solo se aplicarán al script actual. Entonces

import json
from matplotlib import pyplot as plt, rcParams

s = json.load(open("example_file.json")
rcParams.update(s)

y guarde este 'example_file.json' en la misma carpeta.

{
  "lines.linewidth": 2.0,
  "axes.edgecolor": "#bcbcbc",
  "patch.linewidth": 0.5,
  "legend.fancybox": true,
  "axes.color_cycle": [
    "#348ABD",
    "#A60628",
    "#7A68A6",
    "#467821",
    "#CF4457",
    "#188487",
    "#E24A33"
  ],
  "axes.facecolor": "#eeeeee",
  "axes.labelsize": "large",
  "axes.grid": true,
  "patch.edgecolor": "#eeeeee",
  "axes.titlesize": "x-large",
  "svg.fonttype": "path",
  "examples.directory": ""
}

Respondido el 14 de Septiembre de 18 a las 12:09

Los cambios a la rcParams son muy granulares, la mayoría de las veces todo lo que desea es escalar todos los tamaños de fuente para que se vean mejor en su figura. El tamaño de la figura es un buen truco, pero luego debes llevarlo para todas tus figuras. Otra forma (no puramente matplotlib, o tal vez exagerada si no usa seaborn) es simplemente establecer la escala de fuente con seaborn:

sns.set_context('paper', font_scale=1.4)

DESCARGO DE RESPONSABILIDAD: Lo sé, si solo usa matplotlib, entonces probablemente no quiera instalar un módulo completo solo para escalar sus parcelas (quiero decir, por qué no) o si usa seaborn, entonces tiene más control sobre las opciones. Pero existe el caso en el que tiene el Seaborn en su entorno virtual de ciencia de datos, pero no lo usa en este portátil. De todos modos, otra solución más.

Respondido el 16 de diciembre de 20 a las 03:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.