remove colorbar from figure in matplotlib

后端 未结 9 513
终归单人心
终归单人心 2020-12-08 14:14

This should be easy but I\'m having a hard time with it. Basically, I have a subplot in matplotlib that I\'m drawing a hexbin plot in every time a function is called, but ev

相关标签:
9条回答
  • 2020-12-08 15:04

    I am using matplotlib 1.4.0. This is how I solve this problem:

    import matplotlib
    import numpy as np
    import matplotlib.cm as cm
    import matplotlib.mlab as mlab
    import matplotlib.pyplot as plt
    
    # A contour plot example:
    delta = 0.025
    x = np.arange(-3.0, 3.0, delta)
    y = np.arange(-2.0, 2.0, delta)
    X, Y = np.meshgrid(x, y)
    Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
    Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
    Z = 10.0 * (Z2 - Z1)
    #
    
    # first drawing
    fig = plt.figure()
    ax = fig.add_subplot(111)  # drawing axes
    c = ax.contourf(Z)   # contour fill c
    cb = fig.colorbar(c)  # colorbar for contour c
    
    # clear first drawimg
    ax.clear()  # clear drawing axes
    cb.ax.clear()  # clear colorbar axes
    
    # replace with new drawing
    # 1. drawing new contour at drawing axes
    c_new = ax.contour(Z)  
    # 2. create new colorbar for new contour at colorbar axes
    cb_new = ax.get_figure().colorbar(c_new, cax=cb.ax) 
    
    plt.show()
    

    Above code draws a contour fill plot with colorbar, clear it and draw a new contour plot with new colorbar at the same figure.

    By using cb.ax i am able to identify the colorbar axes and clear the old colorbar. And specifying cax=cb.ax simply draws the new colorbar in the old colorbar axes.

    0 讨论(0)
  • 2020-12-08 15:08

    Don't want to take anything away from the author of this blog post (Joseph Long) but this is clearly the best solution I've found so far. It includes pieces of code, great explanations and many examples.

    To summarize, from any output of an axis ax of the command: plot, image, scatter, collection, etc. such as:

    import matplotlib.pyplot as plt
    fig = plt.figure(figsize=(5,5), dpi=300)
    ax = fig.add_subplot(1, 1, 1)
    
    data = ax.plot(x,y)
    # or
    data = ax.scatter(x, y, z)
    # or
    data = ax.imshow(z)
    # or 
    data = matplotlib.collection(patches)
    ax.add_collection(data)
    

    You create a color bar axis using the make_axes_locatable and the original axis of the plot.

    from mpl_toolkits.axes_grid1 import make_axes_locatable
    
    # the magical part
    divider = make_axes_locatable(ax)
    caxis = divider.append_axes("right", size="5%", pad=0.05)
    fig.colorbar(data, cax=caxis)
    
    plt.show()
    

    The created colorbar will have the same size as the figure or subplot and you can modify it's width, location, padding when using the divider.append_axes command.

    0 讨论(0)
  • 2020-12-08 15:10

    "on_mappable_changed" worked in my case. However, according to docs, the method "Typically ... should not be called manually."

    if self.cb:
        self.cb.on_mappable_changed(hb)
    else:
        self.cb = self.fig.colorbar(hb)
    
    0 讨论(0)
提交回复
热议问题