Cómo cambiar el tamaño de fuente en un diagrama matplotlib

542

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

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

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

Pero, ¿cómo se cambia el resto?

Herman Schaaf
fuente

Respuestas:

631

De la documentación de matplotlib ,

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

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

Este establece la fuente de todos los artículos a la fuente especificada por el objeto kwargs, font.

Alternativamente, también puede usar el rcParams updatemétodo como se sugiere en esta respuesta :

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

o

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

Puede encontrar una lista completa de las propiedades disponibles en la página Customizing matplotlib .

Herman Schaaf
fuente
2
agradable, excepto que anula cualquier propiedad de tamaño de fuente encontrada en su camino è_é
yota
2
¿Dónde puedo encontrar más opciones para los elementos como 'family', 'weight', etc.?
piratea el
2
@HermanSchaaf; Visité esa página antes. Me gustaría saber todas las opciones para 'family'igual 'normal', 'sans-serif', etc.
haccks
77
Dado que muchas personas comienzan con import matplotlib.pyplot as plt, es posible que desee señalar que también lo pyplotha hecho rc. Puede hacerlo plt.rc(...sin tener que cambiar sus importaciones.
LondonRob
21
Para los impacientes: el tamaño de fuente predeterminado es 10, como en el segundo enlace.
FvD
304

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 rcmétodo en matplotlib:

import matplotlib

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

# and so on ...
Pedro M Duarte
fuente
99
Intenté muchas de las respuestas. Este se ve mejor, al menos en los cuadernos Jupyter. Simplemente copie el bloque anterior en la parte superior y personalice las tres constantes de tamaño de fuente.
fviktor
3
De acuerdo con fvitkor, ¡esa es la mejor respuesta!
SeF
99
Para mí, el tamaño del título no funcionó. Yo solía:plt.rc('axes', titlesize=BIGGER_SIZE)
Fernando Irarrázaval G
1
Creo que puede combinar todas las configuraciones para el mismo objeto en una sola línea. Por ejemploplt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)
BallpointBen
198
matplotlib.rcParams.update({'font.size': 22})
Marius Retegan
fuente
1
En muchos casos, esta solución funciona solo si creo un primer diagrama, luego "actualizo" como se sugiere, lo que lleva a un tamaño de fuente actualizado para las nuevas figuras. Tal vez la primera trama sea necesaria para inicializar rcParams ...
Songio
191

Si desea cambiar el tamaño de fuente solo para un diagrama 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)
Ryggyr
fuente
1
Mi propósito era que la fuente de las etiquetas xy, los ticks y los títulos fueran de diferentes tamaños. Una versión modificada de esto funcionó muy bien para mí.
Ébe Isaac
66
Para obtener las leyendas también use ax.legend (). Get_texts (). Probado en Matplotlib 1.4.
James S.
Esto responde la pregunta más directamente. Gracias.
Jim
Podría necesitar un ax=plt.gca()si la trama se creó sin definir un eje.
dylnan
@JamesS. En lugar de usar ax.get_legend().get_texts(), porque ax.legend()vuelve a dibujar toda la leyenda con parámetros predeterminados además de devolver el valor de ax.get_legend().
Guimoute
69

Actualización: Vea la parte inferior de la respuesta para una forma ligeramente mejor de hacerlo.
Actualización n. ° 2: también descubrí cómo cambiar las fuentes del título de la leyenda.
Actualización n. ° 3: Hay un error en Matplotlib 2.0.0 que está causando que las etiquetas de los ejes logarítmicos vuelvan a la fuente predeterminada. Debería arreglarse 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 en 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.


ACTUALIZAR:

He desarrollado un enfoque ligeramente diferente y menos abarrotado que elimina los diccionarios de fuentes y permite cualquier fuente en su sistema, incluso las fuentes .otf. Para tener fuentes separadas para cada cosa, simplemente escriba más font_pathy le font_propgusten las 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()

Esperemos que esta sea una respuesta integral

binaryfunt
fuente
40

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

¡Cambia el tamaño de la figura !

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

Cuanto más pequeño sea ​​el tamaño de la figura, mayor será la fuente en relación con el gráfico . Esto también aumenta los marcadores. Tenga en cuenta que también configuro el dpio punto por pulgada. Aprendí esto al publicar el foro AMTA (American Modeling Teacher of America). Ejemplo del código anterior:ingrese la descripción de la imagen aquí

Prof Huster
fuente
77
Para evitar que la etiqueta del eje se corte, guarde la figura con el bbox_inchesargumento fig.savefig('Basic.png', bbox_inches="tight")
Paw
¿Qué pasa si NO estoy guardando la figura? Estoy tramando en Juypter Notebook y las etiquetas de eje resultantes se cortan.
Zythyr
¡Gracias! Señalando los valores de dpi era extremadamente útil para mí en la preparación de versiones imprimibles de mis parcelas sin tener que ajustar todos los tamaños de línea, tamaños de fuente, etc.
ybull
27

Utilizar plt.tick_params(labelsize=14)

Andrey Nikishaev
fuente
44
Gracias por el fragmento de código, que puede proporcionar una ayuda limitada e inmediata. Una explicación adecuada mejoraría en gran medida su valor a largo plazo al describir por qué esta es una buena solución al problema, y ​​la haría más útil para futuros lectores con otras preguntas similares. Edite su respuesta para agregar alguna explicación, incluidas las suposiciones que ha hecho.
Sepehr
22

Se puede utilizar plt.rcParams["font.size"]para el ajuste font_sizeen matplotliby también se puede utilizar plt.rcParams["font.family"]para establecer font_familyen 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')
hamed baziyad
fuente
10

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)
stackoverflowuser2010
fuente
8

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)
nvd
fuente
5

Esta es una extensión de la respuesta de Marius Retegan . 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 'archivo_ejemplo.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": ""
}
Michael H.
fuente
4

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. Simplemente tuve que complementar esto con una opción bbox_inches al guardar la figura como un pdf porque las etiquetas del eje se cortaron.

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

fuente