Matplotlib: how to get the color bar of an image displayed when using plt.figure () and figure.addaxes ()

I am trying to create a figure with six separate plots organized in two rows of three plots. Each line of graphs must have its own color strip corresponding to the images shown in the three graphs in the horizontal group. Derived visually, the drawing should look like this:

image_type1 | image_type1 | image_type1 | colorbar_for_type1_images

image_type2 | image_type2 | image_type2 | colorbar_for_type2_images

The vertical lines in the above view are just to separate the various components of the figure. I really don't need the vertical lines in my figure.

Below is an example of what I'm trying to do, as well as my unsuccessful attempts to get a color bar that will be built with a third image on each line.

I was able to do this successfully in the past with code similar to what appears below when I used my own color map for a series of constructed lines , and not for images, as I am trying to do this below.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.cbook import get_sample_data

#Make 6 plotting areas of the same dimensions
figuresizex = 9.0
figuresizey = 6.1
lowerx = .07
lowery = .09
upperx = .92
uppery = .97
xspace = .05
yspace = .11
xwidth = (upperx-lowerx-2*xspace)/3.
ywidth = (uppery-lowery-yspace)/2.

fig = plt.figure(figsize=(figuresizex,figuresizey))
ax1 = fig.add_axes([lowerx,lowery+ywidth+yspace,xwidth,ywidth])
ax2 = fig.add_axes([lowerx+xwidth+xspace,lowery+ywidth+yspace,xwidth,ywidth])
ax3 = fig.add_axes([lowerx+2*xwidth+2*xspace,lowery+ywidth+yspace,xwidth,ywidth])
ax4 = fig.add_axes([lowerx,lowery,xwidth,ywidth])
ax5 = fig.add_axes([lowerx+xwidth+xspace,lowery,xwidth,ywidth])
ax6 = fig.add_axes([lowerx+2*xwidth+2*xspace,lowery,xwidth,ywidth])
axlist = [ax1,ax2,ax3,ax4,ax5,ax6]

#Start plotting images
image = np.identity(5)

for i in range(0,3):
    vmin, vmax = image.min(),image.max()
    axuse = axlist[i]
    im = axuse.imshow(image, vmin=vmin, vmax=vmax)
    if i == 3:
        cbar = axuse.colorbar(im)
        cbar = plt.colorbar(im)

image_2 = np.arange(16).reshape((4,4))

for i in range(0,3):
    vmin, vmax = image_2.min(),image_2.max()
    axuse = axlist[i+3]
    axuse.imshow(image_2,vmin=vmin, vmax=vmax)
    if i == 3:
        cbar = axuse.colorbar()
        cbar = plt.colorbar()

plt.show()
+4
source share
1 answer

I would suggest using the approach described in this question .

, colorbar ( == 2), ImageGrid (?) 6 , .

. , , vmin vmax.

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid

figuresizex = 9.0
figuresizey = 6.1

# generate images
image1 = np.identity(5)
image2 = np.arange(16).reshape((4,4))



fig = plt.figure(figsize=(figuresizex,figuresizey))

# create your grid objects
top_row = ImageGrid(fig, 311, nrows_ncols = (1,3), axes_pad = .25,
                    cbar_location = "right", cbar_mode="single")
middle_row = ImageGrid(fig, 312, nrows_ncols = (1,3), axes_pad = .25,
                       cbar_location = "right", cbar_mode="single")
bottom_row = ImageGrid(fig, 313, nrows_ncols = (1,3), axes_pad = .25,
                       cbar_location = "right", cbar_mode="single")

# plot the images            
for i in range(3):
    vmin, vmax = image1.min(),image1.max()
    ax = top_row[i]
    im1 = ax.imshow(image1, vmin=vmin, vmax=vmax)

for i in range(3):
    vmin, vmax = image2.min(),image2.max()
    ax =middle_row[i]
    im2 = ax.imshow(image2, vmin=vmin, vmax=vmax)

# Update showing how to use identical scale across all 3 images
# make some slightly different images and get their bounds
image2s = [image2,image2 + 5,image2 - 5]

# inelegant way to get the absolute upper and lower bounds from the three images
i_max, i_min = 0,0
for im in image2s:
    if im.max() > i_max: 
        i_max= im.max()
    if im.min() < i_min: 
        i_min = im.min()
# plot these as you would the others, but use identical vmin and vmax for all three plots
for i,im in enumerate(image2s):
    ax = bottom_row[i]
    im2_scaled = ax.imshow(im, vmin = i_min, vmax = i_max)

# add your colorbars
cbar1 = top_row.cbar_axes[0].colorbar(im1)
middle_row.cbar_axes[0].colorbar(im2)       
bottom_row.cbar_axes[0].colorbar(im2_scaled)

# example of titling colorbar1
cbar1.set_label_text("label"))

# readjust figure margins after adding colorbars, 
# left and right are unequal because of how
# colorbar labels don't appear to factor in to the adjustment
plt.subplots_adjust(left=0.075, right=0.9)

plt.show()
+2

Source: https://habr.com/ru/post/1623807/


All Articles