Диаграммы с столбцами в Matplotlib – Узнайте все, что вам нужно знать

В этом посте вы узнаете, как создавать столбчатые диаграммы в Matplotlib, включая добавление нескольких столбцов, добавление заголовков и меток осей, условное выделение столбцов, добавление легенд, а также настройку с помощью стилей Matplotlib.

Содержание

Загружаем наши данные

Для этого руководства мы загрузим наши данные в DataFrame Pandas. В течение всего руководства мы будем использовать только Pandas и Matplotlib.

Если вы используете Jupyter ноутбуки, будет полезно добавить магию %matplotlib inline, чтобы видеть графики встроенными.

Давайте начнем с загрузки наших библиотек и данных:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

df = pd.DataFrame.from_dict(
    {
        'Year': [2016, 2017, 2018, 2019, 2020, 2021],
        'Men': [300, 320, 310, 305, 325, 330],
        'Women': [350, 325, 300, 305, 380, 355],
        'Total': [650,645, 610, 610, 705, 685]
    }
)

print(df.head())

Вывод фрейма данных:

   Year  Men  Women  Total
0  2016  300    350    650
1  2017  320    325    645
2  2018  310    300    610
3  2019  305    305    610
4  2020  325    380    705

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

Создание простого столбчатого графика в Matplotlib достаточно легко. Мы можем просто использовать метод plt.bar(), чтобы создать столбчатый график, и передать параметры x= и height=

Давайте создадим столбчатую диаграмму, используя Годы в качестве меток по оси x и Общий в качестве высот:

plt.bar(x=df['Year'], height=df['Total'])
plt.show()

Это выводит следующую гистограмму:

Как добавить заголовки и метки осей в столбчатые диаграммы?

Очень полезно добавлять заголовки и метки осей, чтобы данные были легче для понимания.

Matplotlib делает это просто, используя методы .title(), .xlabel(), и .ylabel()

Добавим это к нашему существующему графику. Мы можем сделать это, написав следующее:

plt.bar(x=df['Year'], height=df['Total'])
plt.title('Sales over time')
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

Это возвращает следующий график:

Возможно, вы захотите настроить размер текста. Вы можете просто передать аргумент .fontsize= в заголовки/метки осей. Давайте попробуем:

plt.bar(x=df['Year'], height=df['Total'])
plt.title('Sales over time', fontsize=18)
plt.xlabel('Year', fontsize=10)
plt.ylabel('Sales', fontsize=10)
plt.show()

Это возвращает следующий график:

Как настроить ширину полос?

Может быть, вам захочется настроить ширину ваших столбцов.

Чтобы изменить ширину, вы можете передать аргумент width= в метод .bar()

Ширины передаются как доля от 1, что означает, что если мы хотим изменить ширину до 25%, мы можем использовать 0.25.

plt.bar(x=df['Year'], height=df['Total'], width=0.25)
plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

Это возвращает следующее изображение:

Это довольно некрасиво, так что давайте изменим ширину на 0.9:

plt.bar(x=df['Year'], height=df['Total'], width=0.9)
plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

Это возвращает следующее изображение:

Как настроить цвета гистограмм?

Цвета диаграмм по умолчанию в Matplotlib, как правило, довольно невыразительные. Мы можем передать аргумент color= в метод plt.bar()

Например, давайте изменим цвет на серый:

plt.bar(x=df['Year'], height=df['Total'], color='grey')
plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

Этот код вернет следующий график:

Как условно настроить цвета полос?

Также возможно добавить пользовательские цвета к отдельным столбцам. Это делается путем передачи списка различных цветов.

Например, если вы хотите изменить цвет бара с наибольшим значением, вы можете создать список с цветами для каждого бара:

colors = ['grey', 'grey', 'grey', 'grey', 'red', 'grey']
plt.bar(x=df['Year'], height=df['Total'], color=colors)
plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

Это возвращает следующую диаграмму:

Тем не менее, это может быть утомительно — писать все эти списки вручную. Это также не позволяет динамически окрашивать их на основе данных. Однако мы можем сделать это программно, используя списковое включение. Если хотите узнать больше о списковых включениях, ознакомьтесь с моей статьей здесь

colors = ['r' if (bar == max(df['Total'])) else 'grey' for bar in df['Total']]
plt.bar(x=df['Year'], height=df['Total'], color=colors)
plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

Это возвращает следующее изображение:

Как настроить выравнивание границ на гистограммах?

По умолчанию Matplotlib центрирует столбцы по меткам оси. Вы также можете изменить это, чтобы столбцы выравнивались по краям. Для этого используется параметр edge=

