Всіх вітаю! У цій статті пропоную вам зануритися у графіки та візуалізацію на Python за допомогою plotly. На цей раз ми втілимо стовпчикові графіки прослуховувань різних реп виконавців за місяць та графік з оцінками деяких їхніх альбомів за сайтом AOTY.
Підготовка
Встановлення plotly
Windows:
pip install plotlyMacOS:
pip3 install plotlyLinux:
pip install plotlyСтворення списків з даними
Імпортуємо бібліотеку:
import plotly.graph_objects as goСпершу нам треба створити список із значеннями, щоб потім їх візуалізувати. Дані про кількість прослуховувань за місяць були взяті зі Spotify.
Отже, ось наші готові дані:
x = ["JAY-Z", "Eminem", "50 Cent", "Kendrick Lamar", "Lil Wayne", "Future",
"J. Cole", "A$AP Rocky", "Nas", "Travis Scott", "21 Savage", "Pusha T", "Tyler, The Creator", "Lil Baby", "Dr. Dre", "Snoop Dogg", "2Pac",
"The Notorious B.I.G.", "Wiz Khalifa", "Central Cee"]
y = [40520489, 73310969, 46514936, 74929387, 48226508, 54879735, 39121626, 47108369, 9384635, 60529505, 41217352,5574622, 39509505, 31399992, 24295716, 31792147, 28141092, 26072294, 43335258, 24837881]Етапи створення візуалізації
Створення загального графіка
Спочатку створимо загальний графік, де будуть відображені прослуховування за місяць усіх виконавців.
Ось повний код нашого першого графіка:
import plotly.graph_objects as go
x = ["JAY-Z", "Eminem", "50 Cent", "Kendrick Lamar", "Lil Wayne", "Future", "J. Cole", "A$AP Rocky", "Nas",
"Travis Scott", "21 Savage", "Tyler, The Creator", "Lil Baby", "Dr. Dre", "Snoop Dogg", "2Pac",
"The Notorious B.I.G.", "The Game", "Wiz Khalifa", "Central Cee"]
y = [40520489, 73310969, 46514936, 74929387, 48226508, 54879735, 39121626, 47108369, 9384635, 60529505, 41217352,
5574622, 39509505, 31399992, 24295716, 31792147, 28141092, 26072294, 14817907, 43335258, 24837881]
bar_figure = go.Figure(data=[go.Bar(x=x, y=y)])
bar_figure.update_layout(title_text="Топ 20 реп виконавців")
bar_figure.show()Тут ми створюємо сам графік із стовпців та вказуємо значення x та y:
bar_figure = go.Figure(data=[go.Bar(x=x, y=y)])За допомогою метода update_layout() вказуэмо заголовок:
bar_figure.update_layout(title_text="Топ 20 реп виконавців")Відображаємо створений графік:
bar_figure.show()Ось результат:

Графік вийшов чудовим, але я думаю слід додати йому інший колір та тему. Тому змінюємо колір стовпців на відтінок синього за допомогою параметра marker_color:
bar_figure = go.Figure(data=[go.Bar(x=x, y=y, marker_color="#409151")])Тепер додаємо темну тему за допомогою параметра template у методі update_layout():
bar_figure.update_layout(title_text="Топ 20 реп виконавців", template="plotly_dark")Тема plotly_dark — це стандартна темна тема для plotly.
Ось видозмінений код:
import plotly.graph_objects as go
x = ["JAY-Z", "Eminem", "50 Cent", "Kendrick Lamar", "Lil Wayne", "Future", "J. Cole", "A$AP Rocky", "Nas",
"Travis Scott", "21 Savage", "Pusha T", "Tyler, The Creator", "Lil Baby", "Dr. Dre", "Snoop Dogg", "2Pac",
"The Notorious B.I.G.", "Wiz Khalifa", "Central Cee"]
y = [40520489, 73310969, 46514936, 74929387, 48226508, 54879735, 39121626, 47108369, 9384635, 60529505, 41217352,
5574622, 39509505, 31399992, 24295716, 31792147, 28141092, 26072294, 43335258, 24837881]
bar_figure = go.Figure(data=[go.Bar(x=x, y=y, marker_color="#409151")])
bar_figure.update_layout(title_text="Топ 20 реп виконавців", template="plotly_dark")
bar_figure.show()Результат:

