Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib: Scatter Plot to Foreground on top of a Contour Plot

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!

like image 517
Mike Avatar asked Jul 02 '13 16:07

Mike


People also ask

How do I change the order of my plot in Matplotlib?

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.


1 Answers

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)) 

enter image description here

like image 85
sodd Avatar answered Sep 21 '22 20:09

sodd