Обновление: см. Нижнюю часть ответа для немного лучшего способа сделать это.
Обновление № 2: я также понял, как изменить шрифты заголовков легенд.
Обновление № 3: в Matplotlib 2.0.0 есть ошибка , из-за которой метки галочек для логарифмических осей возвращаются к шрифту по умолчанию. Должно быть исправлено в 2.0.1, но я включил обходной путь во 2-й части ответа.
Этот ответ предназначен для всех, кто пытается изменить все шрифты, в том числе для легенды, и для всех, кто пытается использовать разные шрифты и размеры для каждой вещи. Это не использует rc (который, кажется, не работает для меня). Это довольно громоздко, но я не мог справиться с любым другим методом лично. Это в основном сочетает здесь ответ ryggyr с другими ответами на 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()
Преимущество этого метода заключается в том, что, имея несколько словарей шрифтов, вы можете выбирать разные шрифты / размеры / веса / цвета для различных заголовков, выбирать шрифт для меток галочек и выбирать шрифт для легенды, причем все независимо.
ОБНОВИТЬ:
Я разработал немного другой, менее загроможденный подход, который устраняет словари шрифтов и позволяет использовать любой шрифт в вашей системе, даже шрифты .otf. Чтобы иметь отдельные шрифты для каждой вещи, просто напишите больше font_path
и font_prop
как переменные.
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()
Надеюсь, это исчерпывающий ответ