Note

Go to the endto download the full example code.

Bar chart with gradients#

Matplotlib does not natively support gradients. However, we can emulate agradient-filled rectangle by anAxesImage of the right size and coloring.

In particular, we use a colormap to generate the actual colors. It is thensufficient to define the underlying values on the corners of the image andlet bicubic interpolation fill out the area. We define the gradient directionby a unit vectorv. The values at the corners are then obtained by thelengths of the projections of the corner vectors onv.

A similar approach can be used to create a gradient background for an Axes.In that case, it is helpful to use Axes coordinates (extent=(0,1,0,1),transform=ax.transAxes) to be independent of the data coordinates.

importmatplotlib.pyplotaspltimportnumpyasnpnp.random.seed(19680801)defgradient_image(ax,direction=0.3,cmap_range=(0,1),**kwargs):"""    Draw a gradient image based on a colormap.    Parameters    ----------    ax : Axes        The Axes to draw on.    direction : float        The direction of the gradient. This is a number in        range 0 (=vertical) to 1 (=horizontal).    cmap_range : float, float        The fraction (cmin, cmax) of the colormap that should be        used for the gradient, where the complete colormap is (0, 1).    **kwargs        Other parameters are passed on to `.Axes.imshow()`.        In particular, *cmap*, *extent*, and *transform* may be useful.    """phi=direction*np.pi/2v=np.array([np.cos(phi),np.sin(phi)])X=np.array([[v@[1,0],v@[1,1]],[v@[0,0],v@[0,1]]])a,b=cmap_rangeX=a+(b-a)/X.max()*Xim=ax.imshow(X,interpolation='bicubic',clim=(0,1),aspect='auto',**kwargs)returnimdefgradient_bar(ax,x,y,width=0.5,bottom=0):forleft,topinzip(x,y):right=left+widthgradient_image(ax,extent=(left,right,bottom,top),cmap="Blues_r",cmap_range=(0,0.8))fig,ax=plt.subplots()ax.set(xlim=(0,10),ylim=(0,1))# background imagegradient_image(ax,direction=1,extent=(0,1,0,1),transform=ax.transAxes,cmap="RdYlGn",cmap_range=(0.2,0.8),alpha=0.5)N=10x=np.arange(N)+0.15y=np.random.rand(N)gradient_bar(ax,x,y,width=0.7)plt.show()
gradient bar

Tags:styling: colorplot-type: imshowlevel: intermediatepurpose: showcase

Gallery generated by Sphinx-Gallery