Диаграммы на Python без культа карго: шесть важных линий
Большая часть кода matplotlib копируется, и большая часть его копируется из стиля конечного автомата, который работает для одной диаграммы и теряет смысл для двух. Шесть строк охватывают практически все, что нужно аналитику, и их стоит набирать по памяти.
Что вы делаете: создаёте фигуру и оси, строите график по осям, маркируете всё, сохраняете в ограничивающей рамке.
Краткая версия. fig это страница, ax это диаграмма на нем. Вызов методов включен ax.
Шесть линий
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 4.5))
ax.bar(totals.index, totals.values, color='#0E7490')
ax.set_title('East sells most, West sells least')
ax.set_ylabel('Revenue')
ax.spines[['top', 'right']].set_visible(False)
fig.savefig('revenue.png', dpi=200, bbox_inches='tight')
Это диаграмма, которую кто-то может вставить в документ, не извиняясь за это. Построчно: фигура с разумным соотношением сторон, один вызов графика, заголовок, в котором говорится о находке, единица измерения на оси, две удаленные границы и сохранение, в котором метки не обрезаются.
Почему форма объекта
# state machine: acts on whichever axes is current
plt.plot(x, y)
plt.title('...')
# object oriented: says which axes it means
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('...')
В одной диаграмме они эквивалентны. При использовании двух версия конечного автомата зависит от того, какие оси активны в данный момент, что определяется порядком вызовов и всем, что pandas делали в пути. Форма объекта не имеет двусмысленности, и именно ее в конечном итоге использует каждый более крупный пример.
Обратите внимание на имя: функция pyplot title, метод осей set_title. Что set_ Префикс сбивает людей с толку при конвертации старого кода.
Несколько графиков
fig, axes = plt.subplots(1, 2, figsize=(11, 4), sharey=True)
axes[0].bar(jan.index, jan.values)
axes[0].set_title('January')
axes[1].bar(feb.index, feb.values)
axes[1].set_title('February')
fig.suptitle('January outsold February by more than two to one')
fig.tight_layout()
sharey=True это важный аргумент. Две диаграммы, расположенные рядом, с разными масштабами по оси й, вызывают именно то сравнение, которое они не могут поддержать, а это версия проблемы с малыми кратными. Двухосевые диаграммы.
Заговор от pandas
totals = df.groupby('region')['amount'].sum().sort_values()
fig, ax = plt.subplots(figsize=(7, 4))
totals.plot(kind='barh', ax=ax, color='#0E7490')
ax.set_xlabel('Revenue')
ax.set_title('East is 3 times West')
Прохождение ax=ax это то, что позволяет вам контролировать ситуацию: pandas рисует на ваших осях, а вы сохраняете все методы маркировки. Сортировка перед построением графика — это вторая половина, поскольку диаграмма в алфавитном порядке предлагает читателю самому выполнить ранжирование.
Значения по умолчанию, которые стоит изменить один раз
| по умолчанию | Изменить на | Почему |
|---|---|---|
| Коробка со всех четырех сторон | Удалить верхнюю и правую часть | Меньше чернил, та же информация |
| Маленький шрифт по умолчанию | 11 или 12 | Диаграммы вставляются и сжимаются |
| Нет разделителя тысяч | Средство форматирования запятых | 1200000 не читается |
| Размер фигуры по умолчанию | 8 х 4,5 для слайда | Соответствует широкоэкранному макету |
| Десятицветный цикл | Один цвет или два | Цвет должен что-то означать |
ax.yaxis.set_major_formatter(
plt.matplotlib.ticker.StrMethodFormatter('{x:,.0f}'))
plt.rcParams.update({'font.size': 11, 'axes.spines.top': False,
'axes.spines.right': False, 'figure.dpi': 110})
Положите rcParams блок в верхней части шаблона записной книжки, и каждая диаграмма в файле наследует его, поэтому набор диаграмм начинает выглядеть как один набор, а не как девять.
Маркировка полосок
bars = ax.bar(totals.index, totals.values, color='#0E7490')
ax.bar_label(bars, fmt='{:,.0f}', padding=3)
ax.get_yaxis().set_visible(False)
Как только каждая полоса будет иметь свой номер, ось станет ненужной и ее можно будет использовать. Часто это самая чистая диаграмма на слайде: столбцы с пометками, заголовок, подтверждающий результат, и ничего больше.
Сохранение
fig.savefig('chart.png', dpi=200, bbox_inches='tight')
fig.savefig('chart.svg', bbox_inches='tight') # scales, for print
dpi=200 для всего, что будет рассматриваться, bbox_inches='tight' всегда. SVG, когда размер диаграммы будет изменен, поскольку она остается четкой. И замыкаем фигуры в петлю с помощью plt.close(fig), или длительный скрипт накапливает их в памяти.
Как применить это в своей работе
- Преобразование одной существующей диаграммы из
plt.звонки вfig, axформа. Это механическое изменение, и оно облегчает следующее. - Поставьте
rcParamsблок в верхней части вашего шаблона сегодня. - Дайте каждой диаграмме название, отражающее результат, а не содержание.
- Перед построением графика выполните сортировку, если только категории не имеют естественного порядка.
- Сохранить с
bbox_inches="tight"и проверьте файл, а не предварительный просмотр записной книжки.
Единственная привычка, которую нужно сохранить
Сначала напишите заголовок. Он определяет, для чего предназначена диаграмма, и часто обнаруживает, что диаграмма, которую вы собирались нарисовать, была не той, которая ее показывает.
Выживет ли ваша последняя диаграмма Python, если ее вставить в документ без объяснения причин?
set_ методы префиксных осей, bar_label, StrMethodFormatter и bbox_inches все текущие matplotlib.Диаграммы и визуализация — это книга по выбору карт: что может нести каждая фигура, что она незаметно искажает и как обозначить ее, чтобы читатель мог прийти к вашему выводу без каких-либо указаний.
Диаграммы и визуализация, 19 $ →Выбор правильного графика и названия диаграмм примените все, что вы рисуете. Курс Python закрывает сторону pandas.
Читать «Выберите правильный график» →