Mise à jour: Voir le bas de la réponse pour une façon légèrement meilleure de le faire.
Mise à jour n ° 2: j'ai également découvert la modification des polices de titre de légende.
Mise à jour # 3: il y a un bogue dans Matplotlib 2.0.0 qui fait que les étiquettes de tick pour les axes logarithmiques reviennent à la police par défaut. Devrait être corrigé dans 2.0.1 mais j'ai inclus la solution de contournement dans la 2ème partie de la réponse.
Cette réponse s'adresse à toute personne essayant de modifier toutes les polices, y compris pour la légende, et à toute personne essayant d'utiliser des polices et des tailles différentes pour chaque chose. Il n'utilise pas rc (ce qui ne semble pas fonctionner pour moi). C'est assez lourd mais je n'ai pas pu me familiariser avec une autre méthode personnellement. Il combine essentiellement la réponse de ryggyr ici avec d'autres réponses sur 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()
L'avantage de cette méthode est qu'en ayant plusieurs dictionnaires de polices, vous pouvez choisir différentes polices / tailles / poids / couleurs pour les différents titres, choisir la police pour les étiquettes de coche et choisir la police pour la légende, le tout indépendamment.
MISE À JOUR:
J'ai élaboré une approche légèrement différente et moins encombrée qui supprime les dictionnaires de polices et autorise toutes les polices de votre système, même les polices .otf. Pour avoir des polices distinctes pour chaque chose, il suffit d'écrire plus de variables font_path
et de les font_prop
aimer.
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()
J'espère que c'est une réponse complète