August 24, 2021

Творческий Pandas

С Pandas вам доступны все ключевые инструменты работы с графикой. При этом интерфейс гораздо проще, чем у родных функций и методов библиотеки Matplotlib. Рассмотрим это на примере.

Сгенерируем датафрейм с двумя колонками и нарисуем его, используя метод его plot:

import pandas as pd
import numpy as np
dates = pd.date_range(start='2021-01', periods=12, freq='M')
df = pd.DataFrame(data={'first':np.power(np.arange(12), 1.2), 
                        'second':np.log(np.linspace(100, 100000, 12))}, index=dates)   
                        
df.plot(kind='line')

По умолчанию все столбцы рисуются на одном графике. Это может быть изменено заданием параметра subplots=True (тогда все будут на разных, если какая-то колонка вообще не нужна, вызываете метод plot на датафрейме без нее). Также в качестве подписи по оси x используется индекс (отменяется параметром use_index).

Заголовки и подписи осей

В целом почти все основные настройки задаются как параметры метода plot. Например, заголовок графика (title) и подписи осей (xlabel, ylabel):

df.plot(kind='line', subplots=True, title='Демонстрационный график', xlabel='месяц', 
        ylabel='количество')

Для построения аналогичного графика с использованием Matplotlib понадобится примерно такой код:

import matplotlib.pyplot as plt
fig, axs = plt.subplots(2,1, sharex=True)
for col, ax in zip(df.columns, axs.flatten()):
    ax.plot(df.index, df[col])
    ax.set_ylabel('количество')
ax.set_xlabel('месяц')

fig.suptitle('Демонстрационный график')

Метки на осях

Задаются параметрами xticks и yticks. Подменим метки на оси x:

df.plot(kind='line', subplots=True, title='Демонстрационный график', xlabel='месяц', 
        ylabel='количество', use_index=False, xticks=np.arange(12)

Задание пределов по осям

Задаются аргументами xlim и ylim:

df.plot(kind='line', subplots=True, title='Демонстрационный график', xlabel='месяц', 
        ylabel='количество', use_index=False, xticks=np.arange(12), ylim=[5,8])

Слияние осей

Регулируется параметрами sharex, sharey. Так как по умолчанию значение оси x в нашем случае разделяется, для изменения этого установим sharex=False:

ax = df.plot(kind='line', sharex=False ,subplots=True, title='Демонстрационный график', 
             xlabel='месяц', ylabel='количество', use_index=False, xticks=np.arange(12))

Если аргументов не хватает

В этом случае вы можете подстроить вывод путем получения доступа к объектам графиков (возвращаются методом plot) и рисунка (доступ через модуль matplotlib.pyplot):

Внимательные заметили, что из-за использования аргумента use_index=False вместе с прежними рисками пропала и надпись (несмотря на то, что среди аргументов она присутствует). Простой способ исправить ситуацию такой:

ax = df.plot(kind='line', sharex=False ,subplots=True, title='Демонстрационный график', 
             xlabel='месяц', ylabel='количество', use_index=False, xticks=np.arange(12))
ax[1].set_xticklabels(np.arange(12)-2)
ax[1].set_xlabel('надпись по оси х')

Также я добавил строку ax[1].set_xticklabels(np.arange(12)-2) - так как среди аргументов не нашел возможности задать отдельно названия для рисок.

Необходимость обращения к методам модуля (через псевдоним plt) может возникнуть, например для задания размеров между графиками:

df.plot(kind='line', sharex=False ,subplots=True, title='Демонстрационный график', 
             xlabel='месяц', ylabel='количество')
plt.subplots_adjust(hspace=0.6, wspace=0.4)
# или plt.tight_layout()

без этого надпись "месяц" у верхнего графика теряется:

Более точное описание аргументов вы найдете на официальной странице.