Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add colorbar to existing axis

I'm making some interactive plots and I would like to add a colorbar legend. I don't want the colorbar to be in its own axes, so I want to add it to the existing axes. I'm having difficulties doing this, as most of the example code I have found creates a new axes for the colorbar.

I have tried the following code using matplotlib.colorbar.ColorbarBase, which adds a colorbar to an existing axes, but it gives me strange results and I can't figure out how to specify attributes of the colorbar (for instance, where on the axes it is placed and what size it is)

import matplotlib import matplotlib.pyplot as plt from matplotlib.cm import coolwarm import numpy as np  x = np.random.uniform(1, 10, 10) y = np.random.uniform(1, 10, 10) v = np.random.uniform(1, 10, 10)  fig, ax = plt.subplots()  s = ax.scatter(x, y, c=v, cmap=coolwarm)  matplotlib.colorbar.ColorbarBase(ax=ax, cmap=coolwarm, values=sorted(v),                                  orientation="horizontal") 

Using fig.colorbar instead ofmatplotlib.colorbar.ColorbarBase still doesn't give me quite what I want, and I still don't know how to adjust the attributes of the colorbar.

fig.colorbar(s, ax=ax, cax=ax) 

enter image description here

Let's say I want to have the colorbar in the top left corner, stretching about halfway across the top of the plot. How would I go about doing that?

Am I better off writing a custom function for this, maybe using LineCollection?

like image 646
C_Z_ Avatar asked Sep 08 '15 16:09

C_Z_


People also ask

How do I add a legend to my Colorbar?

To plot data and draw a colorbar or legend in one go, pass a location (e.g., colorbar='r' or legend='b' ) to the plotting command (e.g., plot or contour ). To pass keyword arguments to the colorbar and legend commands, use the legend_kw and colorbar_kw arguments (e.g., legend_kw={'ncol': 3} ).


2 Answers

This technique is usually used for multiple axis in a figure. In this context it is often required to have a colorbar that corresponds in size with the result from imshow. This can be achieved easily with the axes grid tool kit:

import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable  data = np.arange(100, 0, -1).reshape(10, 10)  fig, ax = plt.subplots() divider = make_axes_locatable(ax) cax = divider.append_axes('right', size='5%', pad=0.05)  im = ax.imshow(data, cmap='bone')  fig.colorbar(im, cax=cax, orientation='vertical') plt.show() 

Image with proper colorbar in size

like image 167
Heberto Mayorquin Avatar answered Oct 15 '22 15:10

Heberto Mayorquin


The colorbar has to have its own axes. However, you can create an axes that overlaps with the previous one. Then use the cax kwarg to tell fig.colorbar to use the new axes.

For example:

import numpy as np import matplotlib.pyplot as plt  data = np.arange(100, 0, -1).reshape(10, 10)  fig, ax = plt.subplots() cax = fig.add_axes([0.27, 0.8, 0.5, 0.05])  im = ax.imshow(data, cmap='gist_earth') fig.colorbar(im, cax=cax, orientation='horizontal') plt.show() 

enter image description here

like image 30
Joe Kington Avatar answered Oct 15 '22 16:10

Joe Kington