7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

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

Столбчатые диаграммы можно легко создавать в matplotlib. Однако matplotlib часто рассматривают как библиотеку, которая создаёт неинтересные диаграммы и с которой может быть сложно работать.

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

В этой статье мы рассмотрим, как можно отказаться от такой скучной фигуры, как эта:

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

И придти к такому варианту:

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

Импорт библиотек и настройка данных

Первым шагом является импорт библиотек, с которыми мы собираемся работать. В нашем случае мы будем использовать pandas для хранения наших данных и matplotlib для создания фигур.

import pandas as pd import matplotlib.pyplot as plt

Далее мы создадим некоторые данные, которые были получены в ходе конкурса машинного обучения Xeex Force 2020 по литологии. Эти данные представляют отдельные скважины со средними значениями пористости для литологии песчаника в пределах Hugin Fm. Они берут начало на норвежском континентальном шельфе.

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

Вместо того, чтобы загружать данные из CSV-файла, мы можем создать его с помощью простого словаря и передать его функции pd.DataFrame().

wells_porosity = {'15/9-13': 18.2, '16/10-1': 26.0, '16/10-2': 21.8, '16/10-3': 16.7, '16/2-16': 19.8, '25/2-13 T4': 13.3, '25/2-14': 11.6, '25/2-7': 10.7, '25/3-1': 6.9, '25/4-5': 12.0, '25/5-1': 8.9, '25/5-4': 15.0, '25/6-1': 18.9, '25/7-2': 6.5, '25/8-5 S': 21.2, '25/8-7': 26.1, '25/9-1': 23.0, '26/4-1': 13.9} df = pd.DataFrame(wells_porosity.items(), columns=['well', 'porosity'])

Создание базового столбчатого графика с помощью Matplotlib

Теперь, когда у нас есть настройка фрейма данных pandas, мы можем перейти к созданию нашей самой первой гистограммы. Существует несколько способов создания столбчатого графика, один из которых предполагает прямое использование фрейма данных ( df.plot(kind='bar'….)), однако в этой статье мы сосредоточимся на использовании кода, ориентированного на matplotlib, для построения нашего графика.

Чтобы создать базовую столбчатую диаграмму с помощью matplotlib, нам нужно настроить наши переменные fig и ax, которым будет присвоено значение plt.subplots(). В рамках этой функции мы можем передать размер графика.

Далее мы создадим новую переменную с именем bars и присвоим её plt.bar(). Внутри этой функции мы можем передать нашу категориальную переменную, в данном случае список названий скважин, и среднее значение пористости.

fig, ax = plt.subplots(figsize=(8,8)) bars = plt.bar(df['well'], df['porosity']) plt.show()

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

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

Если мы внимательнее посмотрим на него, то начнём видеть больше проблем:

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

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

1. Поверните свою диаграмму

Первым шагом в улучшении нашей столбчатой диаграммы является поворот её на 90 градусов.

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

Кроме того, горизонтальные столбчатые диаграммы - отличный способ сэкономить место в отчёте или презентации, сохраняя при этом удобочитаемость. Это особенно полезно, если у вас большое количество категорий.

Чтобы повернуть нашу столбчатую диаграмму, мы должны изменить тип графика, который мы вызываем в matplotlib, с .bar() на .barh().

fig, ax = plt.subplots(figsize=(8,8)) bars = plt.barh(df['well'], df['porosity']) plt.show()

В ответ мы получаем следующую таблицу с метками категорий (названиями скважин) в гораздо более приятном и удобном для чтения формате.

Теперь мы можем определить, какая метка принадлежит какому столбцу.

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

2. Расположите столбцы по порядку

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

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

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

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

Это также создаёт более эстетичную диаграмму для просмотра, придавая данным ощущение упорядоченности.

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

df = df.sort_values(by='porosity') fig, ax = plt.subplots(figsize=(8,8)) bars = plt.barh(df['well'], df['porosity']) plt.show()

При выполнении кода, находящегося выше, мы получим следующий график:

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

3. Удалите ненужные элементы

Если у нас есть ненужные элементы диаграммы, такие как линии сетки и границы (обычно известные как “мусор для диаграмм”), это может отвлечь читателя и может занять больше времени для понимания диаграммы.

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

Для нашей диаграммы мы удалим верхний, нижний и правый края, вызвав ax.spines[[‘right’, ‘top’, ‘bottom’]].set_visible(False).

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

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

