使用Pandas数据帧中的值注释热图

 mobiledu2502930213 发布于 2023-02-04 19:28

我想用一个数据帧传递给下面函数的值来注释热图.我查看了matplotlib.text但是无法在我的热图中以所需的方式从我的数据框中获取值.我已经粘贴了我的函数,用于生成下面的热图,之后是我的数据帧和热图调用的输出.我想从热图中每个单元格中心的数据框中绘制每个值.

生成热图的功能:

import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

def heatmap_binary(df,
            edgecolors='w',
            #cmap=mpl.cm.RdYlGn,
            log=False):    
    width = len(df.columns)/7*10
    height = len(df.index)/7*10

    fig, ax = plt.subplots(figsize=(20,10))#(figsize=(width,height))

    cmap, norm = mcolors.from_levels_and_colors([0, 0.05, 1],['Teal', 'MidnightBlue'] ) # ['MidnightBlue', Teal]['Darkgreen', 'Darkred']

    heatmap = ax.pcolor(df ,
                        edgecolors=edgecolors,  # put white lines between squares in heatmap
                        cmap=cmap,
                        norm=norm)


    ax.autoscale(tight=True)  # get rid of whitespace in margins of heatmap
    ax.set_aspect('equal')  # ensure heatmap cells are square
    ax.xaxis.set_ticks_position('top')  # put column labels at the top
    ax.tick_params(bottom='off', top='off', left='off', right='off')  # turn off ticks

    plt.yticks(np.arange(len(df.index)) + 0.5, df.index, size=20)
    plt.xticks(np.arange(len(df.columns)) + 0.5, df.columns, rotation=90, size= 15)

    # ugliness from http://matplotlib.org/users/tight_layout_guide.html
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", "3%", pad="1%")
    plt.colorbar(heatmap, cax=cax)


plt.show()

Herre是My dataframe的一个例子:

dataframe :

             0-5 km / h  5-40 km / h  40-80 km / h  80-120 km / h  \
NORDIC         0.113955     0.191888      0.017485      -0.277528   
MIDDLE  EU     0.117903     0.197084     -0.001447      -0.332677   
KOREA          0.314008     0.236503     -0.067174      -0.396518   
CHINA          0.314008     0.236503     -0.067174      -0.396518   

             120-160 km / h  160-190 km / h  190 km / h  
NORDIC            -0.054365        0.006107    0.002458  
MIDDLE  EU         0.002441        0.012097    0.004599  
KOREA             -0.087191        0.000331    0.000040  
CHINA             -0.087191        0.000331    0.000040  

生成热图:

heatmap_binary(dataframe)

在此输入图像描述

有任何想法吗?


更新以澄清我的问题

我尝试了问题的建议解决方案,其中包含我正在寻找的结果: 如何在matplotlib中使用文本注释热图? 但是,我仍然有一个问题,使用matplotlib.text函数来定位热图中的值:这是我尝试此解决方案的鳕鱼:

import matplotlib.pyplot as plt
import numpy as np


data = dataframe.values
heatmap_binary(dataframe)

for y in range(data.shape[0]):
    for x in range(data.shape[1]):
        plt.text(data[y,x] +0.05 , data[y,x] + 0.05, '%.4f' % data[y, x], #data[y,x] +0.05 , data[y,x] + 0.05
                 horizontalalignment='center',
                 verticalalignment='center',
                 color='w')

#plt.colorbar(heatmap)

plt.show()

添加情节:(不同颜色,但相同的问题) 在此输入图像描述

2 个回答
  • 此功能由seaborn包提供.它可以生成像这样的地图

    示例注释热图

    seaborn的一个例子是

    import seaborn as sns
    sns.set()
    
    # Load the example flights dataset and conver to long-form
    flights_long = sns.load_dataset("flights")
    flights = flights_long.pivot("month", "year", "passengers")
    
    # Draw a heatmap with the numeric values in each cell
    sns.heatmap(flights, annot=True, fmt="d", linewidths=.5)
    

    2023-02-04 19:29 回答
  • 您在for循环中用于坐标的值被搞砸了.你也使用的是plt.colorbar代替更清洁的东西fig.colorbar.试试这个(它完成了工作,没有努力以其他方式清理代码):

    def heatmap_binary(df,
                edgecolors='w',
                #cmap=mpl.cm.RdYlGn,
                log=False):    
        width = len(df.columns)/7*10
        height = len(df.index)/7*10
    
        fig, ax = plt.subplots(figsize=(20,10))#(figsize=(width,height))
    
        cmap, norm = mcolors.from_levels_and_colors([0, 0.05, 1],['Teal', 'MidnightBlue'] ) # ['MidnightBlue', Teal]['Darkgreen', 'Darkred']
    
        heatmap = ax.pcolor(df ,
                            edgecolors=edgecolors,  # put white lines between squares in heatmap
                            cmap=cmap,
                            norm=norm)
        data = df.values
        for y in range(data.shape[0]):
            for x in range(data.shape[1]):
                plt.text(x + 0.5 , y + 0.5, '%.4f' % data[y, x], #data[y,x] +0.05 , data[y,x] + 0.05
                     horizontalalignment='center',
                     verticalalignment='center',
                     color='w')
    
    
        ax.autoscale(tight=True)  # get rid of whitespace in margins of heatmap
        ax.set_aspect('equal')  # ensure heatmap cells are square
        ax.xaxis.set_ticks_position('top')  # put column labels at the top
        ax.tick_params(bottom='off', top='off', left='off', right='off')  # turn off ticks
    
        ax.set_yticks(np.arange(len(df.index)) + 0.5)
        ax.set_yticklabels(df.index, size=20)
        ax.set_xticks(np.arange(len(df.columns)) + 0.5)
        ax.set_xticklabels(df.columns, rotation=90, size= 15)
    
        # ugliness from http://matplotlib.org/users/tight_layout_guide.html
        from mpl_toolkits.axes_grid1 import make_axes_locatable
        divider = make_axes_locatable(ax)
        cax = divider.append_axes("right", "3%", pad="1%")
        fig.colorbar(heatmap, cax=cax)
    

    然后

    df1 = pd.DataFrame(np.random.choice([0, 0.75], size=(4,5)), columns=list('ABCDE'), index=list('WXYZ'))
    heatmap_binary(df1)
    

    得到:

    答案

    2023-02-04 19:29 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有