Диаграммы с столбцами в 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