Создание графика тепловой карты

#python #pandas #matplotlib #heatmap

Вопрос:

Я ищу некоторую помощь, чтобы построить тепловую карту, которая должна выглядеть следующим образом: введите описание изображения здесь

Извините заранее, я мог бы придумать какой-нибудь код, но я понятия не имею, с чего начать. Я знаю, что это не так, как работает Stackoverflow, но я не могу начать.

Набор данных, который можно использовать по оси x, представляет собой массив лет с 1975 по 2018 [1975,…..2018]

Для оси y: Массив месяцев [с января по декабрь]

Для значений пересечения x-y, как показано на рисунке, можно использовать 1, 2 или 3

На изображении, которое я добавил, перекрестные знаки представляют пробелы в данных, а пробелы представляют нулевые(0) значения.

Заранее благодарю Вас.

Обновить:

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

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
df = pd.read_csv('Events_in_Month_and_Year.xlsx',encoding = 'unicode_escape',error_bad_lines=False
                )
pivoted = df.pivot_table(index='month', columns='year', aggfunc=len, fill_value=0)
pivoted = pivoted.loc[months]  # change the order of the rows to be the same as months
for _ in range(20):
    # set some random locations to "not filled in"
    pivoted.iloc[np.random.randint(0, len(pivoted)), np.random.randint(0, len(pivoted.columns))] = np.nan
max_val = np.nanmax(pivoted.to_numpy())
ax = sns.heatmap(pivoted, cmap=plt.get_cmap('Greys', max_val   1), vmin=-0.5, vmax=max_val   0.5)
ax.patch.set_facecolor('white')
ax.patch.set_edgecolor('black')  # will be used for hatching
ax.patch.set_hatch('xxxx')
spines = ax.collections[0].colorbar.ax.spines
for s in spines:
    spines[s].set_visible(True) # show border around colorbar
plt.tight_layout()
plt.show()
 

Я попробовал этот код. Но получаю ошибку

Ошибка при маркировке данных. Ошибка C: Обнаружено переполнение буфера — возможно, неправильно сформированный входной файл

Мои данные хранятся в файле .xlsx, который выглядит следующим образом введите описание изображения здесь

Комментарии:

1. seaborn.pydata.org/generated/seaborn.heatmap.html

2. Привет, спасибо за ваш ответ. Можете ли вы сказать, как данные должны быть сохранены в формате .txt,. xlsx или .doc, чтобы их можно было извлечь в коде.

3. Да, у меня есть мои данные в файле excel.

4. Вам нужно сделать «сохранить как» в виде файла «csv». Тогда ты сможешь это сделать pivoted = pd.read_csv('Your_file.csv') . Поскольку в вашем csv уже есть подсчеты, нет необходимости вызывать df.pivot_table() или изменять порядок столбцов. Обратите внимание, что файл, который вы опубликовали, похоже, не имеет значения между 0 и data gaps .

5. Спасибо вам за ваш ответ. Пробелы в данных, как правило ,относятся к годам, которых нет в файле данных, т. е. 1976, 1977, 1989 и т.д.. Ноль в данных не отражает никакого события в этом месяце за соответствующий год. Поэтому я решил представить его пустым местом, то есть белым цветом.

Ответ №1:

Вы можете использовать sns.heatmap для создания тепловой карты. Вы можете штриховать фон с помощью ax.patch.set_hatch('xx') (больше x s означает более плотный рисунок штриховки). Дополнительные параметры штриховки см. в галерее.

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

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
df = pd.DataFrame({'month': np.random.choice(months, 1000), 'year': np.random.randint(1975, 2019, 1000)})
pivoted = df.pivot_table(index='month', columns='year', aggfunc=len, fill_value=0)
pivoted = pivoted.loc[months]  # change the order of the rows to be the same as months
for _ in range(20):
    # set some random locations to "not filled in"
    pivoted.iloc[np.random.randint(0, len(pivoted)), np.random.randint(0, len(pivoted.columns))] = np.nan
max_val = np.nanmax(pivoted.to_numpy())
ax = sns.heatmap(pivoted, cmap=plt.get_cmap('Greys', max_val   1), vmin=-0.5, vmax=max_val   0.5)
ax.patch.set_facecolor('white')
ax.patch.set_edgecolor('black')  # will be used for hatching
ax.patch.set_hatch('xxxx')
ax.collections[0].colorbar.outline.set_linewidth(1) # make outline visible
plt.tight_layout()
plt.show()
 

sns.тепловая карта с заштрихованным фоном
aPS: Если у вас есть исходные данные, например, в Excel, вы можете сохранить их в виде csv-файла и загрузить с df = pd.read_csv(filename) помощью .

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

Пустые строки для отсутствующих лет могут быть добавлены путем назначения нового индекса.

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

# read the dataframe from a .csv file
pivoted = pd.read_csv('test.csv', index_col=0) # maybe: delimiter=';'
# extend the index to include all intermediate years
pivoted = pd.DataFrame(pivoted, index=range(pivoted.index.min(), pivoted.index.max()   1))
# exchange columns and rows
pivoted = pivoted.T 
max_val = np.nanmax(pivoted.to_numpy())
ax = sns.heatmap(pivoted, cmap=plt.get_cmap('Greys', max_val   1), vmin=-0.5, vmax=max_val   0.5,
                 cbar_kws={'ticks': np.arange(max_val 1)})
ax.patch.set_facecolor('white')
ax.patch.set_edgecolor('black')  # will be used for hatching
ax.patch.set_hatch('xxxx')
ax.collections[0].colorbar.outline.set_linewidth(1) # make outline visible
ax.collections[0].colorbar.outline.set_edgecolor('black')
plt.tight_layout()
plt.show()
 

Комментарии:

1. Большое Вам спасибо.