Как отобразить несколько аннотаций в ячейках Seaborn Heatmap? - PullRequest
1 голос
/ 11 марта 2019

Я хочу, чтобы тепловая карта Seaborn отображала несколько значений в каждой ячейке тепловой карты.Вот ручной пример того, что я хочу увидеть, просто для ясности:

data = np.array([[0.000000,0.000000],[-0.231049,0.000000],[-0.231049,0.000000]])
labels =  np.array([['A\nExtra Stuff','B'],['C','D'],['E','F']])
fig, ax = plt.subplots()
ax = sns.heatmap(data, annot = labels, fmt = '')

enter image description here

Вот как пример, чтобы получить seaborn.heatдля отображения flightsRoundUp значений в ячейках.

import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

def RoundUp(x):
    return int(np.ceil(x/10)*10)

# Load the example flights dataset and conver to long-form
flights_long = sns.load_dataset("flights")
flights = flights_long.pivot("month", "year", "passengers")
flightsRoundUp =  flights.applymap(RoundUp)

# Draw a heatmap with the numeric values in each cell
f, ax = plt.subplots(figsize=(9, 6))
sns.heatmap(flights, annot=flightsRoundUp, fmt="", linewidths=.5, ax=ax)

Как лучше всего отобразить flightsRoundUp и flights во всех ячейках?Что-то вроде первого приведенного выше ручного примера, но для всех ячеек векторизованным способом ...

1 Ответ

0 голосов
/ 12 марта 2019

У меня тоже работает следующее:

X = pd.DataFrame({'a':[1, 2, np.nan], 'b':[10, 20, 30]})
Y = pd.DataFrame({'A':[11, 222, np.nan], 'B':[110, np.nan, 330]})

# convert to string
X_value_ann = (X).astype('|S5').reset_index()
Y_value_ann = (Y).astype('|S5').reset_index()

# define () and new line to glue on later
br = np.char.array(pd.DataFrame('\n(', index=X_value_ann.index, columns=X_value_ann.columns))
cl = np.char.array(pd.DataFrame(')', index=X_value_ann.index, columns=X_value_ann.columns))

# convert to chararray
X_value_ann = np.char.array(X_value_ann)
Y_value_ann = np.char.array(Y_value_ann)

# glue and reshape
my_annotation = pd.DataFrame(X_value_ann+br+Y_value_ann+cl)
my_annotation = my_annotation.applymap(lambda x: x.decode('utf-8')) 
my_annotation = my_annotation.drop(columns=[0])
my_annotation
...