Рубрики
Без рубрики

Создание красивых тепломаперов с морским

Графики являются специфическим типом участка, который использует комбинацию цветовых схем и числовых значений для представления сложных и сочлененных наборов данных. Они в значительной степени используются в приложении науки Data, которые включают в себя большое количество, таких как биология, экономика и медицина. В этом видео мы увидим, как создать тепловую карту для представления общего … Создание красивых тепломаперов с Морной Подробнее »

Автор оригинала: Andrea Ridolfi.

Графики являются специфическим типом участка, который использует комбинацию цветовых схем и числовых значений для представления сложных и сочлененных наборов данных. Они в значительной степени используются в приложении науки Data, которые включают в себя большое количество, таких как биология, экономика и медицина.

В этом видео мы увидим, как создать тепловую карту для представления общего числа случаев Covid-19 в разных странах США, в разные дни. Для достижения этого результата мы будем эксплуатировать Морской , пакет Python, который предоставляет множество причудливых и мощных функций для построения данных.

Вот код, который будет обсуждаться:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#url of the .csv file
url = r"path of the .csv file"

# import the .csv file into a pandas DataFrame
df = pd.read_csv(url, sep = ';', thousands = ',')

# defining the array containing the states present in the study
states = np.array(df['state'].drop_duplicates())[:40]

#extracting the total cases for each day and each country
overall_cases = []
for state in states:
    tot_cases = []
    for i in range(len(df['state'])):
        if df['state'][i] == state:
            tot_cases.append(df['tot_cases'][i])
    overall_cases.append(tot_cases[:30])

data = pd.DataFrame(overall_cases).T
data.columns = states

#Plotting
fig = plt.figure()
ax = fig.subplots()
ax = sns.heatmap(data, annot = True, fmt="d", linewidths=0, cmap = 'viridis', xticklabels = True)
ax.invert_yaxis()
ax.set_xlabel('States')
ax.set_ylabel('Day n°')
plt.show()

Давайте погрузимся в код, чтобы выучить функциональность радиатора Meanborn в пошаговой манере.

Импорт необходимых библиотек для этого примера

Мы начинаем наш скрипт, импортируя запрошенные библиотеки для выполнения этого примера; А именно Numpy, Pandas, Matplotlib и Meanborn.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

Что в данных?

Как уже упоминалось во введении, мы будем использовать данные COVID-19, которые были также использованы в статье о Scipy.curve_fit () функция. Данные были загружены с официального сайта «Центры для контроля и профилактики заболеваний» как файл .csv.

Файл сообщает о нескольких данных, касающихся пандемии COVID-19 в различных странах США, таких как общее количество дел, количество новых случаев, количество смертей и т. Д. Все они были записаны каждый день для нескольких стран США.

Мы будем генерировать тепловую карту, которая отображается в каждом слоте количества общих случаев, зарегистрированных на определенный день в конкретной стране США. Для этого, первое, что должно быть сделано, – это импортировать файл .csv и хранить его в PandaFrame PandaS.

Импорт данных с Pands

Данные хранятся в файле .csv; Различные значения разделены полуточкой, в то время как тысячи символ обозначается запятой. Для того чтобы импортировать файл .csv в нашем сценарии Python, мы используем функцию Panda .read_csv () который принимает в качестве ввода пути файла и преобразует его в Pandas DataFrame Отказ

Важно отметить, что при звонке .read_csv (), Мы указываем сепаратор, который в нашем случае «;» Сказав «и символ, используемый для обозначения тысяч, написанием». Все эти вещи содержатся в следующих линиях кода:

#url of the .csv file
url = r"path of the file" 
# import the .csv file into a pandas DataFrame
df = pd.read_csv(url, sep = ';', thousands = ',')

Создание массивов, которые будут использоваться в радиаторе

На данный момент мы должны редактировать созданный dataframe, чтобы извлечь только информацию, которая будет использоваться для создания тепломапа.

