Исключить столбец из формата Seaborn Heatmap, но сохранить на карте - PullRequest
0 голосов
/ 04 декабря 2018

Итак, моя таблица выглядит примерно так:

Cl1  Cl2  Cl3  Sum
0.7  0.9  0.9  2.5
0.8  1.5  0.9  3.2
2.4  2.8  2.1  7.3

Я хочу, чтобы цвет тепловой карты применялся к столбцам 1-3, но не к Sum, потому что он берет весь сок из тепловой карты и делаетколонны выглядят мягкими.

Все, что я придумал сейчас, - это деление значения суммы на 100, но это запутает читателей и потребует объяснений.

Есть ли способ не форматировать столбец суммы, но сохранитьего значения как есть?

Некоторый код для начала работы:

import numpy as np
import pandas as pd
import seaborn as sns

df = pd.DataFrame(np.random.rand(3,3), columns='Cl1 Cl2 Cl3'.split())

df['Sum'] = 0
for i in df.index:
    df['Sum'].iloc[i] = np.sum(df.iloc[i])

sns.heatmap(df, annot=True, cmap='Reds')

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

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

mask = np.zeros((3, 4))
mask[:,3] = True
ax = sns.heatmap(df, mask=mask, annot=True,
             vmin=df.values[:,:3].ravel().min(),
             vmax=df.values[:,:3].ravel().max(),
             annot_kws={"size": 20, "color":"g"})


for (j,i), label in np.ndenumerate(df.values):
    if i == 3:
        ax.text(i+0.5, j+0.5, label, 
                fontdict=dict(ha='center',  va='center',
                                         color='g', fontsize=20))

enter image description here


Альтернативное предложение по замене цикла:

mask = np.zeros((3, 4))
mask[:,3] = True
sns.heatmap(df, mask=mask)
sns.heatmap(df, alpha=0, cbar=False, annot=True, annot_kws={"size": 20, "color":"g"})

приводит к тому же результату

0 голосов
/ 04 декабря 2018

Если ваша цель - просто увидеть, как это выглядит в ноутбуке, вы можете обойтись с помощью стиля панд:

import pandas as pd
import seaborn as sns
import io

df = pd.read_fwf(io.StringIO("""Cl1  Cl2  Cl3  Sum
0.7  0.9  0.9  2.5
0.8  1.5  0.9  3.2
2.4  2.8  2.1  7.3"""))


cm = sns.light_palette("green", as_cmap=True)

df.style.background_gradient(subset=['Cl1', 'Cl2', 'Cl3'], 
                             low=0, high=3, cmap=cm)

Результат:

Styled dataframe

...