6.9. Текстовые подписи делений осей

Очень часто, работая с временными рядами или количественными показателями нам необходимо менять подписи осей. Если это временные ряды, то подписи должны отражать дату и время, если это количественные показатели, то подписями должны служить имена рассматриваемых объектов. Например:

import numpy as np
import matplotlib.pyplot as plt

month = ('май', 'июнь', 'июль', 'август', 'сентябрь')
value = (12, 24, 18, 11, 6)
position = np.arange(5)

fig, ax = plt.subplots()

ax.bar(position, value)

#  Устанавливаем позиции тиков:
ax.set_xticks(position)

#  Устанавливаем подписи тиков
ax.set_xticklabels(['май', 'июнь', 'июль', 'август', 'сентябрь'])

fig.set_figwidth(10)
fig.set_figheight(6)

plt.show()

Matplotlib ticklabels

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

import numpy as np
import matplotlib.pyplot as plt

labels = ['Контрольная группа № %i' % i for i in range(1, 6)]
value = (12, 24, 18, 11, 6)
position = np.arange(5)

fig, ax = plt.subplots()

ax.bar(position, value)

#  Устанавливаем позиции тиков:
ax.set_xticks(position)

#  Устанавливаем подписи тиков
ax.set_xticklabels(labels)

fig.set_figwidth(10)
fig.set_figheight(6)

plt.show()

Matplotlib ticklabels: наложение подписей друг на друга

Самый простой выход - это горизонтальное размещение графика, и, если возможно, расстановке переносов:

import numpy as np
import matplotlib.pyplot as plt

labels = ['Контрольная\nгруппа № %i' % i for i in range(1, 6)]
value = (12, 24, 18, 11, 6)
position = np.arange(5)

fig, ax = plt.subplots()

ax.barh(position, value)

#  Устанавливаем позиции тиков:
ax.set_yticks(position)

#  Устанавливаем подписи тиков
ax.set_yticklabels(labels,
                   fontsize = 15)

fig.set_figwidth(10)
fig.set_figheight(6)

plt.show()

Matplotlib ticklabels: улучшение размещения текстовых подписей делений

Метод set_yticklabels поддерживает множество параметров внешнего вида:

import numpy as np
import matplotlib.pyplot as plt

labels = ['Контрольная\nгруппа № %i' % i for i in range(1, 6)]
value = (12, 24, 18, 11, 6)
position = np.arange(5)

fig, ax = plt.subplots()

ax.barh(position, value)

#  Устанавливаем позиции тиков:
ax.set_yticks(position)

#  Устанавливаем подписи тиков
labels = ax.set_yticklabels(labels,
                   fontsize = 15,    #  Размер шрифта
                   color = 'b',    #  Цвет текста
                   rotation = 45,    #  Поворот текста
                   verticalalignment =  'center')    #  Вертикальное выравнивание

fig.set_figwidth(10)
fig.set_figheight(8)

plt.show()

Matplotlib ticklabels: изменение параметров внешнего вида

Так как метод set_yticklabels возвращает список из всех меток, то мы можем настраивать внешний вид каждой отдельной метки:

import numpy as np
import matplotlib.pyplot as plt

labels = ['Контрольная\nгруппа № %i' % i for i in range(1, 6)]
value = (12, 24, 18, 11, 6)
position = np.arange(5)

fig, ax = plt.subplots()

ax.barh(position, value)

#  Устанавливаем позиции тиков:
ax.set_yticks(position)

#  Устанавливаем подписи тиков
labels = ax.set_yticklabels(labels,
                           fontsize = 15,
                           position = (-0.03, 0),
                           color = 'w')

for label in labels:
    label.set_bbox({'boxstyle':'rarrow',
                    'facecolor': 'b'})

labels[2].set_bbox({'boxstyle':'rarrow',
                    'facecolor':'r'})

fig.set_figwidth(10)
fig.set_figheight(8)

plt.show()

Matplotlib ticklabels: изменение внешнего вида каждой отдельной текстовой подписи