8

Please forgive me if this is a repeated question, I've done my best to look for a solution. This seems very straightforward but I can't seem to find anything applicable.

I'm trying to generate a plot (like a heatmap) using data from 3 1-D numpy arrays. The data is basically arranged as follows:

x_axis = ([1, 4, 6])
y_axis = ([2, 5, 7])
z_axis = ([5, 8, 9])

(my data sets are actually much larger... sometimes hundreds of thousands of entries).

so I've got z_axis values that are each associated with an x-coordinate and y-coordinate... for example, the point (1,2) has the value 5 associated with it.

All I want to do is plot this in such a way that the z values are averaged out for whatever bin size I specify, and color-coded like a heatmap. So, for instance, if I've got 10 data points that fall within a given bin, their z-values will be averaged and that value will fall somewhere on a color spectrum.

Thanks for any help you can provide.

Charles
  • 50,943
  • 13
  • 104
  • 142
Teachey
  • 549
  • 7
  • 18

1 Answers1

7

From np.histogram2d:

import matplotlib.pyplot as plt
H, xedges, yedges =np.histogram2d(x_axis, y_axis, bins=10, weights=z_axis) 
extent = [yedges[0], yedges[-1], xedges[-1], xedges[0]]
plt.imshow(H, extent=extent, interpolation='nearest')
plt.colorbar()
plt.show()

Bin count is easily changed.

As Jamie pointed out in the comments if you want the average of the points in each bin:

numbins=10
H, xedges, yedges =np.histogram2d(x_axis, y_axis, bins=numbins, weights=z_axis) 
count, x, y =np.histogram2d(x_axis, y_axis, bins=numbins) 
H/=count
Daniel
  • 19,179
  • 7
  • 60
  • 74
  • If he wants averages, not sums, you'll have to run `np.histogram2d` again without the `weights` keyword argument to get counts in each bin, and plot the division of both arrays. – Jaime Jul 08 '13 at 15:44
  • Thats a good point, I wasn't quite reading the question that way. I thought he was phrasing it as the array should be normalized for the colors, but plt doesnt care either way. – Daniel Jul 08 '13 at 16:02