df = df.sort_values(by='porosity') fig, ax = plt.subplots(figsize=(8,8)) bars = plt.barh(df['well'], df['porosity']) ax.spines[['right', 'top', 'bottom']].set_visible(False) ax.xaxis.set_visible(False) plt.show()

При выполнении кода, находящегося выше, мы получим следующий график.

Теперь он выглядит намного чище, чем на предыдущем шаге.

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

4. Добавьте метки данных

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

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

Чтобы упростить добавление меток на столбчатые диаграммы, разработчики matplotlib внедрили функцию bar_label(). Она позволяет нам передавать наши столбчатые диаграммы, и они автоматически добавят метки.

df = df.sort_values(by='porosity') fig, ax = plt.subplots(figsize=(8,8)) bars = plt.barh(df['well'], df['porosity']) ax.spines[['right', 'top', 'bottom']].set_visible(False) ax.xaxis.set_visible(False) ax.bar_label(bars) plt.show()

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

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

Управление форматом метки функции bar_label matplotlib

Функция bar_label() позволяет нам предоставить ряд аргументов ключевого слова.

В приведённом ниже примере я изменил размер, цвет и толщину шрифта.

Кроме того, чтобы разместить метки на внутреннем краю панели, мы можем вызвать параметр заполнения (pad). Если мы используем отрицательное число, мы сможем разместить метки внутри столбцов.

Параметр fmt позволяет нам управлять отображением меток. Использование %.1f%% означает, что мы используем 1 десятичный знак и включаем знак % в конце метки.

df = df.sort_values(by='porosity') fig, ax = plt.subplots(figsize=(8,8)) bars = plt.barh(df['well'], df['porosity']) ax.spines[['right', 'top', 'bottom']].set_visible(False) ax.xaxis.set_visible(False) ax.bar_label(bars, padding=-45, color='white', fontsize=12, label_type='edge', fmt='%.1f%%', fontweight='bold') plt.show()

При выполнении кода, находящегося выше, мы получим следующий график:

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

5. Увеличьте расстояние между столбцами

Ещё одним шагом в улучшении удобочитаемости является увеличение расстояния между столбцами. Это позволяет нам создать менее загромождённую и более эстетичную диаграмму.

Чтобы увеличить интервал, нам сначала нужно увеличить высоту нашего графика в вызове функции plt.subplots(), а затем добавить параметр height в функцию plt.barh().

df = df.sort_values(by='porosity') fig, ax = plt.subplots(figsize=(8,12)) bars = plt.barh(df['well'], df['porosity'], height=0.7) ax.spines[['right', 'top', 'bottom']].set_visible(False) ax.xaxis.set_visible(False) ax.bar_label(bars, padding=-45, color='white', fontsize=12, label_type='edge', fmt='%.1f%%', fontweight='bold') plt.show()

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

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

6. Выбор цветов для столбчатых графиков

Выбор цвета для диаграмм может быть весьма субъективным и отнимать много времени. В идеале мы хотим постараться не ошеломлять читателя радужной палитрой цветов. График не только будет выглядеть некачественно, но и может ухудшить читаемость и повлиять на смысл, который вы пытаетесь донести.

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

  • Мы можем сохранить согласованность цветов, таких как синий на предыдущих диаграммах
  • Используйте цвет, чтобы привлечь внимание к верхней или нижней полосе
  • Используйте цвет, чтобы привлечь внимание к определенному столбцу
  • Используйте цвет для выделения полос, соответствующих определённым критериям
  • Используйте цвет, который ассоциируется с брендингом категории, например, используйте синий для Facebook и красный для YouTube
  • Используйте цвет для отображения группировок
  • Улучшить доступность для читателей с нарушениями цветовосприятия
  • !И есть ещё много способов.

Давайте подробнее рассмотрим несколько из этих различных вариантов использования цвета в линейном графике matplotlib.

Привлечение внимания к одному столбцу с помощью цвета

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

Вместо того, чтобы создавать список для наших цветов, мы добавим цвета непосредственно в dataframe, используя функцию apply и лямбда-функцию. Здесь мы выделяем конкретную строку:

well_name = "16/2-16" highlight_colour = '#d95f02' non_highlight_colour = '#768493' df['colours'] = df['well'].apply(lambda x: highlight_colour if x == well_name else non_highlight_colour) df = df.sort_values(by='porosity') fig, ax = plt.subplots(figsize=(8,12)) bars = plt.barh(df['well'], df['porosity'], height=0.7, color=df['colours']) ax.spines[['right', 'top', 'bottom']].set_visible(False) ax.xaxis.set_visible(False) ax.yaxis.set_tick_params(labelsize=14) ax.bar_label(bars, padding=-45, color='white', fontsize=12, label_type='edge', fmt='%.1f%%', fontweight='bold') plt.show()

