Aktualizacja: patrz na dole odpowiedzi, aby uzyskać nieco lepszy sposób na zrobienie tego.
Aktualizacja nr 2: Wymyśliłem też zmianę czcionek tytułu legendy.
Aktualizacja nr 3: W Matplotlib 2.0.0 występuje błąd, który powoduje, że etykiety podziałek dla osi logarytmicznych powracają do domyślnej czcionki. Powinien zostać naprawiony w wersji 2.0.1, ale obejrzałem to obejście w drugiej części odpowiedzi.
Ta odpowiedź jest dla każdego, kto próbuje zmienić wszystkie czcionki, w tym dla legendy, i dla każdego, kto próbuje użyć różnych czcionek i rozmiarów dla każdej rzeczy. Nie używa rc (co wydaje się nie działać dla mnie). Jest to raczej kłopotliwe, ale nie mogłem osobiście poradzić sobie z żadną inną metodą. Zasadniczo łączy odpowiedź ryggyr tutaj z innymi odpowiedziami na temat 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()
Zaletą tej metody jest to, że mając kilka słowników czcionek, możesz wybierać różne czcionki / rozmiary / gramatury / kolory dla różnych tytułów, wybierać czcionkę dla etykiet zaznaczenia i wybierać czcionkę dla legendy, wszystkie niezależnie.
AKTUALIZACJA:
Opracowałem nieco inne, mniej zagracone podejście, które eliminuje słowniki czcionek i dopuszcza dowolną czcionkę w twoim systemie, nawet czcionki .otf. Aby mieć osobne czcionki dla każdej rzeczy, po prostu napisz więcej font_path
i font_prop
polub zmienne.
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()
Mam nadzieję, że jest to wyczerpująca odpowiedź