How can I create a standard colorbar for a series of plots in python

前端 未结 4 1170
无人及你
无人及你 2020-11-28 03:50

I using matplotlib to plot some data in python and the plots require a standard colour bar. The data consists of a series of NxM matrices containing frequency information so

相关标签:
4条回答
  • 2020-11-28 04:24

    This only answer half of the question, or rather starts a new one. If you change

    data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]
    

    to

    data *= np.array([2.0, 1.0, 1.5, 0.5])[:,None,None]
    

    your colorbar will go from 0 to 0.5 which in this case is dark blue to slightly lighter blue and will not cover the whole range (0 to 2). The colorbar will only show the colors from the last image or contour regardless of vmin and vmax.

    0 讨论(0)
  • 2020-11-28 04:27

    Easiest solution is to call clim(lower_limit, upper_limit) with the same arguments for each plot.

    0 讨论(0)
  • 2020-11-28 04:34

    Not to steal @ianilis's answer, but I wanted to add an example...

    There are multiple ways, but the simplest is just to specify the vmin and vmax kwargs to imshow. Alternately, you can make a matplotlib.cm.Colormap instance and specify it, but that's more complicated than necessary for simple cases.

    Here's a quick example with a single colorbar for all images:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # Generate some data that where each slice has a different range
    # (The overall range is from 0 to 2)
    data = np.random.random((4,10,10))
    data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]
    
    # Plot each slice as an independent subplot
    fig, axes = plt.subplots(nrows=2, ncols=2)
    for dat, ax in zip(data, axes.flat):
        # The vmin and vmax arguments specify the color limits
        im = ax.imshow(dat, vmin=0, vmax=2)
    
    # Make an axis for the colorbar on the right side
    cax = fig.add_axes([0.9, 0.1, 0.03, 0.8])
    fig.colorbar(im, cax=cax)
    
    plt.show()
    

    enter image description here

    0 讨论(0)
  • 2020-11-28 04:35

    I wasn't happy with the solutions that suggested to manually set vmin and vmax, so I decided to read the limits of each plot and automatically set vmin and vmax.

    The example below shows three plots of samples taken from normal distributions with increasing mean value.

    import matplotlib.pyplot as plt
    from mpl_toolkits.axes_grid1 import ImageGrid
    import numpy as np
    
    numberOfPlots = 3
    data = []
    for i in range(numberOfPlots):
        mean = i
        data.append(np.random.normal(mean, size=(100,100)))
    
    fig = plt.figure()
    grid = ImageGrid(fig, 111, nrows_ncols=(1,numberOfPlots), cbar_mode='single')
    ims = []
    for i in range(numberOfPlots):
        ims.append(grid[i].imshow(data[i]))
        grid[i].set_title("Mean = " + str(i))
    
    clims = [im.get_clim() for im in ims]
    vmin = min([clim[0] for clim in clims])
    vmax = max([clim[1] for clim in clims])
    for im in ims:
        im.set_clim(vmin=np.floor(vmin),vmax=np.ceil(vmax))
    grid[0].cax.colorbar(ims[0]) # with cbar_mode="single", cax attribute of all axes are identical    
    
    fig.show()
    

    0 讨论(0)
提交回复
热议问题