Search code examples
pythongraphicsgraphmatplotlib

Python: 2D color map with imshow


I am trying to represent a function of two variable on a two dimensional graph using color. I came across this example here:

from numpy import exp,arange
from pylab import meshgrid,cm,imshow,contour,clabel,colorbar,axis,title,show
# the function that I'm going to plot
def z_func(x,y):
 return (1-(x**2+y**3))*exp(-(x**2+y**2)/2)

x = arange(-3.0,3.0,0.1)
y = arange(-3.0,3.0,0.1)
X,Y = meshgrid(x, y) # grid of point
Z = z_func(X, Y) # evaluation of the function on the grid

im = imshow(Z,cmap=cm.RdBu) # drawing the function
# adding the Contour lines with labels
cset = contour(Z,arange(-1,1.5,0.2),linewidths=2,cmap=cm.Set2)
clabel(cset,inline=True,fmt='%1.1f',fontsize=10)
colorbar(im) # adding the colobar on the right
# latex fashion title
title('$z=(1-x^2+y^3) e^{-(x^2+y^2)/2}$')
show()

which produces enter image description here

However, the axis scales and limits do not correspond to the real x and y data(both of which are between -3 and 3). How to make them correspond to the actual data?


Solution

  • Add extent=(-3, 3, 3, -3) to the call to imshow and extent=(-3, 3, -3, 3) (note the unfortunately tricky change in signs!) to the call to contour:

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    def z_func(x, y):
        return (1 - (x ** 2 + y ** 3)) * np.exp(-(x ** 2 + y ** 2) / 2)
    
    x = np.arange(-3.0, 3.0, 0.1)
    y = np.arange(-3.0, 3.0, 0.1)
    X, Y = np.meshgrid(x, y)
    Z = z_func(X, Y) 
    
    
    im = plt.imshow(Z, cmap=plt.cm.RdBu, extent=(-3, 3, 3, -3))  
    cset = plt.contour(Z, np.arange(-1, 1.5, 0.2), linewidths=2,
                       cmap=plt.cm.Set2,
                       extent=(-3, 3, -3, 3))
    plt.clabel(cset, inline=True, fmt='%1.1f', fontsize=10)
    plt.colorbar(im)  
    
    plt.title('$z=(1-x^2+y^3) e^{-(x^2+y^2)/2}$')
    
    plt.show()
    

    enter image description here