Категоризація графіка
Також ми можемо дещо відредагувати наш графік. Зараз він виглядає красивим, але водночас є дуже простим. Я пропоную розділити графік на категорії, щоб виконавці, що мають сорок і більше мільйонів прослуховувань були позначені окремою категорією від тих, що мають менше сорока мільйонів прослуховувань.
Ось код, який оновить наш графік:
part_one_names = ["JAY-Z", "Eminem", "50 Cent", "Kendrick Lamar", "Lil Wayne", "Future", "A$AP Rocky",
"Travis Scott", "21 Savage", "Wiz Khalifa"]
part_one_data = [40520489, 73310969, 46514936, 74929387, 48226508, 54879735, 47108369, 60529505, 41217352, 43335258]
part_two_names = ["J. Cole", "Nas", "Pusha T", "Tyler, The Creator", "Lil Baby", "Dr. Dre", "Snoop Dogg", "2Pac",
"The Notorious B.I.G.", "Central Cee"]
part_two_data = [39121626, 9384635, 5574622, 39509505, 31399992, 24295716, 31792147, 28141092, 26072294, 24837881]
bar_figure = go.Figure(data=[
go.Bar(name=">= 40 мільйонів", x=part_one_names, y=part_one_data, marker_color="#409151"),
go.Bar(name="< 40 мільйонів", x=part_two_names, y=part_two_data, marker_color="#8ba955")
])
bar_figure.update_layout(title_text="Топ 20 реп виконавців", template="plotly_dark")
bar_figure.show()Результат:

Згрупований графік
Тепер пропоную згрупувати наш графік так, щоб під одним значенням по осі x були два стовпчики. Для цього, ми візьмемо по альбому з кожного виконавця та відобразимо його оцінки, зроблені критиками і користувачами.
Оцінки альбомів взяті із сайту AOTY.
Отже, ось зібрані дані:
albums_titles = ["The Blueprint", "The Eminem Show", "Get Rich or Die Tryin'",
"To Pimp a Butterfly", "Tha Carter II", "DS2",
"2014 Forest Hills Drive"]
authors = ["JAY-Z", "Eminem", "50 Cent", "Kendrick Lamar", "Lil Wayne", "Future", "J. Cole"]
critic_scores = [85, 75, 74, 95, 79, 77, 69]
user_scores = [88, 82, 77, 95, 82, 80, 79]Ось повний код:
albums_titles = ["The Blueprint", "The Eminem Show", "Get Rich or Die Tryin'",
"To Pimp a Butterfly", "Tha Carter II", "DS2",
"2014 Forest Hills Drive"]
authors = ["JAY-Z", "Eminem", "50 Cent", "Kendrick Lamar", "Lil Wayne", "Future", "J. Cole"]
critic_scores = [85, 75, 74, 95, 79, 77, 69]
user_scores = [88, 82, 77, 95, 82, 80, 79]
bar_figure = go.Figure(data=[
go.Bar(name="Critic score", x=albums_titles, y=critic_scores,
marker_color="#a2767f",
text=authors,
textposition="inside"),
go.Bar(name="User score", x=albums_titles, y=user_scores,
marker_color="#d9898c",
text=authors,
textposition="inside")])
bar_figure.update_layout(title_text="Оцінки альбомів на AOTY", template="plotly_dark", barmode="group")
bar_figure.show()У цьому графіку необхідно також додати й псевдоніми виконавців, тому спершу нам треба вказати, звідки саме ми будемо брати псевдоніми.
Для цього, у plotly є параметр text:
bar_figure = go.Figure(data=[
go.Bar(name="Critic score", x=albums_titles, y=critic_scores,
marker_color="#a2767f",
text=authors,
textposition="inside"),
go.Bar(name="User score", x=albums_titles, y=user_scores,
marker_color="#d9898c",
text=authors,
textposition="inside")])Отже, ми взяли псевдоніми зі списку authors, але тепер нам треба подумати над їхнім розташуванням на графіку. Для розташування псевдонімів виконавців ми використаємо параметр textposition, де вказали їх положення всередині стовпців (передали значення inside).
Тут, окрім заголовку та теми, надаємо значення “group“ параметру barmode, щоб отримати згрупований графік:
bar_figure.update_layout(title_text="Оцінки альбомів на AOTY", template="plotly_dark", barmode="group")Результат:

Складений графік
Крім згруповування, ми ще можемо скласти графік так, щоб стовпці були один на одному. Для втілення такого типу графіка варто надати значення “stack” у параметр barmode.
Ось повний код:
albums_titles = ["The Blueprint", "The Eminem Show", "Get Rich or Die Tryin'",
"To Pimp a Butterfly", "Tha Carter II", "DS2",
"2014 Forest Hills Drive"]
authors = ["JAY-Z", "Eminem", "50 Cent", "Kendrick Lamar", "Lil Wayne", "Future", "J. Cole"]
critic_scores = [85, 75, 74, 95, 79, 77, 69]
user_scores = [88, 82, 77, 95, 82, 80, 79]
bar_figure = go.Figure(data=[
go.Bar(name="Critic score", x=albums_titles, y=critic_scores,
marker_color="#a2767f",
text=authors,
textposition="inside"),
go.Bar(name="User score", x=albums_titles, y=user_scores,
marker_color="#d9898c",
text=authors,
textposition="inside")])
bar_figure.update_layout(title_text="Оцінки альбомів на AOTY", template="plotly_dark", barmode="stack")
bar_figure.show()Резульат:

Висновок
У даній статті ми навчилися створювати стовпчикові графіки різного типу (категоризовані, згруповані, складені) та стилізовувати їх на різні смаки. Дякую за увагу!