Красивая визуализация в Python. Диаграмма Градусник - LEFT JOIN

Свяжитесь с нами в любой удобной для вас форме

Менеджер

Написать в телеграмм

Онлайн
Телеграмм
или
Заполните форму

2 минут чтения

*

27 мая 2020 г.

Красивая визуализация в Python. Диаграмма Градусник

Очень часто диаграммы, построенные стандартными средствами Matplotlib, выглядят некрасиво и неинформативно. В 2011ом году для целей одного из отчетов телеком-компании в Excel мы построили полезную симпатичную диаграмму «Градусник», рецепт которой стал известен из популярного в тот момент блога Chandoo про приемы визуализации в Excel.

Вот как она выглядела в Excel:

Времена меняются, и мы попробуем восстановить знание о построении этой полезной диаграммы, используя штатные средства библиотеки matplotlib в Python.

Для каких случаев подойдет диаграмма «Градусник»?

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

В этот раз возьмем данные из excel-файла. Используем типичный состав библиотек для работы с данными (и соответствующие им типичные alias):


import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

И считываем в DataFrame таблицу:


df = pd.read_excel(‘data.xlsx’)

Посмотрим, как она выглядит:

Начнем извлекать из таблицы колонки. Первый столбец «Продажи» будет вертикальной подписью к каждому столбцу на графике. «План» — статичный столбец, относительно которого измеряется «Факт». Некоторые данные могут приходить в виде вещественных чисел — такие столбцы будут считаны как тип str, если в данных будет встречена запятая. Чтобы работать с такими числами, будем сначала менять в них запятую на точку, а затем переводить в тип float.


xticks = df.iloc[:,0]

try:

    bars2 = df.iloc[:,1].str.replace(‘,’,’.’).astype(‘float’)

except AttributeError:

    bars2 = df.iloc[:,1].astype(‘float’)

try:

    bars1 = df.iloc[:,2].str.replace(‘,’,’.’).astype(‘float’)

except AttributeError:

    bars1 = df.iloc[:,2].astype(‘float’)

Так как мы не знаем наверняка, будут ли в данных такие числа, можем словить AttributeError в случае их отсутствия, ведь будем обращаться к методу str, который есть только у строк. Поэтому напишем обработчик исключений try – except, который будет на всякий случай переводить данные в тип float.

Построим из этого классический barchart – график со столбцами. Зададим массив положения на оси Х для bars1 функцией np.arange и bars2, смещённый на ширину столбца:


barWidth = 0.2

r1 = np.arange(len(bars1))

r2 = [x + barWidth for x in r1]

plt.bar(r1, bars1, width=barWidth)

plt.bar(r2, bars2, width=barWidth)

И посмотрим, что получилось:

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


barWidth1 = 0.065

barWidth2 = 0.032

x_range = np.arange(len(bars1) / 8, step=0.125)

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


plt.bar(x_range, bars1, color=’#dce6f2′, width=barWidth1/2, edgecolor=’#c3d5e8′, label=’План’)

plt.bar(x_range, bars2, color=’#ffc001′, width=barWidth2/2, edgecolor=’#c3d5e8′, label=’Факт’)

for i, bar in enumerate(bars2):

    plt.text(i / 8 — 0.015, bar + 1, bar, fontsize=14)

Наконец, сделаем несколько визуальных штрихов – уберём лишние рамки, чёрточки, добавим серую линию под столбцами, поправим размер и шрифт легенде, сделаем диаграмму шире, выведем её на экран и сохраним как plt.png в директории скрипта:


plt.xticks(x_range, xticks)

plt.tick_params(

    bottom=False,

    left=False,

    labelsize=15

)

plt.rcParams[‘figure.figsize’] = [25, 7]

plt.axhline(y=0, color=’gray’)

plt.legend(frameon=False, loc=’lower center’, bbox_to_anchor=(0.25, -0.3, 0.5, 0.5), prop={‘size’:20})

plt.box(False)

plt.savefig(‘plt’, bbox_inches = «tight»)

plt.show()

Получили такую диаграмму:

203 просмотров

Добавить комментарий

[ Рекомендации ]

Читайте также

[ Дальше ]