为什么我的 Seaborn 热图中的值从 int 转换为 float?

问题描述 投票:0回答:1

我创建了一个“总计”列和一个“总计”行。它按预期工作,将总数显示为整数,直到我试图让 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,
        }
    )

Resulting table

表格内的空白单元格(没有值)正是我想要实现的。总列和行应该看起来像这样,这就是掩码的用途,但为了简单起见,我没有包含该代码。

为了尝试修复浮点值,我尝试对该列和行进行类型转换,但什么也没发生:

df['Total'] = df['Total'].astype(np.int64)
df.loc[f'Total'] = df.loc[f'Weekly Total'].astype(np.int64)
python pandas seaborn heatmap
1个回答
0
投票

使用

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 将匹配位置,而不是索引。

© www.soinside.com 2019 - 2024. All rights reserved.