如何在 seaborn 热图中添加美元符号

How to add a dollar sign to a seaborn heatmap

我有以下代码在 Pandas 中生成热图:

def create_cohort(cohort_size,retention_matrix,titulo):
    print(f"{titulo}\n")

    with sns.axes_style("white"):
        fig, ax = plt.subplots(1, 2, figsize=(12, 8), sharey=True, gridspec_kw={'width_ratios': [1, 11]})
        
        # retention matrix
        sns.heatmap(retention_matrix, 
                    mask=retention_matrix.isnull(), 
                    annot=True, 
                    fmt='.0%', 
                    cmap='Purples', 
                    ax=ax[1])
        ax[1].set_title(f'Cohort: {titulo}', fontsize=16)
        ax[1].set(xlabel='Meses',
                  ylabel='')

        # cohort size
        cohort_size_df = pd.DataFrame(cohort_size).rename(columns={0: 'Tamanho da cohort'})
        white_cmap = mcolors.ListedColormap(['white'])
        sns.heatmap(cohort_size_df, 
                    annot=True, 
                    cbar=False, 
                    fmt='.0f', 
                    cmap=white_cmap, 
                    ax=ax[0])

        fig.tight_layout()
        
        return

这是一个图表示例:

我想把最左边的格式改一下table在数字前加上'$'。我知道我必须更改 fmt='.0f',但我不知道如何更改。我也找不到有关我可以在 fmt 参数中传递的值的文档。有人也可以向我解释这是如何工作的吗?我可以使用哪些值?

除了设置 annot=True,还可以提供与数据框形状相同的字符串列表:

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.ticker import PercentFormatter
import seaborn as sns
import pandas as pd

N = 12
cohort_size = pd.DataFrame({0: np.random.randint(20000, 50000, N)}, index=[f'2021:{i:02d}' for i in range(1, 13)])
retention_matrix = np.random.rand(N, N)
retention_matrix[:, 0] = 1
retention_matrix = np.where(np.tril(retention_matrix)[::-1], retention_matrix, np.NaN)

with sns.axes_style("white"):
    fig, ax = plt.subplots(1, 2, figsize=(12, 8), sharey=True, gridspec_kw={'width_ratios': [1, 11]})

    sns.heatmap(retention_matrix,
                annot=True,
                fmt='.0%',
                cmap='Purples',
                cbar_kws={'format': PercentFormatter(1)},
                ax=ax[1])
    ax[1].set(xlabel='Meses', ylabel='')

    cohort_size_df = pd.DataFrame(cohort_size).rename(columns={0: 'Tamanho da cohort'})
    labels = [[f'$ {s:,d}'] for s in cohort_size_df.iloc[:, 0]]
    sns.heatmap(cohort_size_df,
                annot=labels,
                cbar=False,
                fmt='',
                cmap=ListedColormap(['white']),
                ax=ax[0])
    ax[0].tick_params(axis='y', labelrotation=0)
    fig.tight_layout()
plt.show()