Тепловая карта или другой параметр гистограммы с двумя переменными?

#python #pandas #seaborn

#python #панды #сиборн

Вопрос:

У меня есть фрейм данных с двумя столбцами, первый может иметь целое число от 0-15, другой может иметь целое число от 0-10.

В df примерно 10 000 строк.

Я хочу построить какую-то сетку (15×10), которая может визуально представлять, сколько экземпляров каждой комбинации у меня есть во всем фрейме данных, в идеале отображая фактическое число в каждой ячейке сетки.

Я пробовал как Seaborn, так и Matplotlib.

В Seaborn я попробовал jointplot , который почти сделал это, но я не могу заставить его отображать фактическую сетку 15×10. Я также попробовал heatmap , но он выдал мне ошибку (см. Ниже), и я ничего не смог найти на нем.

Я также попытался построить какую-то 3D-гистограмму.

Наконец, я попытался повернуть данные, но Pandas вычисляет числа как значения, а не рассматривает их как «сегменты».

Не уверен, куда идти дальше.

 *heatmap error: "ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''"
 
 sns.heatmap(x='pressure_bucket', y='rate_bucket', data=df)
 

Ближе всего к тому, что я хочу, это что-то вроде этого, в идеале с фактическими числами в каждой ячейке

https://imgur.com/a/d4qWIod

Заранее спасибо всем!

Ответ №1:

Мы можем использовать plt.imshow для отображения тепловой карты,

 # get the counts in form of a dataframe indexed by (c1,c2)
counts = df.groupby(['c1'])['c2'].value_counts().rename('value').reset_index()

# pivot to c1 as index, c2 as columns
counts = counts.pivot(index='c1', columns='c2', values='value')

# after reading your question carefully, there's another step
# fill all missing value in c1
counts.reindex(range(16))

# fill all missing value in c2
counts = counts.reindex(range(10), axis=1)

# fill all missing values with 0
counts = counts.fillna(0)

# imshow
plt.figure(figsize=(15,10))
plt.imshow(counts, cmap='hot')
plt.grid(False)
plt.show()

# sns would give a color bar legend
plt.figure(figsize=(15,10))
sns.heatmap(counts, cmap='hot')
plt.show()
 

Вывод (случайные записи)

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

Вывод sns:

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

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

1. Эй, Куанг, прежде всего, спасибо за ваш ответ, я чувствую, что я намного ближе, чем был! Однако я все еще борюсь с этим графиком, когда я показываю «count», он показывает все 0, и когда я показываю графики, они сильно отличаются от ваших. Пожалуйста, проверьте это изображение с некоторыми скриншотами того, где я нахожусь, еще раз спасибо! imgur.com/a/jcpp3BU

2. Похоже, вы этого не сделали counts = counts.pivot(index='c1', columns='c2', values='value') . Но все же это кажется неправильным. можете ли вы распечатать заголовок: df[['pressure_bucket', 'rate_bucket']].head(20) и посмотреть, соответствуют ли значения вашим ожиданиям?

3. Да, начало и конец фрейма данных показывают разумные данные в пределах диапазона, который я ожидал. Все еще не уверен, почему тепловая карта не отображается. Еще раз спасибо imgur.com/a/i7JBEDF

4. @adrian Я просто перепроверяю, вы забыли вторую строку ответа. Я отбросил эту строку и получил те же изображения, что и вы.

5. Ты абсолютно прав, Куанг, совершенно забыл об этом, теперь работает как шарм, спасибо! imgur.com/a/bNuBEiT