21

I'm plotting a bunch of UTM coordinates using a matplotlib.pyplot.scatter. I also have a background air photo that I know matches the extent of the figure exactly. When I plot my data and set the axis I can display the scatter correctly. If I plot the air photo using imshow it uses the pixel number as the axis location. I need to shift the image (numpy array) to it's correct UTM position. Any ideas? I'm fairly new to matplotlib and numpy.

For example: I know that the top left corner of the image (imshow coordinate: 0,0) has the UTM coordinate (269658.4, 538318.2). How do I tell imshow the same thing?

I should also say that I investigated Basemap but it doesn't appear to fully support UTM yet. My study area is very small.

cds-mewald
  • 245
  • 2
  • 3
  • 6

1 Answers1

33

You need to use the extent keyword argument to imshow.

As a quick example:

import numpy as np
import matplotlib.pyplot as plt

# Random points between 50000 and 51000
x, y = 1000 * np.random.random((2, 10)) + 50000

# A 10x10 "image"...
image = np.arange(100).reshape((10,10))

# In a lot of cases, image data will be "flipped" vertically, so you may need 
# use the `origin` kwarg, as well (or just swap the ymin and ymax ordering).
plt.imshow(image, extent=[x.min(), x.max(), y.min(), y.max()])
plt.plot(x, y, 'ro')

plt.show()

enter image description here

Joe Kington
  • 275,208
  • 71
  • 604
  • 463
  • 1
    Thank you! This did exactly what I wanted! I'm not sure why I couldn't find that keyword in the API. – cds-mewald Sep 07 '12 at 20:07
  • 1
    It's easy to get lost in all of the keyword arguments to the various matplotlib functions. It is in the docs, though, I promise! :) Glad to help, at any rate. – Joe Kington Sep 07 '12 at 23:56