Тепловая карта с сопряженными данными в Python

#python #python-3.x #charts #data-visualization #heatmap

#python #python-3.x #Диаграммы #визуализация данных #тепловая карта

Вопрос:

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

 custom_vals = [[.0, .0], [0,5], [0,10], [0,15], [0,20], [0,25],
               [5,0], [5,5], [5,10], [5,15], [5,20], [5,25],
               [10,0], [10,5], [10,10], [10,15], [10,20], [10,25],
               [15,0], [15,5], [15,10], [15,15], [15,20], [15,25],
               [20,0], [20,5], [20,10], [20,15], [20,20], [20,25], 
               [25,0], [25,5], [25,10], [25,15], [25,20], [25,25]] # ordered pairs (G, H)
custom_predict = (np.around(model.predict(custom_vals), decimals=2))
predicted_vals = pd.DataFrame(data=custom_predict, index = ['0, 0', '0, 5','0, 10', '0, 15', '0, 20', '0, 25',
                                                            '5, 0', '5, 5','5, 10', '5, 15', '5, 20', '5, 25',
                                                            '10, 0', '10, 5','10, 10', '10, 15', '10, 20', '10, 25',
                                                            '15, 0', '15, 5','15, 10', '15, 15', '15, 20', '15, 25',
                                                            '20, 0', '20, 5','20, 10', '20, 15', '20, 20', '20, 25',
                                                            '25, 0', '25, 5','25, 10', '25, 15', '25, 20', '25, 25',], columns=[precip_levels])
predicted_vals 
 

введите описание изображения здесь

На изображении ось y содержит упорядоченные пары ( G , H ). Вероятности представляют вероятность значения x с учетом пары значений y. Например, вероятность x = 0 при заданных g и h = 0 равна 0,87 в таблице выше.

Я хочу иметь возможность превратить это в тепловую карту с цветовой полосой для вероятностей. Моя цель — разделить упорядоченные пары (обозначенные как G и H — см. Комментарий в коде выше) таким образом, чтобы G они находились на оси x и H находились на оси y. Я хочу беспокоиться только об одном значении x за раз. Например, я хочу сделать что-то вроде следующего в тепловой карте.

введите описание изображения здесь

Как я мог бы сделать что-то подобное в Python? Я открыт для любой библиотеки.

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

1. maptlotlib имеет hist2d ( документы ) и plotly имеет heatmap ( документы )

2. Не могли бы вы, пожалуйста, объяснить немного больше о том, как вы переходите от predicted_vals к данным тепловой карты? predicted_vals Соответствует ли вывод из изображения выше?

Ответ №1:

Seaborn это потрясающая библиотека для визуализации данных, а также отличный друг pandas . Я настоятельно рекомендую вам как-нибудь прочитать их документацию.

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

Поскольку у вас есть несколько значений для x в вашем исходном predicted_vals фрейме данных, мы можем захотеть отфильтровать их на основе желаемых значений x (в вашем случае 0)

 desired_val = 5
desired_df = pd.DataFrame()

desired_df[desired_val] = predicted_vals[desired_val]
desired_df[['x', 'y']] = custom_vals
 

Кроме того, мы создаем два столбца x и y , которые будут координатами, предоставленными custom_vals . Это будет выглядеть так:

          0    x     y
0,0   0.84  0.0   0.0
0,5   0.06  0.0   5.0
0,10  0.95  0.0  10.0
0,15  0.70  0.0  15.0
0,20  0.19  0.0  20.0
 

Далее нам нужно, чтобы это выглядело как реальная тепловая карта, заданная фреймом данных, где index соответствуют y значениям, а значения columuns x значениям. Это достигается с помощью pivot_table

 my_heatmap = desired_df.pivot_table(index='x', columns='y', values=desired_val)
 

Что дает нам фрейм данных, подобный этому:

 x     0.0   5.0   10.0  15.0  20.0  25.0
y                                       
0.0   0.84  0.73  0.37  0.75  0.55  0.67
5.0   0.06  0.58  0.69  0.86  0.76  0.54
10.0  0.95  0.02  0.59  0.30  0.79  0.36
15.0  0.70  0.10  0.19  0.92  0.04  0.24
20.0  0.19  0.77  0.74  0.12  0.14  0.87
25.0  0.48  0.34  0.99  0.80  0.56  0.43
 

И, наконец, мы можем построить тепловую карту. Нам нужны seaborn и matplotlib.pyplot для визуализации.

 import seaborn as sns
import matplotlib.pyplot as plt

sns.heatmap(my_heatmap, cmap='plasma')
plt.show()
 

Вы можете выбрать другие цветовые карты, изменив аргумент ключевого cmap слова на одно из многих имен цветовых карт matplotlib (вы можете проверить их здесь).

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

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

1. Я добираюсь TypeError: only integer scalar arrays can be converted to a scalar index до этой строки desired_df[desired_val] = predicted_vals[desired_val] , вы знаете, как это исправить?

2. Как вы создаете переменную precip_levels ? Я создал фрейм данных, используя свои собственные данные, вероятно, ваши данные совсем другие

3. Вот как я ее создал: precip_levels = np.sort(pd.unique(df['Categorical_Y_Variable'])) print(precip_levels) #outputs [0. 5. 10. 15. 20. 25.] — спасибо!

4. О, я думаю, я понял, в чем проблема. При создании вашего фрейма данных попробуйте изменить аргумент ключевого слова с columns=[precip_levels] на на columns=precip_levels (без квадратных скобок).

Ответ №2:

Я бы рекомендовал использовать seaborn :

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

# Create dummy data
data = np.array(np.random.rand(5, 5))

fig,ax = plt.subplots()
fig.set_figheight(7)
fig.set_figwidth(7)

sns.heatmap(data, annot = True)

plt.show()
 

введите описание изображения здесь