Does anyone know a way to bring a scatter plot to the foreground in matplotlib? I have to display the scatter plotting on top of the contour, but by default it is plotted underneath...
Thanks in advance!
You can change the order for individual artists by setting the zorder. Any individual plot() call can set a value for the zorder of that particular item. In the fist subplot below, the lines are drawn above the patch collection from the scatter, which is the default. In the subplot below, the order is reversed.
You can manually choose in which order the different plots are to be displayed with the zorder
parameter of e.g. the scatter
method.
To demonstrate, see the code below, where the scatter plot in the left subplot has zorder=1
and in the right subplot it has zorder=-1
. The object with the highest zorder
is placed on top. This means that the scatter will be placed on top of the contour in the first subplot, while it is placed underneath in the second subplot.
import numpy as np import matplotlib.cm as cm import matplotlib.mlab as mlab import matplotlib.pyplot as plt 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) norm = cm.colors.Normalize(vmax=abs(Z).max(), vmin=-abs(Z).max()) cmap = cm.PRGn levels = np.arange(-2.0, 1.601, 0.4) fig, axes = plt.subplots(1,2, sharey=True) for ax, zord in zip(axes, [1, -1]): ax.contourf(X, Y, Z, levels, cmap=cm.get_cmap(cmap, len(levels)-1), norm=norm) ax.autoscale(False) # To avoid that the scatter changes limits ax.scatter(np.random.uniform(-3,3,10), np.random.uniform(-2,2,10), zorder=zord) ax.set_title('Scatter with zorder={0}'.format(zord))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With