Первые значения, которые мы извлекаем, являются теми, которые описывают имя стран, в которых были записаны данные. Чтобы лучше определить все категории, составляющие DataFrame, мы можем ввести «DF.Columns» для распечатки заголовка файла. Среди различных категорий, присутствующих в заголовке, тот, который мы заинтересованы в том, это «государство», в котором мы можем найти имя всех государств, участвующих в этом графике.

Поскольку данные записываются ежедневно, каждая строка соответствует данным, собранным в течение одного дня в определенном состоянии; В результате имена состояний повторяются вдоль этого столбца. Поскольку мы не хотим никакого повторения в нашей обогревании, мы также должны удалить дубликаты из массива.

Мы продолжаем дальше, определяя Numpy Array называется «состояния», в которых мы храним все значения, присутствующие под столбцом «состояние» датафарама; В той же линии кода мы также применяем метод .drop_duplates () Удалить любой дубликат этого массива. Поскольку в DataFrame есть 60 состояний, мы ограничиваем наш анализ на первые 40, чтобы не создавать графические проблемы в метках оси X Heatmap из-за ограниченного окна.

#defining the array containing the states present in the study
states = np.array(df['state'].drop_duplicates())[:40]  

Следующим шагом является извлечение количества общих случаев, записанных на каждый день в каждой стране. Для этого мы используем два вложенных для циклов, которые позволяют нам создавать список, содержащий N ° общим случаям (целочисленное число для каждого дня) для каждой страны, присутствующей в массиве «состояния», и добавление их в другой список, называемых «Exchange_Cases «Который должен быть определен перед вызовом цикла.

#extracting the total cases for each day and each country
overall_cases = []

Как вы можете видеть в следующем коде, в первом для цикла мы переиграем в разных состояниях, которые ранее были сохранены в массиве «состояния»; Для каждого состояния мы определяем пустой список, называемый «TOT_CASES», в которых мы добавим значения, упомянутые на общие случаи, записанные в каждый день.

for state in states:
    tot_cases = []

Как только мы находимся в первом для петли (означает, что мы имеем дело с одним состоянием), мы инициализируем другую для цикла, которая итасила все общие значения, сохраненные для этого конкретного состояния. Этот второй для цикла начнется с элемента 0 и итерации через все значения «состояния» столбца нашего DataFrame. Мы достигаем этого, используя функции Диапазон и лен

   for i in range(len(df['state'])):

Как только мы находимся в пределах этой секунды для петля, мы хотим добавить к Список «TOT_CASES» только значения, которые называются государством, в настоящее время заинтересованы в настоящее время (то есть, определенная в первом для цикла, идентифицированной по значению переменной «состояния»); Мы делаем это, используя следующие Если заявление :

       if df['state'][i] == state:
              tot_cases.append(df['tot_cases'][i])

Когда мы закончили при добавлении ценностей общих случаев для каждого дня конкретной страны в список «TOT_CASES», мы выходим из внутреннего цикла и сохраните этот список в один список в «цаплеец_cases», который затем станет списком списки. Также в этом случае мы ограничиваем наш анализ на первые 30 дней, в противном случае у нас не было бы достаточно места в нашей тепломапе для всех 286 значений, присутствующих в DataFrame.

     overall_cases.append(tot_cases[:30])

В следующем итерации код начнет анализировать второй элемент массива «состояния», то есть другая страна, инициализирует пустой список, называемый «TOT_CASES», и войти во второй для петли Для добавления всех ценностей, указанных в этой стране в разные дни и в конечном итоге, после завершения, добавьте весь список в список «Общие_Cases»; Эта процедура будет передана для всех стран, хранящихся в массиве «Государствам». В конце мы сделаем все значения, необходимые для генерации нашего теплораспределения.

Создание DataFrame для радиатора

Как уже введено в первой части, мы эксплуатируем функцию морской воды. HeatMap () генерировать нашу тепловую карту.

