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()
Получим такую диаграмму:
[ Рекомендации ]
Читайте также
1 минута чтения
20 сентября 2022
[ Связаться ]
Давайте раскроем потенциал вашего бизнеса вместе
Заполните форму на бесплатную консультацию