Давайте попробуем это с нашим сюжетом:

plt.bar(x=df['Year'], height=df['Total'], align='edge')
plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

Это возвращает следующий график:

Как создать горизонтальную гистограмму в Matplotlib?

Matplotlib упрощает добавление горизонтальной гистограммы с помощью метода plt.barh(). Это работает аналогично методу plt.bar(), который мы уже изучили. Однако вместо параметров x= и height= используются параметры y= и width=

Давайте попробуем это с нашими текущими данными:

plt.barh(y=df['Year'], width=df['Total'])
plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

Это возвращает следующее изображение:

Как создать двойную гистограмму в Matplotlib?

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

Давайте попробуем:

plt.bar(x=df['Year'], height=df['Men'])
plt.bar(x=df['Year'], height=df['Women'])

plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

Это возвращает следующее изображение:

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

Мы установим ширину на уровне 40% (0,4) и добавим эту ширину к x-серии второго ряда.

Давайте попробуем:

width = 0.4
plt.bar(x=df['Year'], height=df['Men'], width=width)
plt.bar(x=df['Year']+width, height=df['Women'], width=width)

plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.show()

Это возвращает следующую таблицу:

Как добавить легенду к гистограммам?

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

Чтобы сделать это, добавим аргумент label= к каждому вызову plt.bar() и присвоим необходимую метку. Затем вызовем метод .legend() для объекта plt.

Давайте попробуем:

width = 0.4
plt.bar(x=df['Year'], height=df['Men'], width=width, label='Men')
plt.bar(x=df['Year']+width, height=df['Women'], width=width, label='Women')

plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.legend()
plt.show()

Это возвращает следующую диаграмму:

Легенду можно перемещать, используя аргумент loc= в методе plt.legend(). По умолчанию Matplotlib выбирает наилучшее расположение ('best'). Однако, мы также можем задать другие позиции, такие как нижний правый угол вручную.

Давайте попробуем это сделать:

width = 0.4
plt.bar(x=df['Year'], height=df['Men'], width=width, label='Men')
plt.bar(x=df['Year']+width, height=df['Women'], width=width, label='Women')

plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.legend(loc='lower right')
plt.show()

Это возвращает следующее изображение:

Как добавить гистограмму с накоплением в Matplotlib?

Сложенные гистограммы могут быть очень полезным инструментом для визуализации сравнительных данных в серии, разбитых по другому признаку.

Это немного необычно делать в Matplotlib. Мы добавим второй график снова. Однако на этот раз мы можем использовать аргумент bottom=, чтобы задать откуда должны начинаться столбцы для второго графика.

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

Давайте попробуем это сделать:

plt.bar(x=df['Year'], height=df['Men'], label='Men')
plt.bar(x=df['Year'], height=df['Women'], bottom=df['Men'], label='Women')

plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.legend()
plt.show()

Это возвращает следующую диаграмму:

Как добавить пропорциональную гистограмму с накоплением в Matplotlib?

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

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

Мы можем написать следующий код, чтобы сделать это и создать диаграмму:

df['Men Prop'] = df['Men'] / df['Total'] * 100
df['Women Prop'] = df['Women'] / df['Total'] * 100

plt.bar(x=df['Year'], height=df['Men Prop'], label='Men')
plt.bar(x=df['Year'], height=df['Women Prop'], bottom=df['Men Prop'], label='Women')

plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.legend()
plt.show()

Этот возвращает следующую диаграмму:

Как добавить стиль к гистограммам?

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

print(plt.style.available)

Это возвращает следующее: ['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

Посмотрим, как будет выглядеть наша диаграмма в стиле ggplot

plt.style.use('ggplot')
width = 0.4
plt.bar(x=df['Year'], height=df['Men'], width=width, label='Men')
plt.bar(x=df['Year']+width, height=df['Women'], width=width, label='Women')

plt.title('Sales over time', fontsize=18)
plt.xlabel('Year')
plt.ylabel('Sales')
plt.legend(loc='lower right')
plt.show()

Этот возвращает следующую диаграмму:

Чтобы узнать больше о стилях, ознакомьтесь с официальной документацией здесь

Заключение

В этом посте вы узнали, как создавать столбчатые диаграммы Matplotlib, включая добавление нескольких столбцов, добавление заголовков и подписей осей, условную настройку цветов, добавление легенд и настройку с помощью стилей Matplotlib.

Чтобы узнать, как создавать другие типы графиков, такие как гистограммы, посмотрите мою коллекцию здесь

Last updated