1

I'm using the hist2d function of matplotlib.pyplot, giving it input some coordinates (x,y).

I would like, after having defined the histogram, to get the center of each bin, i.e., the coordinates of the center of each bin.

Is there an easy way to get them?

tdy
  • 36,675
  • 19
  • 86
  • 83
Cla
  • 171
  • 1
  • 12
  • `hist2d` returns `h`, `xedges`, `yedges`, `image`. Having the edges, you can get the midpoints in whatever way you find easier, be it averaging or looping through the arrays. See https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist2d.html – K.Cl Jun 20 '22 at 15:15

1 Answers1

1

The return values of plt.hist and plt.hist2d include bin edges, so take the mean of the left edges and right edges:

  • plt.hist

    h, xedges, patches = plt.hist(x)
    xcenters = (xedges[:-1] + xedges[1:]) / 2
    
  • plt.hist2d

    h, xedges, yedges, image = plt.hist2d(x, y)
    xcenters = (xedges[:-1] + xedges[1:]) / 2
    ycenters = (yedges[:-1] + yedges[1:]) / 2
    

Note that you can use numpy functions if preferred, though I find it less readable in this case:

xcenters = np.mean(np.vstack([xedges[:-1], xedges[1:]]), axis=0)

Full example with plt.hist2d:

import matplotlib.pyplot as plt
import numpy as np

x = np.random.random(50)
y = np.random.random(50)

h, xedges, yedges, image = plt.hist2d(x, y, bins=5)

xcenters = (xedges[:-1] + xedges[1:]) / 2
ycenters = (yedges[:-1] + yedges[1:]) / 2

Output:

>>> xedges
# array([0.01568168, 0.21003078, 0.40437988, 0.59872898, 0.79307808, 0.98742718])

>>> xcenters
# array([0.11285623, 0.30720533, 0.50155443, 0.69590353, 0.89025263])

>>> yedges
# array([0.00800735, 0.20230702, 0.39660669, 0.59090636, 0.78520603, 0.97950570])

>>> ycenters
# array([0.10515718, 0.29945685, 0.49375652, 0.68805619, 0.88235586])
tdy
  • 36,675
  • 19
  • 86
  • 83