Оновлення: див. Нижню частину відповіді щодо дещо кращого способу зробити це.
Оновлення №2: Я також зрозумів, що змінюються шрифти заголовка легенди.
Оновлення №3: У Matplotlib 2.0.0 є помилка, через яку мітки галочок для логарифмічних осей повертаються до шрифту за замовчуванням. Потрібно виправити 2.0.1, але я включив рішення у другій частині відповіді.
Ця відповідь призначена для тих, хто намагається змінити всі шрифти, включаючи легенду, і для тих, хто намагається використовувати різні шрифти та розміри для кожної речі. Він не використовує rc (який, здається, не працює для мене). Він досить громіздкий, але я не міг особисто впоратися з будь-яким іншим методом. Це в основному поєднує тут відповідь риггіра з іншими відповідями на ТА.
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()
Сподіваємось, це всебічна відповідь