Как с помощью seaborn можно отобразить значения DataFrame в виде заштрихованной таблицы? (seaborn)

Как с помощью seaborn можно отобразить значения DataFrame в виде заштрихованной таблицы?

Ось х отображает возможные значения из дипазаона DataFrame.values для столбцов c1, c2, c3

Ось y отображает порядковый номер записи по убыванию df.index

Для кажой строки (записи) закрашивается тот квадрат, значения которого заданы в столбцах c1, c2, c3.

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


sns.set()

d = {5:{"c1":1, "c2":7, "c3":10}, 4:{"c1":1, "c2":6, "c3":8}, 3:{"c1":4, "c2":7, "c3":9}}
df = pd.DataFrame(d).T


sns.relplot(data=df.T)
plt.show()

print(df)


   c1  c2  c3
5   1   7  10
4   1   6   8
3   4   7   9

Ожидаемый результат. Нужно чтобы и форматирование таблицы было таким же как и в примере, кроме цветов.

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


Ответы (2 шт):

Автор решения: strawdog

Давно я так не извращался, ну да ладно:

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

sns.set(rc={'figure.facecolor':'white'})

d = {5:{"c1":1, "c2":7, "c3":10}, 4:{"c1":1, "c2":6, "c3":8}, 3:{"c1":4, "c2":7, "c3":9}}

idx = max([max(val.values()) for key, val in d.items()])
cols = [5, 4, 3]
df = pd.DataFrame(index = range(1, idx+1), columns=cols).T.fillna(0)

for k, v in d.items():
    for x in v.keys():
        df.loc[k, v[x]] = 1


sns.heatmap(df, cmap="Blues", cbar=False, square = True, linewidths=1, linecolor="k")
plt.tick_params(labelbottom=False, labeltop=True)
plt.show()

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

UPDATE

Автор вопроса попросил дополнительно закрасить ячейки "для столбцов от 1 до 5 ... бледно зеленым, а от 6 до 10 бледно желтым"

Для этого достаточно в каждую ячейку вложить соответствующее значение и построить heatmap, задав предварительно свою цветовую карту:

my_cmap = ["lightgreen", "darkblue", "lightyellow"]
df[df.iloc[:,5:]==0]=2
sns.heatmap(df, cmap=my_cmap, cbar=False, square = True, linewidths=1, linecolor="k")
plt.tick_params(labelbottom=False, labeltop=True)
plt.show()

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

→ Ссылка
Автор решения: MaxU

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

   1   2   3   4   5   6   7   8   9   10
3   0   0   0   1   0   0   1   0   1   0
4   1   0   0   0   0   1   0   1   0   0
5   1   0   0   0   0   0   1   0   0   1

решение:

r = (df
     .stack()
     .reset_index(name="col")
     .assign(x=1)
     .pivot_table(index="level_0", columns="col", values="x")
     .reindex(range(1,11), axis=1)
     .fillna(0)
     .astype("int8")
     .rename_axis(None)
     .rename_axis(None, axis=1))

результат:

In [204]: r
Out[204]: 
   1   2   3   4   5   6   7   8   9   10
3   0   0   0   1   0   0   1   0   1   0
4   1   0   0   0   0   1   0   1   0   0
5   1   0   0   0   0   0   1   0   0   1

PS @stawdog уже показал как начертить требуемую таблицу.

→ Ссылка