Draw colorbar with twin scales

后端 未结 2 1169
-上瘾入骨i
-上瘾入骨i 2020-12-31 11:02

I\'d like to draw a (vertical) colorbar, which has two different scales (corresponding to two different units for the same quantity) on each side. Think Fahrenheit on one s

相关标签:
2条回答
  • 2020-12-31 11:38

    That should get you started:

    import matplotlib.pyplot as plt
    import numpy as np
    
    # generate random data
    x = np.random.randint(0,200,(10,10))
    plt.pcolormesh(x)
    
    # create the colorbar
    # the aspect of the colorbar is set to 'equal', we have to set it to 'auto',
    # otherwise twinx() will do weird stuff.
    cbar = plt.colorbar()
    pos = cbar.ax.get_position()
    cbar.ax.set_aspect('auto')
    
    # create a second axes instance and set the limits you need
    ax2 = cbar.ax.twinx()
    ax2.set_ylim([-2,1])
    
    # resize the colorbar (otherwise it overlays the plot)
    pos.x0 +=0.05
    cbar.ax.set_position(pos)
    ax2.set_position(pos)
    
    plt.show()
    

    enter image description here

    0 讨论(0)
  • 2020-12-31 11:39

    If you create a subplot for the colorbar, you can create a twin axes for that subplot and manipulate it like a normal axes.

    import matplotlib.colors as mcolors
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(-1,2.7)
    X,Y = np.meshgrid(x,x)
    Z = np.exp(-X**2-Y**2)*.9+0.1
    
    fig, (ax, cax) = plt.subplots(ncols=2, gridspec_kw={"width_ratios":[15,1]})
    
    im =ax.imshow(Z, vmin=0.1, vmax=1)
    cbar = plt.colorbar(im, cax=cax)
    cax2 = cax.twinx()
    
    ticks=np.arange(0.1,1.1,0.1)
    iticks=1./np.array([10,3,2,1.5,1])
    cbar.set_ticks(ticks)
    cbar.set_label("z")
    cbar.ax.yaxis.set_label_position("left")
    cax2.set_ylim(0.1,1)
    cax2.set_yticks(iticks)
    cax2.set_yticklabels(1./iticks)
    cax2.set_ylabel("1/z")
    
    plt.show()
    

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