negro - python graficos 2d
Cómo cambiar el tamaño de fuente en un gráfico de matplotlib (10)
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 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 menor sea el tamaño de la figura, mayor será la fuente en relación con el trazado . Esto también aumenta la escala de los marcadores. Nota también puse el dpi
o el punto por pulgada. Aprendí esto de una publicación del foro AMTA (American Modeling Teacher of America). Ejemplo del código anterior:
¿Cómo se puede cambiar el tamaño de fuente de todos los elementos (marcas, etiquetas, título) en un gráfico de matplotlib?
Sé cómo cambiar el tamaño de la etiqueta 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?
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)
De la documentación de matplotlib ,
font = {''family'' : ''normal'',
''weight'' : ''bold'',
''size'' : 22}
matplotlib.rc(''font'', **font)
Esto establece la fuente de todos los elementos a la fuente especificada por el objeto kwargs, font
.
Alternativamente, también puede usar el método de update
rcParams
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 .
Esta es una extensión a la answer Marius Retegan. Puede hacer un archivo JSON separado con todas sus modificaciones y luego cargarlo con rcParams.update. Los cambios solo se aplicarán al script actual. Asi que
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": ""
}
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 de bbox_inches al guardar la figura como un pdf porque se cortaron las etiquetas del eje.
import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig(''Basic.pdf'', bbox_inches=''tight'')
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)
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 método rc
en matplotlib
:
import matplotlib
SMALL_SIZE = 8
matplotlib.rc(''font'', size=SMALL_SIZE)
matplotlib.rc(''axes'', titlesize=SMALL_SIZE)
# and so on ...
Utilice plt.tick_params(labelsize=14)
Actualización: vea la parte inferior de la respuesta para una forma ligeramente mejor de hacerlo.
Actualización # 2: también he descubierto cambiar las fuentes del título de leyenda.
Actualización # 3: Hay un error en Matplotlib 2.0.0 que está causando que las etiquetas de tick para 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, incluso para 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 enfrentar personalmente ningún otro método. 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()
La ventaja 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, todas de forma independiente.
ACTUALIZAR:
He desarrollado un enfoque ligeramente diferente y menos saturado 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_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()
Esperemos que esta sea una respuesta integral.
matplotlib.rcParams.update({''font.size'': 22})