Как построить красивый waterfall chart в Python? - LEFT JOIN

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

Менеджер

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

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

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

*

6 августа 2020 г.

Как построить красивый waterfall chart в Python?

Когда-то давно в 2014ом году для одной из презентаций о рынке e-commerce в Юлмарте мы строили широко известную во всем мире консалтинга диаграмму Waterfall, средствами Excel. В этом материале построим Waterfall chart средствами Python — она наглядно демонстрирует изменения с появлением нового положительного или отрицательного фактора. Для построения диаграммы будем использовать библиотеку plotly.

Для тех, кто пропустил: в цикле материалов о визуализации данных на Python мы уже пробовали строить диаграмму Градусник — она полезна, когда мы хотим сравнить, как соотносятся ожидаемые и реальные данные.

В качестве данных используем сведенную в Юлмарте информацию об изменении объёма рынка e-commerce с 2013 по 2014 год. Данные по оси X — подписи к каждому столбцу, по Y — начальные, итоговые значения и их изменения. Функцией sum() посчитаем итог и добавим его в конец списка. Тег <br> в списке x_list означает перенос строки.



import plotly.graph_objects as go

x_list = [‘2013′,’Макроэкономика РФ’,’Сокращение численности<br>трудоспобного населения’,’Проникновение интернета’,’Развитие трансграничной<br>торговли’, ‘Федеральные компании’, ‘2014’]
y_list = [738.5, 48.7, -7.4, 68.7, 99.7, 48.0]
total = round(sum(y_list))
y_list.append(total)

Создадим список text_list — это те самые значения столбцов. Они берутся из списка y_list, но сперва их нужно немного обработать: переведём все числа в строки и если это столбец с изменением, то есть любой столбец, кроме первого и последнего, добавим к строке знак «плюс» для наглядности. А ещё в случае положительного изменения поменяем цвет на зелёный и на красный в обратном случае. Первому и последнему значению прибавим жирности к шрифту тегом <b>.



text_list = []
for index, item in enumerate(y_list):
    if item > 0 and index != 0 and index != len(y_list) — 1:
        text_list.append(f’+{str(y_list[index])}’)
    else:
        text_list.append(str(y_list[index]))
for index, item in enumerate(text_list):
    if item[0] == ‘+’ and index != 0 and index != len(text_list) — 1:
        text_list[index] = ‘<span style="color:#2ca02c">‘ + text_list[index] + ‘</span>‘
    elif item[0] == ‘-‘ and index != 0 and index != len(text_list) — 1:
        text_list[index] = ‘<span style="color:#d62728">‘ + text_list[index] + ‘</span>‘
    if index == 0 or index == len(text_list) — 1:
        text_list[index] = ‘<b>‘ + text_list[index] + ‘</b>‘

Для того, чтобы поместить на фон пунктирные линии, необходимо задать их параметры. Сделаем список словарей и положим в него пунктирные линии светло-серого цвета с положением по Y от 0 до 1000 с шагом в 200.



dict_list = []
for i in range(0, 1200, 200):
    dict_list.append(dict(
            type=»line»,
            line=dict(
                 color=»#666666″,
                 dash=»dot»
            ),
            x0=-0.5,
            y0=i,
            x1=6,
            y1=i,
            line_width=1,
            layer=»below»))

Теперь зададим диаграмму — она лежит в методе Waterfall(). У каждого столбца есть тип — total, absolute или relative. Колонки с итоговыми значениями получают тип total или absolute, с промежуточными — relative. Кроме того, задаём цвета: делаем соединяющую линию прозрачной, положительные изменения — зелёными, отрицательные — красными, а итоговые колонки — фиолетовыми. Для текста выберем шрифт Open Sans.

О том, как подобрать хорошие шрифты для своей визуализации данных, можно узнать в материале «Choosing Fonts for Your Data Visualization»



fig = go.Figure(go.Waterfall(
    name = «e-commerce», orientation = «v»,
    measure = [«absolute», «relative», «relative», «relative», «relative», «relative», «total»],
    x = x_list,
    y = y_list,
    text = text_list,
    textposition = «outside»,
    connector = {«line»:{«color»:’rgba(0,0,0,0)’}},
    increasing = {«marker»:{«color»:»#2ca02c»}},
    decreasing = {«marker»:{«color»:»#d62728″}},
    totals={‘marker’:{«color»:»#9467bd»}},
    textfont={«family»:»Open Sans, light»,
              «color»:»black»
             }
))

Наконец, добавим заголовок и описание графика, уберём легенду, подпишем ось Y и внесём пунктирные линии на график.



fig.update_layout(
    title = 
        {‘text’:’<b>Waterfall chart</b><br><span style="color:#666666">Изменение объема рынка e-commerce с 2013 по 2014 год</span>‘},
    showlegend = False,
    height=650,
    font={
        ‘family’:’Open Sans, light’,
        ‘color’:’black’,
        ‘size’:14
    },
    plot_bgcolor=’rgba(0,0,0,0)’,
    yaxis_title=»млрд руб.»,
    shapes=dict_list
)
fig.update_xaxes(tickangle=-45, tickfont=dict(family=’Open Sans, light’, color=’black’, size=14))
fig.update_yaxes(tickangle=0, tickfont=dict(family=’Open Sans, light’, color=’black’, size=14))

fig.show()

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

238 просмотров

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

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

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

[ Дальше ]