Annotate heatmap with value from Pandas dataframe

前端 未结 4 1045
野的像风
野的像风 2021-02-04 20:59

I would like to annotate a heatmap with the values that I pass from a dataframe into the function below. I have looked at matplotlib.text but have not been able to get the value

4条回答
  •  长情又很酷
    2021-02-04 21:31

    The values you were using for your coordinates in your for loop were screwed up. Also you were using plt.colorbar instead of something cleaner like fig.colorbar. Try this (it gets the job done, with no effort made to otherwise cleanup the code):

    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)
    

    Then

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

    gives:

    The Answer

提交回复
热议问题