我创建了一个“总计”列和一个“总计”行。它按预期工作,将总数显示为整数,直到我试图让 Seaborn 不包含值为 0 的单元格(在整个表中,不仅在该列和行中),然后总列和行更改为浮动(带有尾随 .0),我不知道如何修复它。
df = pd.DataFrame(
values,
index=index,
columns=columns
)
df['Total'] = df.sum(axis=1, numeric_only=True)
df.loc[f'Total'] = df.sum(numeric_only=True)
df[df == 0] = np.nan
# This mask is, as far as I know, unrelated to what I'm discussing here
mask = np.zeros_like(df, dtype=bool)
mask[:, -1] = True
mask[0, :] = True
sns.heatmap(
data=df,
vmin=0,
vmax=values.max(),
annot=True,
fmt='g',
cmap=colormap,
linewidths=0.5,
linecolor='black',
mask=mask,
annot_kws={
'size': 10,
}
)
表格内的空白单元格(没有值)正是我想要实现的。总列和行应该看起来像这样,这就是掩码的用途,但为了简单起见,我没有包含该代码。
为了尝试修复浮点值,我尝试对该列和行进行类型转换,但什么也没发生:
df['Total'] = df['Total'].astype(np.int64)
df.loc[f'Total'] = df.loc[f'Weekly Total'].astype(np.int64)
使用
annot
字段将格式化功能应用于每个单元格似乎是一种选择。
def format_func(val):
if pd.isna(val):
return ''
elif isinstance(val, (int, np.integer)):
return f'{val}'
elif isinstance(val, (float, np.floating)) and val.is_integer():
return f'{int(val)}'
else:
return val
sns.heatmap(
data=df,
vmin=0,
vmax=values.max(),
annot=df.applymap(format_func),
fmt='',
cmap='coolwarm',
linewidths=0.5,
linecolor='black',
mask=df.isna(),
annot_kws={'size': 10}
)
annot
参数有奇怪的语义(docs),所以很容易错过这个选项。
如果为 True,则在每个单元格中写入数据值。如果是与数据具有相同形状的类似数组,则使用它来注释热图而不是数据。请注意,DataFrame 将匹配位置,而不是索引。