首页 > 解决方案 > 如何用不同的数据填充热图的方块来确定方块的“热度”?

问题描述

鉴于下面的热图,我将如何将构成正方形“热”的数据点的计数作为文本添加到每个正方形?

df = pd.DataFrame(
    {
        'pred_1_bin': {79: 0.1, 78: 0.1, 77: 0.1, 76: 0.2, 75: 0.2, 74: 0.2, 73: 0.3, 72: 0.3, 71: 0.3},
        'pred_2_bin': {79: 0.1, 78: 0.2, 77: 0.3, 76: 0.1, 75: 0.2, 74: 0.3, 73: 0.1, 72: 0.2, 71: 0.3},
        'investment': {79: 1.0, 78: 1.0, 77: 1.0, 76: 1.0, 75: 1.0, 74: 1.0, 73: 1.0, 72: 1.0, 71: 1.0},
        'profit_loss': {79: -1.0, 78: -0.2, 77: 2.0, 76: 0.5, 75: 0.7, 74: -1.0, 73: 1.4, 72: 0.6, 71: 0.0},
    }
)
agg_dict = {"investment": "sum", "profit_loss": "sum"}
df = df.groupby(["pred_1_bin", "pred_2_bin"]).agg(agg_dict)
df["roi"] = df["profit_loss"] / df["investment"]
df.reset_index(inplace=True)
df = pd.pivot_table(df, values='roi', index=['pred_1_bin'], columns=['pred_2_bin'], aggfunc=np.mean, fill_value=0)
ax = sns.heatmap(df, cmap="Blues")
ax.invert_yaxis()
plt.show()

我知道我可以通过使用来显示正方形的热值,annot=True但我正在寻找数据点的计数。

标签: pythonpandasseaborn

解决方案


尝试提取roicountwhen groupby。然后您可以手动将计数插入到图中:

agg_dict = {"investment": ('investment', "sum"), 
            "profit_loss": ('profit_loss',"sum"),
            "count" : ("investment", 'count')}
df = df.groupby(["pred_1_bin", "pred_2_bin"]).agg(**agg_dict)
df["roi"] = df["profit_loss"] / df["investment"]

# roi and count
roi_data = df['roi'].unstack()
count_data = df['count'].unstack()

# plot
ax = sns.heatmap(roi_data, cmap="Blues")

# annotate
for i, x in enumerate(ax.get_xticks()):
    for j,y in enumerate(ax.get_yticks()):
        val = count_data.iloc[j,i]
        ax.text(x,y, f"{val}")

输出:

在此处输入图像描述


推荐阅读