Раскрашивание значения кадра данных pandas по его диагонали

У меня есть кадр данных pandas, который используется для раскраски тепловой карты. Я хочу раскрасить значение по диагоналям фрейма данных. Если диагональ содержит пять значений в виде [-1,2,0,-2,5], я хочу раскрасить их как 0 в «белом», затем 2 в светло-красном, 5 в самом темном красном, а затем -1 в светло-синий, -2 для самого темного синего (просто для того, чтобы указать интенсивность между значениями, где более темный красный соответствует положительному значению, а более темный синий соответствует отрицательному значению). Пример кода ниже:

import pandas as pd
import seaborn as sns
list1 = [[10],[5,-2],[-1,2,-3],[4,-5,3,-2]]
dfff = pd.DataFrame(l1)
print (dfff)
sns.heatmap(dfff,square=True, linewidths=.5, cbar_kws={"shrink": .5})

Я хочу, чтобы диагонали были цветными, например, в первом случае первая диагональ будет [10,-2,-3,-2]. Я хочу, чтобы они были окрашены как 10 с самым темным красным, 2-,-3,-2 в оттенках синего в зависимости от их интенсивности.

Любая помощь приветствуется. Спасибо.


person Dip    schedule 12.09.2020    source источник


Ответы (2)


Вы можете получить доступ к диагоналям, сказав

for i, row in enumerate(list1):
    row[i] == *whatever*

Не уверен, что вы хотите установить их, хотя

person mazore    schedule 12.09.2020

import pandas as pd
import numpy as np
import seaborn as sns
l1 = [[10],[5,-2],[-1,2,-3],[4,-5,3,-2]]
dfff = pd.DataFrame(l1)

for x, c in zip(range(1,dfff.shape[0]+1), ['Blues','Reds','Purples','Oranges']):
    sns.heatmap(dfff.mask(dfff.notna().cumsum().gt(x), np.nan), square=True, linewidths=.5, cmap=c,  mask=dfff.mask(~dfff.notna().cumsum().gt(x-1), np.nan).isna())

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

person Chris    schedule 12.09.2020
comment
Привет Крис, Спасибо за ваш ответ. Но требование было немного другим, мне нужно, чтобы положительные значения были в оттенках красного, а отрицательные значения были в оттенках синего. Например, здесь для первой диагонали 10 будет самым темным красным цветом, а затем 2-, -3, -2 будут оттенками синего в зависимости от их интенсивности. - person Dip; 13.09.2020
comment
Так что просто измените цветовую карту на расходящуюся красно-синюю. - person Chris; 13.09.2020