Atualização: Veja a parte inferior da resposta para uma maneira um pouco melhor de fazê-lo.
Atualização # 2: Também descobri a alteração das fontes dos títulos das legendas.
Atualização # 3: Há um bug no Matplotlib 2.0.0 que está fazendo com que os rótulos de ticks dos eixos logarítmicos retornem à fonte padrão. Deve ser corrigido no 2.0.1, mas incluí a solução alternativa na 2ª parte da resposta.
Esta resposta é para qualquer um que tenta alterar todas as fontes, inclusive para a legenda, e para quem tenta usar fontes e tamanhos diferentes para cada coisa. Ele não usa rc (o que parece não funcionar para mim). É um tanto complicado, mas não pude entender pessoalmente nenhum outro método. Basicamente, combina a resposta de ryggyr aqui com outras respostas no 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()
A vantagem desse método é que, com vários dicionários de fontes, é possível escolher diferentes fontes / tamanhos / pesos / cores para os vários títulos, escolher a fonte para os rótulos dos marcadores e escolher a fonte para a legenda, tudo de forma independente.
ATUALIZAR:
Desenvolvi uma abordagem um pouco diferente e menos confusa que acaba com os dicionários de fontes e permite qualquer fonte em seu sistema, mesmo fontes .otf. Para ter fontes separadas para cada coisa, basta escrever mais font_path
e font_prop
gostar de variáveis.
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()
Espero que esta seja uma resposta abrangente