Шрифты в графиках Matplotlib

Matplotlib — очень удобный пакет для создания (как он и позиционируется) "высококачественных",  "готовых к публикации" (publication ready) графиков на базе Python. На его официальном сайте можно найти огромное число различных примеров, которые позволяют не только оценить его возможности, но и значительно облегчают его изучение.

При более тесной работе с данным пакетом, когда необходимо создавать графики с подписями заданного размера, возникает задача изменения как размеров шрифтов, используемых для меток и подписей к осям, так и подключения новых шрифтов. Эта необходимость возникает почти всегда, если нужно использовать полученный график в статье, для которой определены собственные правила оформления обозначений осей координат и вообще, любых надписей на рисунке.

Для решения этой задачи matplotlib позволяет изменять настройки через глобальный словарь настроек rcParams; здесь, однако, я бы хотел представить несколько более изящный метод изменения шрифтов и размеров объектов графика matplotlib, позволяющий использовать различные шрифты и их аттрибуты для каждого из объектов (т.е. каждая метка оси при таком подходе может получить свой размер и свой шрифт).

Рассмотрим следующий фрагмент кода

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# coding: utf

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import numpy as np


new_font = fm.FontProperties(fname = "/path/to/your/fonts/TIMCYR.TTF")

fig = plt.figure()
ax = fig.add_subplot(111)
x, y = np.linspace(0, 10, 100), 4 + np.sin(np.linspace(0, 10, 100))
ax.plot(x, y)
ax.set_title(u'Simple sine plot|Простой график sin')
ax.set_xlabel('x')
ax.set_ylabel('y')

for obj in fig.findobj(matplotlib.text.Text):
   obj.set_fontproperties(new_font)
   obj.set_fontsize(26)

plt.show()

В нем осуществляется поиск всех текстовых объектов, созданных на данном графике (объекте figure), которым впоследствии назначается  TTF-шрифт TIMCYR.ttf размером 16 pt.

Результатом его выполнения будет следующий график:

Matplotlib: настройка шрифтов на графиках

Если возникает необходимость изменить шрифт не у всех текстовых объектов, а, например, только у меток оси абсции, то достаточно немного модифицировать код:
 

1
2
3
for obj in ax.get_xticks().tolist():
   obj.set_fontproperties(new_font)
   obj.set_fontsize(26)

Изменение соответствующего фрагмента кода приведет к тому, что шрифт и его размер изменятся только для меток оси абцисс, для отрисовки остальных текстовых объектов будет использован шрифт по-умолчанию.

Данный подход позволяет гибко изменять шрифт и его размер для любого из текстовых элементов рисунка (объекта figure), что очень удобно при создании графиков высокого качества.
 

blog comments powered by Disqus