График стека Matplotlib - Учебное пособие и примеры

Введение В Python существует множество библиотек визуализации данных, но Matplotlib - самая популярная из них. Популярность Matplotlib объясняется его надежностью и полезностью - он может создавать как простые, так и сложные графики с небольшим количеством кода. Вы также можете настроить графики различными способами. В этом уроке мы расскажем, как строить графики стека в Matplotlib. > Наборы графиков используются для построения линейных данных в вертикальном порядке с наложением каждого линейного графика на другой. Типичный

Вступление

В 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() 

Это приводит к:

простой график стекаmatplotlib{.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() 

Теперь это приводит к:

график стека matplotlib слегендой{.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 столбца, чтобы хотя бы поместиться в сюжет:

matplotlib stackplot случаиcovid{.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.

Он служит уникальным практическим руководством по визуализации данных в виде множества инструментов, которые вы можете использовать в своей карьере.

comments powered by Disqus