Как с помощью 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 шт):
Давно я так не извращался, ну да ладно:
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()
Мне стало интересно смогу ли я написать однострочник, преобразующий приведенный в вопросе 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 уже показал как начертить требуемую таблицу.


