Вступление
В Python есть много библиотек визуализации данных, но Matplotlib - самая популярная из них. Популярность Matplotlib объясняется его надежностью и полезностью - он может создавать как простые, так и сложные графики с небольшим количеством кода. Вы также можете настроить графики различными способами.
В этом уроке мы расскажем, как строить графики стека в Matplotlib .
Графики с накоплением используются для построения линейных данных в вертикальном порядке с наложением каждого линейного графика на другой. Обычно они используются для создания кумулятивных графиков.
Импорт данных
Мы будем использовать набор данных о вакцинации против Covid-19 из « Нашего мира в данных» , в частности набор данных, содержащий совокупные прививки по странам.
Мы начнем с импорта всех необходимых нам библиотек. Мы импортируем Pandas для чтения и анализа набора данных, Numpy для генерации значений для оси X, и, конечно, нам нужно будет импортировать модуль PyPlot из Matplotlib:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
Давайте DataFrame
мы будем использовать:
dataframe = pd.read_csv("cumulative-covid-vaccinations.csv")
print(dataframe.head(25))
Нас интересуют Entity
и total_vaccinations
. Хотя мы могли бы также
использовать Date
, чтобы лучше понять, как проходят вакцинации изо
дня в день , мы будем рассматривать первую запись как день 0, а
последнюю запись как день N :
Entity Code Date total_vaccinations
0 Albania ALB 2021-01-10 0
1 Albania ALB 2021-01-12 128
2 Albania ALB 2021-01-13 188
3 Albania ALB 2021-01-14 266
4 Albania ALB 2021-01-15 308
5 Albania ALB 2021-01-16 369
...
16 Albania ALB 2021-02-22 6728
17 Albania ALB 2021-02-25 10135
18 Albania ALB 2021-03-01 14295
19 Albania ALB 2021-03-03 15793
20 Albania ALB 2021-03-10 21613
21 Algeria DZA 2021-01-29 0
22 Algeria DZA 2021-01-30 30
23 Algeria DZA 2021-02-19 75000
24 Andorra AND 2021-01-25 576
Этот набор данных потребует некоторой предварительной обработки, поскольку это особый вариант использования. Хотя, прежде чем его обрабатывать, давайте познакомимся с тем, как обычно строятся графики стека.
Постройте участок стека в Matplotlib
Наборы графиков используются для визуализации нескольких линейных графиков, наложенных друг на друга. С помощью обычного линейного графика вы должны построить взаимосвязь между X и Y. Здесь мы наносим несколько объектов Y на общую ось X, один поверх другого:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y1 = [5, 6, 4, 5, 7]
y2 = [1, 6, 4, 5, 6]
y3 = [1, 1, 2, 3, 2]
fig, ax = plt.subplots()
ax.stackplot(x, y1, y2, y3)
plt.show()
Это приводит к:
{.ezlazyload}
Поскольку иметь дело с несколькими подобными списками немного громоздко,
вы можете просто использовать словарь, где каждая yn
является записью:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y_values = {
"y1": [5, 6, 4, 5, 7],
"y2": [1, 6, 4, 5, 6],
"y3" : [1, 1, 2, 3, 2]
}
fig, ax = plt.subplots()
ax.stackplot(x, y_values.values())
plt.show()
Это приводит к:
{.ezlazyload}
Поскольку этот тип графика может легко потерять вас в стеках,
действительно полезно добавить метки, прикрепленные к цветам, установив
keys()
из y_values
в качестве labels
и добавив легенду к графику:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y_values = {
"y1": [5, 6, 4, 5, 7],
"y2": [1, 6, 4, 5, 6],
"y3" : [1, 1, 2, 3, 2]
}
fig, ax = plt.subplots()
ax.stackplot(x, y_values.values(), labels=y_values.keys())
ax.legend(loc='upper left')
plt.show()
Теперь это приводит к:
{.ezlazyload}
Примечание: длина этих списков должна быть одинаковой . Вы не
можете построить y1
с 3 значениями и y2
с 5 значениями.
Это подводит нас к нашему набору данных о вакцинации против Covid-19. Мы предварительно обработаем набор данных, чтобы он принял форму словаря, подобного этому, и наметим кумулятивные вакцины, предоставленные населению в целом.
Давайте начнем с группировки набора данных по Entity
и
total_vaccinations
, поскольку каждая Entity
настоящее время имеет
множество записей. Кроме того, мы хотим отбросить объекты с именами
World
и European Union
, поскольку они удобные, добавленные для
случаев, когда вы можете построить только одну совокупную линию.
В нашем случае это более чем удвоит total_vaccination
, поскольку они
включают уже нанесенные на график значения каждой страны как отдельные
объекты:
dataframe = pd.read_csv("cumulative-covid-vaccinations.csv")
indices = dataframe[(dataframe['Entity'] == 'World') | (dataframe['Entity'] == 'European Union')].index
dataframe.drop(indices, inplace=True)
countries_vaccinations = dataframe.groupby('Entity')['total_vaccinations'].apply(list)
Это приводит к совершенно другой форме набора данных - вместо того,
чтобы каждая запись имела свою собственную Entity
/
total_vaccinations
, каждая Entity
будет иметь список их общих
прививок за дни:
Entity
Albania [0, 128, 188, 266, 308, 369, 405, 447, 483, 51...
Algeria [0, 30, 75000]
Andorra [576, 1036, 1291, 1622, 2141, 2390, 2526, 3611...
...
Croatia [7864, 12285, 13798, 20603, 24985, 30000, 3455...
Cyprus [3901, 6035, 10226, 17739, 25519, 32837, 44429...
Czechia [1261, 3560, 7017, 10496, 11813, 12077, 13335,...
Теперь давайте преобразуем эту Series
в словарь и посмотрим, как она
выглядит:
cv_dict = countries_vaccinations.to_dict()
print(cv_dict)
Это приводит к:
{
'Albania': [0, 128, 188, 266, 308, 369, 405, 447, 483, 519, 549, 550, 1127, 1701, 3049, 4177, 6728, 10135, 14295, 15793, 21613],
'Algeria': [0, 30, 75000],
'Andorra': [576, 1036, 1291, 1622, 2141, 2390, 2526, 3611, 4914],
...
}
Однако здесь есть проблема. Мы не можем нанести эти записи, если их формы не совпадают. Например, в Алжире 3 записи, а в Андорре - 9. Чтобы бороться с этим, мы захотим найти ключ с наибольшим количеством значений и их количеством.
Затем создайте новый словарь (не рекомендуется изменять исходный словарь
во время итерации по нему) и вставьте 0
для каждого пропущенного дня в
прошлом, поскольку в те дни 0
max_key, max_value = max(cv_dict.items(), key = lambda x: len(set(x[1])))
cv_dict_full = {}
for k,v in cv_dict.items():
if len(v) < len(max_value):
trailing_zeros = [0]*(len(max_value)-len(v))
cv_dict_full[k] = trailing_zeros+v
else:
cv_dict_full[k] = v
print(cv_dict_full)
Здесь мы просто проверяем, меньше ли длина списка в каждой записи, чем длина списка с максимальной длиной. Если это так, мы добавляем разницу между ними в нулях и добавляем это значение в исходный список значений.
Теперь, если мы напечатаем этот новый словарь, мы увидим что-то вроде:
{
'Albania': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 188, 266, 308, 369, 405, 447, 483, 519, 549, 550, 1127, 1701, 3049, 4177, 6728, 10135, 14295, 15793, 21613],
'Algeria': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 75000],
'Andorra': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 576, 1036, 1291, 1622, 2141, 2390, 2526, 3611, 4914],
...
}
Страна с наибольшим количеством входных значений:
print(max_key, len(max_value)) # Canada 90
Теперь, когда мы полностью подготовили наш набор данных и можем построить его, как мы построили графики стека до него, давайте сгенерируем дни и построим график:
dates = np.arange(0, len(max_value))
fig, ax = plt.subplots()
ax.stackplot(dates, cv_dict_full.values(), labels=cv_dict_full.keys())
ax.legend(loc='upper left', ncol=4)
ax.set_title('Cumulative Covid Vaccinations')
ax.set_xlabel('Day')
ax.set_ylabel('Number of people')
plt.show()
Поскольку в мире много стран, легенда будет изрядно переполнена, поэтому мы поместили ее в 4 столбца, чтобы хотя бы поместиться в сюжет:
{.ezlazyload}
Заключение
В этом руководстве мы рассмотрели, как строить простые графики стека, а также как предварительно обрабатывать наборы данных и формировать данные, чтобы они соответствовали графикам стека, с использованием фреймворков Python Pandas и Matplotlib.
Если вас интересует визуализация данных и вы не знаете, с чего начать, обязательно ознакомьтесь с нашим комплектом книг по визуализации данных в Python{.ebook-link} :
::: {style=“border: 1px solid #ebebeb;padding: 15px;”} {.ebook-link}
Визуализация данных в Python
::: {.row} ::: {.col-md-4 .col-xs-12} {.ezlazyload .img-responsive .center-block} :::
::: {.col-md-8 .col-xs-12 .my-auto} Станьте опасными с визуализацией данных
✅ 30-дневная гарантия возврата денег без вопросов
✅ от начального до продвинутого
✅ Регулярно обновляется бесплатно (последнее обновление в апреле 2021 г.)
✅ Обновлено с бонусными ресурсами и руководствами ::: ::: :::
Визуализация данных в Python с помощью Matplotlib и Pandas - это книга, предназначенная для абсолютных новичков в работе с Pandas и Matplotlib с базовыми знаниями Python и позволяющая им создать прочную основу для расширенной работы с этими библиотеками - от простых графиков до анимированных трехмерных графиков с интерактивными кнопки.
Он служит подробным руководством, которое научит вас всему, что вам нужно знать о Pandas и Matplotlib, в том числе о том, как создавать типы графиков, которые не встроены в саму библиотеку.
Книга «Визуализация данных в Python» , книга для начинающих и средних разработчиков Python, проведет вас через простые манипуляции с данными с помощью Pandas, охватит основные библиотеки построения графиков, такие как Matplotlib и Seaborn, и покажет, как использовать преимущества декларативных и экспериментальных библиотек, таких как Altair. В частности, на протяжении 11 глав эта книга охватывает 9 библиотек Python: Pandas, Matplotlib, Seaborn, Bokeh, Altair, Plotly, GGPlot, GeoPandas и VisPy.
Он служит уникальным практическим руководством по визуализации данных в виде множества инструментов, которые вы можете использовать в своей карьере.