Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I create a standard colorbar for a series of plots in python

I using matplotlib to plot some data in python and the plots require a standard colour bar. The data consists of a series of NxM matrices containing frequency information so that a simple imshow() plot gives a 2D histogram with colour describing frequency. Each matrix contains data in different, but overlapping ranges. Imshow normalizes the data in each matrix to the range 0-1 which means that, for example, the plot of matrix A, will appear identical to the plot of the matrix 2*A (though the colour bar will show double the values). What I would like is for the colour red, for example, to correspond to the same frequency in all of the plots. In other words, a single colour bar would suffice for all the plots. Any suggestions would be greatly appreciated.

like image 863
user1010845 Avatar asked Oct 24 '11 12:10

user1010845


People also ask

How do you make multiple plots in Python?

To create multiple plots use matplotlib. pyplot. subplots method which returns the figure along with Axes object or array of Axes object. nrows, ncols attributes of subplots() method determine the number of rows and columns of the subplot grid.

How do you give a Colorbar a title in Python?

Steps. Create random data using numpy. Use imshow() method to represent data into an image, with colormap "PuBuGn" and interpolation= "nearest". Set the title on the ax (of colorbar) using set_title() method.


1 Answers

Not to steal @ianilis's answer, but I wanted to add an example...

There are multiple ways, but the simplest is just to specify the vmin and vmax kwargs to imshow. Alternately, you can make a matplotlib.cm.Colormap instance and specify it, but that's more complicated than necessary for simple cases.

Here's a quick example with a single colorbar for all images:

import numpy as np import matplotlib.pyplot as plt  # Generate some data that where each slice has a different range # (The overall range is from 0 to 2) data = np.random.random((4,10,10)) data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]  # Plot each slice as an independent subplot fig, axes = plt.subplots(nrows=2, ncols=2) for dat, ax in zip(data, axes.flat):     # The vmin and vmax arguments specify the color limits     im = ax.imshow(dat, vmin=0, vmax=2)  # Make an axis for the colorbar on the right side cax = fig.add_axes([0.9, 0.1, 0.03, 0.8]) fig.colorbar(im, cax=cax)  plt.show() 

enter image description here

like image 199
Joe Kington Avatar answered Sep 29 '22 23:09

Joe Kington