Эта функция может принимать в качестве входных данных PandaS DataFrame, которая содержит строки, столбцы и все значения для каждой ячейки, которую мы хотим отображать на нашем сюжете. Следовательно, генерируем новые PandaFrame PandaS (мы называем это «данные»), которые содержат значения, хранящиеся в списке «allow_cases»; Таким образом, каждая строка этого нового DataFrame называется определенным состоянием и каждым столбцом в определенный день.

Затем мы транспонируем это dataframe, добавив “.t” в конце строки кода, так как таким образом, мы можем затем вставить имя состояний в качестве заголовка нашего dataframe.

data = pd.DataFrame(overall_cases).T

Имена состояний ранее были сохранены в массиве «Штаты», мы можем изменить заголовок The DataFrame, используя следующий код:

data.columns = states

DataFrame, который будет использоваться для генерации тепломапа, будет иметь следующую форму:

   CO  FL  AZ  SC  CT  NE  KY  WY  IA  ...  LA  ID  NV  GA  IN  AR  MD  NY  OR
 0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   0   0
 1   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   0   0
 2   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   0   0
 3   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   0   0
 4   0   0   1   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   0   0 

Индексы строки представляют собой N ° дня, когда данные записываются, в то время как столбцы заголовка являются названием состояний.

Генерация тепломапа

После создания обычного окна сюжета с типичным функциям MATPLOTLIB мы называем функцию Seborn. HeatMap () генерировать тепловую карту.

Обязательный ввод этой функции – это Pandas DataFrame, который мы создали в предыдущем разделе. Существуют несколько дополнительных входных параметров, которые могут улучшить нашу тепловую карту:

  • Строительство позволяет добавлять белый контур в каждую клетку, чтобы лучше отделить их, мы просто должны указывать ширину;
  • xticklabels Измените обозначение вдоль оси X, если она равно True, все значения массива, нанесенные, поскольку ось X будет отображаться.
  • Мы также можем выбрать корпус тепломапа, используя CMAP и указание имени доступного тепломапа («виридис» или «магма» очень фантазии, но и по умолчанию по умолчанию Sebor на самом деле круто);
  • Наконец, можно отобразить численное значение каждой ячейки, используя опцию Annot; Численное значение будет отображаться в центре каждой ячейки.

Следующие строки содержат код для построения тепломапа. Одно окончательное наблюдение касается команды .invert_yaxis (); Поскольку мы замышляем тепловую карту непосредственно из PandaS DataFrame, индекс строки будет «день N °»; Следовательно, это начнется с 0 и увеличивается, когда мы идем вдоль рядов. Добавляя .invert_yaxis () Изменяем ось Y, имея день 0 в нижней части тепломапа.

#Plotting
fig = plt.figure()
ax = fig.subplots()
ax = sns.heatmap(data, annot = True, fmt="d", linewidths=0, cmap = 'viridis', xticklabels = True)
ax.invert_yaxis()
ax.set_xlabel('States')
ax.set_ylabel('Day n°')
plt.show() 

На рисунке 1 отображается тепловая карта, полученная этим фрагментом кода.

Рисунок 1: HeatMap, представляющий количество общих чехлов COVID-19 в течение первых 30 дней измерения (ось Y) в различных странах США (ось X).

Как видно на рисунке 1, есть много нулей, это потому, что мы решили построить данные, связанные с первыми 30 дней измерения, в которых N ì записанные случаи были очень низкими. Если мы решили построить результаты из всех дней измерения (с 0 до 286 дней), мы получим результат, отображаемый на рисунке 2 (в этом последнем случае, мы поместили Annot равна false, поскольку число были слишком большие для размера ячейки):

Рисунок 2: HeatMap, представляющий количество общих чехлов COVID-19 для первых 286 дней измерения (ось Y) в различных странах США (оси X); На этот раз Также, поскольку клетки слишком малы для размещения N ° общей части (которые становится очень большой в верхней части тепломапа).