Aggiornamento: vedi la parte inferiore della risposta per un modo leggermente migliore di farlo.
Aggiornamento n. 2: ho capito anche come cambiare i caratteri del titolo della legenda.
Aggiornamento n. 3: esiste un bug in Matplotlib 2.0.0 che causa il ripristino delle etichette di spunta per gli assi logaritmici sul carattere predefinito. Dovrebbe essere risolto in 2.0.1 ma ho incluso la soluzione alternativa nella seconda parte della risposta.
Questa risposta è per chiunque cerchi di cambiare tutti i caratteri, incluso per la legenda, e per chiunque cerchi di usare caratteri e dimensioni diverse per ogni cosa. Non usa rc (che non sembra funzionare per me). È piuttosto ingombrante ma non sono riuscito a fare i conti personalmente con nessun altro metodo. Fondamentalmente combina la risposta di Ryggyr qui con altre risposte su 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()
Il vantaggio di questo metodo è che, avendo diversi dizionari di caratteri, è possibile scegliere caratteri / dimensioni / pesi / colori diversi per i vari titoli, scegliere il carattere per le etichette di spunta e scegliere il carattere per la legenda, il tutto in modo indipendente.
AGGIORNARE:
Ho elaborato un approccio leggermente diverso, meno ingombrante che elimina i dizionari dei caratteri e consente qualsiasi tipo di carattere sul tuo sistema, anche i caratteri .otf. Per avere caratteri separati per ogni cosa, basta scrivere di più font_path
e font_prop
gradire le variabili.
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()
Spero che questa sia una risposta completa