Как создавать диаграммы в pandas?

In [1]: import pandas as pd

In [2]: import matplotlib.pyplot as plt
Данные, использованные в этом уроке:
  • В этом руководстве используются данные о концентрации \(NO_2\) в воздухе, предоставленные openaq и использующие пакет py-openaq. Набор данных air_quality_no2.csv содержит значения \(NO_2\) от измерительных станций FR04014, BETR801 и London Westminster в Париже, Антверпене и Лондоне соответственно.

    Исходные данные
    In [3]: air_quality = pd.read_csv("data/air_quality_no2.csv", index_col=0, parse_dates=True)
    
    In [4]: air_quality.head()
    Out[4]: 
                         station_antwerp  station_paris  station_london
    datetime                                                           
    2019-05-07 02:00:00              NaN            NaN            23.0
    2019-05-07 03:00:00             50.5           25.0            19.0
    2019-05-07 04:00:00             45.0           27.7            19.0
    2019-05-07 05:00:00              NaN           50.4            16.0
    2019-05-07 06:00:00              NaN           61.9             NaN
    

    Примечание

    В примере использованы параметры index_col и parse_dates функции read_csv: в index_col определяется первый (0-й) столбец в качестве индекса результирующего DataFrame, в parse_dates задается преобразование дат в столбце в Timestamp.

../../_images/04_plot_overview.svg
  • Мне нужна быстрая визуальная проверка данных.

    In [5]: air_quality.plot()
    Out[5]: <AxesSubplot:xlabel='datetime'>
    
    ../../_images/04_airqual_quick.png

    pandas по умолчанию создает один линейный график для каждого из столбцов DataFrame с числовыми данными. (Примечание переводчика: если после ввода air_quality.plot() вы видите <AxesSubplot:xlabel='datetime'>, но не видите саму диаграмму, попробуйте ввести plt.show())

  • Я хочу отобразить только столбцы с данными из Парижа.

    In [6]: air_quality["station_paris"].plot()
    Out[6]: <AxesSubplot:xlabel='datetime'>
    
    ../../_images/04_airqual_paris.png

    Чтобы построить диаграмму для конкретного столбца, используйте метод выбора из урока по подмножеству данных в сочетании с методом plot(). Метод plot() работает как с Series, так и с DataFrame.

  • Я хочу визуально сравнить значения \(N0_2\), измеренные в Лондоне и Париже.

    In [7]: air_quality.plot.scatter(x="station_london", y="station_paris", alpha=0.5)
    Out[7]: <AxesSubplot:xlabel='station_london', ylabel='station_paris'>
    
    ../../_images/04_airqual_scatter.png

Помимо линейного графика (line), предусмотренного по умолчанию при использовании функции plot, существует ряд альтернатив для построения данных. Давайте воспользуемся стандартным Python, чтобы получить обзор доступных методов построения графика:

In [8]: [
   ...:     method_name
   ...:     for method_name in dir(air_quality.plot)
   ...:     if not method_name.startswith("_")
   ...: ]
   ...: 
Out[8]: 
['area',
 'bar',
 'barh',
 'box',
 'density',
 'hexbin',
 'hist',
 'kde',
 'line',
 'pie',
 'scatter']

Примечание

Во многих средах разработки, в том числе в IPython и Jupyter Notebook, используют клавишу TAB, чтобы получить обзор доступных методов, например air_quality.plot + TAB.

Одним из вариантов является DataFrame.plot.box(), который относится к диаграмме размаха (она же "ящик с усами"). Метод box применим к примерам данных о качестве воздуха:

In [9]: air_quality.plot.box()
Out[9]: <AxesSubplot:>
../../_images/04_airqual_boxplot.png
В руководстве пользователя

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

  • Я хочу, чтобы для каждого из столбцов была своя субдиаграмма.

    In [10]: axs = air_quality.plot.area(figsize=(12, 4), subplots=True)
    
    ../../_images/04_airqual_area_subplot.png

    Отдельные субдиаграммы для каждого из столбцов данных поддерживаются аргументом subplots функции plot. Встроенные параметры, доступные в каждой из функций диаграмм в pandas, заслуживают отдельного рассмотрения.

В руководстве пользователя

Некоторые дополнительные параметры форматирования объясняются в разделе руководства пользователя о форматировании диаграмм.

  • Я хочу дополнительно настроить, расширить или сохранить полученную диаграмму.

    In [11]: fig, axs = plt.subplots(figsize=(12, 4))
    
    In [12]: air_quality.plot.area(ax=axs)
    Out[12]: <AxesSubplot:xlabel='datetime'>
    
    In [13]: axs.set_ylabel("NO$_2$ concentration")
    Out[13]: Text(0, 0.5, 'NO$_2$ concentration')
    
    In [14]: fig.savefig("no2_concentrations.png")
    
    ../../_images/04_airqual_customized.png

Каждая диаграмма, созданная pandas, является объектом Matplotlib. Поскольку Matplotlib предоставляет множество опций для настройки диаграмм, явная связь между pandas и Matplotlib позволяет использовать всю мощь Matplotlib для диаграмм. Эта стратегия применяется в предыдущем примере следующим образом:

fig, axs = plt.subplots(figsize=(12, 4))        # Create an empty matplotlib Figure and Axes
air_quality.plot.area(ax=axs)                   # Use pandas to put the area plot on the prepared Figure/Axes
axs.set_ylabel("NO$_2$ concentration")          # Do any matplotlib customization you like
fig.savefig("no2_concentrations.png")           # Save the Figure/Axes using the existing matplotlib method.

ЗАПОМНИТЕ

  • Методы .plot.* применимы как к Series, так и к DataFrame.

  • По умолчанию каждый из столбцов отображается как отдельный элемент (линейный график, диаграмма размаха и так далее).

  • Любая диаграмма, созданная pandas, является объектом Matplotlib.

В руководстве пользователя

Полный обзор построения диаграмм в pandas представлен в разделе руководства пользователя о визуализации.