#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
(без квадратных скобок).