From 963ded8f7f16373ab27a1648d3809137c174c839 Mon Sep 17 00:00:00 2001 From: Chris Holdgraf Date: Tue, 28 Jun 2016 09:59:06 -0700 Subject: [PATCH] adding from_list to custom cmap tutorial --- examples/pylab_examples/custom_cmap.py | 78 ++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/examples/pylab_examples/custom_cmap.py b/examples/pylab_examples/custom_cmap.py index 24550a18d72..b3e44843be7 100644 --- a/examples/pylab_examples/custom_cmap.py +++ b/examples/pylab_examples/custom_cmap.py @@ -3,6 +3,18 @@ from matplotlib.colors import LinearSegmentedColormap """ +Creating a colormap from a list of colors +----------------------------------------- +Creating a colormap from a list of colors can be done with the `from_list` +method of `LinearSegmentedColormap`. You must pass a list of RGB tuples that +define the mixture of colors from 0 to 1. + + +Creating custom colormaps +------------------------- +It is also possible to create a custom mapping for a colormap. This is +accomplished by creating dictionary that specifies how the RGB channels +change from one end of the cmap to the other. Example: suppose you want red to increase from 0 to 1 over the bottom half, green to do the same over the middle half, and blue over the top @@ -55,7 +67,32 @@ never used. """ +# Make some illustrative fake data: + +x = np.arange(0, np.pi, 0.1) +y = np.arange(0, 2*np.pi, 0.1) +X, Y = np.meshgrid(x, y) +Z = np.cos(X) * np.sin(Y) * 10 + + +# --- Colormaps from a list --- +colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1)] # R -> G -> B +n_bins = [3, 6, 10, 100] # Discretizes the interpolation into bins +cmap_name = 'my_list' +fig, axs = plt.subplots(2, 2, figsize=(6, 9)) +fig.subplots_adjust(left=0.02, bottom=0.06, right=0.95, top=0.94, wspace=0.05) +for n_bin, ax in zip(n_bins, axs.ravel()): + # Create the colormap + cm = LinearSegmentedColormap.from_list( + cmap_name, colors, N=n_bin) + # Fewer bins will result in "coarser" colomap interpolation + im = ax.imshow(Z, interpolation='nearest', origin='lower', cmap=cm) + ax.set_title("N bins: %s" % n_bin) + fig.colorbar(im, ax=ax) + + +# --- Custom colormaps --- cdict1 = {'red': ((0.0, 0.0, 0.0), (0.5, 0.0, 0.1), @@ -130,28 +167,19 @@ plt.register_cmap(name='BlueRed3', data=cdict3) # optional lut kwarg plt.register_cmap(name='BlueRedAlpha', data=cdict4) -# Make some illustrative fake data: - -x = np.arange(0, np.pi, 0.1) -y = np.arange(0, 2*np.pi, 0.1) -X, Y = np.meshgrid(x, y) -Z = np.cos(X) * np.sin(Y) * 10 - # Make the figure: -plt.figure(figsize=(6, 9)) -plt.subplots_adjust(left=0.02, bottom=0.06, right=0.95, top=0.94, wspace=0.05) +fig, axs = plt.subplots(2, 2, figsize=(6, 9)) +fig.subplots_adjust(left=0.02, bottom=0.06, right=0.95, top=0.94, wspace=0.05) # Make 4 subplots: -plt.subplot(2, 2, 1) -plt.imshow(Z, interpolation='nearest', cmap=blue_red1) -plt.colorbar() +im1 = axs[0, 0].imshow(Z, interpolation='nearest', cmap=blue_red1) +fig.colorbar(im1, ax=axs[0, 0]) -plt.subplot(2, 2, 2) cmap = plt.get_cmap('BlueRed2') -plt.imshow(Z, interpolation='nearest', cmap=cmap) -plt.colorbar() +im2 = axs[1, 0].imshow(Z, interpolation='nearest', cmap=cmap) +fig.colorbar(im2, ax=axs[1, 0]) # Now we will set the third cmap as the default. One would # not normally do this in the middle of a script like this; @@ -159,10 +187,9 @@ plt.rcParams['image.cmap'] = 'BlueRed3' -plt.subplot(2, 2, 3) -plt.imshow(Z, interpolation='nearest') -plt.colorbar() -plt.title("Alpha = 1") +im3 = axs[0, 1].imshow(Z, interpolation='nearest') +fig.colorbar(im3, ax=axs[0, 1]) +axs[0, 1].set_title("Alpha = 1") # Or as yet another variation, we can replace the rcParams # specification *before* the imshow with the following *after* @@ -171,19 +198,18 @@ # image-like item plotted via pyplot, if any. # -plt.subplot(2, 2, 4) # Draw a line with low zorder so it will be behind the image. -plt.plot([0, 10*np.pi], [0, 20*np.pi], color='c', lw=20, zorder=-1) +axs[1, 1].plot([0, 10*np.pi], [0, 20*np.pi], color='c', lw=20, zorder=-1) -plt.imshow(Z, interpolation='nearest') -plt.colorbar() +im4 = axs[1, 1].imshow(Z, interpolation='nearest') +fig.colorbar(im4, ax=axs[1, 1]) # Here it is: changing the colormap for the current image and its # colorbar after they have been plotted. -plt.set_cmap('BlueRedAlpha') -plt.title("Varying alpha") +im4.set_cmap('BlueRedAlpha') +axs[1, 1].set_title("Varying alpha") # -plt.suptitle('Custom Blue-Red colormaps', fontsize=16) +fig.suptitle('Custom Blue-Red colormaps', fontsize=16) plt.show()