Home > Enterprise >  How to insert a small square mark somewhere on a generated heatmap plot
How to insert a small square mark somewhere on a generated heatmap plot

Time:06-23

I am creating a 2D matplotlib plot (i and j coordinates) which contains 10 subplots. Each subplot contains 150 by 150 grid cell data. How can I insert a small black-colored square mark (3 by 3 ) somewhere fixed (center at coordinates 62 and 62 ) on each generated heatmap sub-plot across those 10 sub-plots? The square mark would therefore contain 10 blocks from 60 to 64 in both x and y direction and contains a written text "Sale 1" centered at x 62 and y 62. My code below does not generate any patches. Any feedback is greatly appreciated.

    from matplotlib.patches import Rectangle
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.metrics import r2_score, median_absolute_error
    import os
    import matplotlib.cm as cm
    from mpl_toolkits import axes_grid1
    import matplotlib.pyplot as plt
    #import seaborn as sns
    import matplotlib.pyplot as plt
    import matplotlib.colors as mcolors
    import matplotlib.colors
    import matplotlib.colors as colors
    
    
    data = np.random.rand(10, 150, 150)
    data = data.reshape(-1, 1)
    
    
    property = "Sale"
    
       
    pmin = data.min()
    pmax = data.max()
    
    v = np.linspace(round(pmin,3), round(pmax,3),15, endpoint=True)
    v = [round(x,3) for x in v] 
    
    fig, ax = plt.subplots(2, 5, figsize=(160, 80))
    row_count = 0
    col_count = 0
    for i in range(10):
    
        sub_plot_data = data[(i)*(150*150):(i 1)*150*150]
        
       
        x = 150
        y = 150
        #--------------------------- Define the map boundary ---------------------- 
        xmin = 1258096.6
        xmax = 1291155.0
        ymin = 11251941.6
        ymax = 11285000.0
        
        pmin = min(sub_plot_data)
        pmax = max(sub_plot_data) 
    
        
        # ---------------------------  define color bar for Discrete  color 
        bounds = np.linspace(-1, 1, 10)
        Discrete_colors = plt.get_cmap('jet')(np.linspace(0,1,len(bounds) 1))
        # create colormap without the outmost colors
        cmap = mcolors.ListedColormap(Discrete_colors[1:-1]) # 


        actual_2d = np.reshape(sub_plot_data,(y,x)) 
        
        im1 = ax[row_count, col_count].imshow(actual_2d, interpolation=None, cmap=cmap, 
        extent=(xmin, xmax, ymin, ymax), vmin=pmin, vmax=pmax)      
        plt.text(actual_2d[62, 62], actual_2d[62, 62], '%s' % 'Sale_1', 
        horizontalalignment='center', verticalalignment='center', color= 'black', fontsize= 90)
    
        
        ax[row_count, col_count].set_title("Sale_Stores-%s - L: %s"%(i 1, layer), 
        fontsize=130, pad=44, x=0.5, y=0.999) # new
    
        ax[row_count, col_count].set_aspect('auto')
        ax[row_count, col_count].tick_params(left=False, labelleft=False, top=False, 
        labeltop=False, right=False, labelright=False, bottom=False, labelbottom=False) # new
        #ax[row_count, col_count] = plt.gca()
        plt.gca().add_patch(Rectangle((60, 60), 3, 3, edgecolor='black', 
        facecolor='black',fill=True,lw=2))
        ax[row_count, col_count].add_patch(plt.text(62, 62, '%s' % 'Sale_1', 
       horizontalalignment='center', verticalalignment='center', color= 'black', fontsize= 90))
    
        col_count  =1
        
        if col_count == 5:
            row_count  =1  
            col_count =0
    
           
       
    fig.tight_layout(h_pad=10) 
    plt.subplots_adjust(left=0.02,
                    bottom=0.1, 
                    right=0.91, 
                    top=0.8, 
                    wspace=0.1, 
                    hspace=0.2)
    
      
    cbaxes = fig.add_axes([0.94, 0.05, 0.02, 0.8]) 
    cbar = fig.colorbar(im1, ax=ax.ravel().tolist(), ticks=v, extend='both', cax =cbaxes)
    cbar.ax.tick_params(labelsize=70) 
    #cbar.set_ticks(v)
    cbar.ax.set_yticklabels([i for i in v], fontsize=120)
    
    
    output_dir = r"D/test"
    plot_dir = os.path.join(output_dir, reservoir_property)
    if not os.path.exists(plot_dir):
        os.makedirs(plot_dir)
    fig.savefig(r"%s/per_allmodel.png"%(plot_dir))

CodePudding user response:

I tried your code and made a couple of modifications: first, the graph size was too huge and caused errors, so I made it smaller; second, I simplified the subplots: axes has a list of subplot objects, so I took them out with axes.flat; third The second is modifying the text as annotations. The graph size has been reduced and the font size and spacing have been adjusted, so please modify it yourself. Finally, tick_params is not set since the color bar ticks are disabled.

fig, axes = plt.subplots(2, 5, figsize=(16, 8))
row_count = 0
col_count = 0

for i,ax in enumerate(axes.flat):

    sub_plot_data = data[(i)*(150*150):(i 1)*150*150]

    x = 150
    y = 150
    #--------------------------- Define the map boundary ---------------------- 
    xmin = 1258096.6
    xmax = 1291155.0
    ymin = 11251941.6
    ymax = 11285000.0

    pmin = min(sub_plot_data)
    pmax = max(sub_plot_data) 
    # ---------------------------  define color bar for Discrete  color 
    bounds = np.linspace(-1, 1, 10)
    Discrete_colors = plt.get_cmap('jet')(np.linspace(0,1,len(bounds) 1))
    # create colormap without the outmost colors
    cmap = mcolors.ListedColormap(Discrete_colors[1:-1]) # 

    actual_2d = np.reshape(sub_plot_data,(y,x)) 

    #im = ax.imshow(actual_2d, interpolation=None, cmap=cmap, extent=(xmin, xmax, ymin, ymax), vmin=pmin, vmax=pmax)      
    im = ax.imshow(actual_2d, interpolation=None, cmap=cmap)      
    ax.text(actual_2d[62, 62], actual_2d[62, 62]-10, '%s' % 'Sale_1', 
        horizontalalignment='center', verticalalignment='center', color= 'black', fontsize=18)
    ax.set_title("Sale_Stores-%s - L: %s"%(i 1, 1), fontsize=14, pad=30, x=0.5, y=0.999)
    ax.set_aspect('auto')
    ax.add_patch(Rectangle((60, 60), 6, 6, edgecolor='red', facecolor='red', fill=True, lw=2))
    ax.text(62, 62, '%s' % 'Sale_1', ha='center', va='center', color='black', fontsize=14)

       
fig.tight_layout(h_pad=10) 
plt.subplots_adjust(left=0.02,
                    bottom=0.1, 
                    right=0.91, 
                    top=0.8, 
                    wspace=0.1, 
                    hspace=0.5)

cbaxes = fig.add_axes([0.94, 0.05, 0.02, 0.8])
cbar = fig.colorbar(im, ax=axes.flat, ticks=v, extend='both', cax=cbaxes)
cbar.ax.tick_params(labelsize=10) 
#cbar.set_ticks(v)
cbar.ax.set_yticklabels([str(i) for i in v], fontsize=12)

#plt.tick_params(left=False, labelleft=False, top=False, labeltop=False, right=False, labelright=False, bottom=False, labelbottom=False)

plt.show()

enter image description here

  • Related