This is not the first time I try to get this done correctly, hopefully it will be the last.

I do not like the indirect control of matplotlib’s imshow, so I resorted to using pcolormesh (similar for the slower pcolor). However, displaying the ticks in correct positions for a given dataset is not fully trivial, since pcolormesh interprets x and y data as boundaries for the plotted color cells. Thus the below.

import pylab as pl
import numpy as np

# values x and y give values at z
xmin = 1; xmax = 4; dx = 1
ymin = 1; ymax = 3; dy = .5
x,y = np.meshgrid(np.arange(xmin,xmax,dx),np.arange(ymin,ymax,dy))
z = x*y

# transform x and y to boundaries of x and y
x2,y2 = np.meshgrid(np.arange(xmin,xmax+dx,dx)-dx/2.,np.arange(ymin,ymax+dy,dy)-dy/2.)

# pcolormesh without x and y just uses indexing as labels
pl.subplot(121)
pl.pcolormesh(z)
pl.title("Wrong ticks")

# pcolormesh with x and y values gives a wrong plot, x and y are treated as boundaries
pl.subplot(122)
pl.title("Wrong: x,y as values")
pl.pcolormesh(x,y,z)

pl.figure()
# using the boundaries gives correct plot
pl.subplot(121)
pl.title("Right: x,y as boundaries")
pl.pcolormesh(x2,y2,z)
pl.axis([x2.min(),x2.max(),y2.min(),y2.max()])

# using the boundaries gives correct plot
pl.subplot(122)
pl.title("Correct ticks")
pl.pcolormesh(x2,y2,z)
pl.axis([x2.min(),x2.max(),y2.min(),y2.max()])
pl.xticks(np.arange(xmin,xmax,dx))
pl.yticks(np.arange(ymin,ymax,dy))

pl.show()

download

download (2)