При выполнении кода, находящегося выше, мы получим следующий график. Мы видим, что полоса 16/2–16 выделена оранжевым цветом и сразу привлекает ваше внимание.

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

Нанесите цвет выше предельного значения

Другой способ применить цвет - выделить определённые категории / полосы, которые соответствуют или превышают пороговое значение.

В этом примере мы хотим выделить полосы, пористость которых превышает 20%. Мы могли бы просто позволить читателям использовать метки для идентификации полос, однако, чтобы читателю было проще и быстрее, мы можем выделить их.

Это делается с помощью функции apply в pandas и с помощью лямбда-функции, которая проверяет, превышают ли значения наше предельное значение.

porosity_cutoff = 20 highlight_colour = '#d95f02' non_highlight_colour = '#768493' df['colours'] = df['porosity'].apply(lambda x: highlight_colour if x >= porosity_cutoff else non_highlight_colour) df = df.sort_values(by='porosity') fig, ax = plt.subplots(figsize=(8,12)) bars = plt.barh(df['well'], df['porosity'], height=0.7, color=df['colours']) ax.spines[['right', 'top', 'bottom']].set_visible(False) ax.xaxis.set_visible(False) ax.yaxis.set_tick_params(labelsize=14) ax.bar_label(bars, padding=-45, color='white', fontsize=12, label_type='edge', fmt='%.1f%%', fontweight='bold') plt.show()

Когда график сгенерирован, мы получаем следующую визуализацию, а 5 верхних столбцов сразу начинают привлекать наше внимание.

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

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

porosity_cutoff = 20 highlight_colour = '#d95f02' non_highlight_colour = '#768493' df['colours'] = df['porosity'].apply(lambda x: highlight_colour if x >= porosity_cutoff else non_highlight_colour) df = df.sort_values(by='porosity') fig, ax = plt.subplots(figsize=(8,12)) bars = plt.barh(df['well'], df['porosity'], height=0.7, color=df['colours']) ax.spines[['right', 'top', 'bottom']].set_visible(False) ax.xaxis.set_visible(False) ax.bar_label(bars, padding=-45, color='white', fontsize=12, label_type='edge', fmt='%.1f%%', fontweight='bold') ax.yaxis.set_tick_params(labelsize=14) ax.axvline(x=20, zorder=0, color='grey', ls='--', lw=1.5) ax.text(x=20, y=1, s='20% Porosity Cutoff', ha='center', fontsize=14, bbox=dict(facecolor='white', edgecolor='grey', ls='--')) plt.show()

Используя функции ax.text и ax.axvlinefunctions matplotlib, мы можем добавить метку и вертикальную линию отсечения, чтобы объяснить, почему выделены 5 верхних столбцов.

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

7. Добавьте заголовок

Если мы перенесём нашу диаграмму туда, где мы используем однократное ограничение пористости на 20%, мы сможем улучшить её, добавив информативный заголовок. Это непосредственно сообщает читателю, о чём идет речь в таблице.

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

Мы можем сделать это, просто добавив вызов ax.title в наш код.

porosity_cutoff = 20 highlight_colour = '#d95f02' non_highlight_colour = '#768493' df['colours'] = df['porosity'].apply(lambda x: highlight_colour if x >= porosity_cutoff else non_highlight_colour) df = df.sort_values(by='porosity') fig, ax = plt.subplots(figsize=(8,12)) bars = plt.barh(df['well'], df['porosity'], height=0.7, color=df['colours']) ax.spines[['right', 'top', 'bottom']].set_visible(False) ax.xaxis.set_visible(False) ax.bar_label(bars, padding=-45, color='white', fontsize=12, label_type='edge', fmt='%.1f%%', fontweight='bold') ax.yaxis.set_tick_params(labelsize=14) ax.axvline(x=20, zorder=0, color='grey', ls='--', lw=1.5) ax.text(x=20, y=1, s='20% Porosity Cutoff', ha='center', fontsize=14, bbox=dict(facecolor='white', edgecolor='grey', ls='--')) ax.set_title('Wells With > 20% Porosity in the Hugin Formation', fontsize=16, fontweight='bold', pad=20) plt.show()

Заключение

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

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

7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми
7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми

Почему бы не попробовать эти примеры на вашей следующей гистограмме?

Статья была взята из этого источника:

11
Начать дискуссию