【发布时间】:2020-05-07 18:17:57
【问题描述】:
我只想在 seaborn 热图图例中包含某些值。具体来说,我有一个我不想在图例中看到的“nan”类别。
我正在尝试将医院患者的病房移动绘制为一种分类热图,不同的颜色代表不同的病房。我借用了这段代码heatmap-like plot, but for categorical variables in seaborn 来为热图配置我的输入表。空白单元格表示患者在这些日期不在医院。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import pandas as pd
data = {'12/3': [np.nan, 'Ward_B', np.nan],
'13/3': [np.nan, 'Ward_B', np.nan],
'14/3': [np.nan, 'Ward_B', 'ED'],
'15/3': ['ED', 'Ward_A', 'Ward_C'],
'16/3': ['ED', 'Ward_A', 'Ward_C'],
'17/3': ['Ward_A', 'Ward_A', 'Ward_C'],
'18/3': ['Ward_A', np.nan, 'Ward_C'],
'19/3': ['Ward_A', np.nan, 'Ward_A'],
'20/3': [np.nan, np.nan, 'Ward_A']}
df = pd.DataFrame (data, columns = ['12/3',
'13/3',
'14/3',
'15/3',
'16/3',
'17/3',
'18/3',
'19/3',
'20/3'])
# Create dataframe of patient IDs
patient_codes_df = pd.DataFrame(['Patient_A', 'Patient_B', 'Patient_C'])
# change heading
patient_codes_df = patient_codes_df.rename(columns={0:'Patient'})
# Merge
df2 = pd.concat([patient_codes_df, df], axis=1)
# Make Patient column the index
df3 = df2.set_index('Patient')
df3
df3 是我的输入数据的样子。
这就是我绘制热图的方式
value_to_int = {j:i for i,j in enumerate(pd.unique(df3.values.ravel()))}
n = len(value_to_int)
cmap = sns.color_palette("Accent", n) # set colours
fig, ax = plt.subplots(1, 1, figsize = (6, 2), dpi=300)
mask = df3.isnull()
ax = sns.heatmap(df3.replace(value_to_int), cmap=cmap, mask=mask, linewidths=0.1, linecolor='#b5b5b5')
ax.set_ylabel('')
# modify colorbar:
colorbar = ax.collections[0].colorbar
r = colorbar.vmax - colorbar.vmin
colorbar.set_ticks([colorbar.vmin + r / n * (0.5 + i) for i in range(n)])
colorbar.set_ticklabels(list(value_to_int.keys()))
plt.xticks(rotation=90)
plt.show()
我想去掉传说中的“nan”,并重新排序,使其按照 ED、Ward_A、Ward_B、Ward_C 的合理顺序排列。
感谢您的帮助。
【问题讨论】:
标签: python matplotlib seaborn heatmap