在pandas数据帧上以列方式应用seaborn heatmap

时间:2017-05-17 06:31:12

标签: python dataframe heatmap seaborn

我试图在旋转的pandas数据框架上使用热像图形式seaborn,就像在超链接中工作一样

df = pd.DataFrame(np.random.randint(1,100,size = (3,2)))
df.columns = ['A','B']
df
sns.heatmap(df, annot=True, fmt="d", linewidths=.5,cmap="RdYlGn")

Output of code block - Entire Dataframe formatted as single heatmap 输出选择45作为min,86作为最大值,颜色代码整个数据帧

但我无法做的是明智地应用热图列 即像条件格式应用列colummn而不是整个数据帧。就像在这个超链接的例子中一样 -

Output required/expected

对于col1,最小值45和最大值88被挑选并格式化为col2 70&分别挑选86个 条件格式化列,但仍显示为表格。 。在示例中,我看到df的其余部分被设为零,并且只有1列被格式化或整个数据帧得到格式化

请有人帮忙吗

2 个答案:

答案 0 :(得分:2)

感谢@ Implus3H那个例子有帮助 以下是代码的修改版本作为函数,可以执行列式条件格式,以防万一它对其他人有用

df是一个输入数据帧,默认情况下,在下面的示例函数中,其列将采用颜色编码的红色阴影

def columnwise_conditionalformat(df, color = 'Reds'):
    nrows = len(df)
    ncols = len(df.columns)
    fig, ax = plt.subplots()
    for i in range(ncols):
        truthar = [True]*ncols
        truthar[i] = False
        mask = truthar = np.array(nrows * [truthar], dtype=bool)
        red = np.ma.masked_where(mask, df)
        ax.pcolormesh(red, cmap=color)

    for y in range(df.shape[0]):
        for x in range(df.shape[1]):
            plt.text(x+.5,y+.5,'%.1f'% df.ix[y, x],
                    horizontalalignment='center',
                     verticalalignment='center'
                    )
    plt.show()

答案 1 :(得分:1)

您还可以将每列的比例缩放为最小值为零,最大值为1,将其传递到热图,并使用原始值进行注释。

scaled_df = (df - df.min(axis=0))/(df.max(axis=0) - df.min(axis=0))
sns.heatmap(scaled_df, annot=df, fmt="d", linewidths=.5, cmap="RdYlGn")

请注意,您可能需要使用cbar=False删除颜色栏,因为解决方案的每一列必然需要不同的比例。

或者,可以使用sklearn.preprocessing.minmax_scale代替手动缩放。

from sklearn.preprocessing import minmax_scale

scaled_df = minmax_scale(df)
sns.heatmap(scaled_df, annot=df, fmt="d", linewidths=.5, cmap="RdYlGn")