Median of histogram


is there an easy way of getting the median of a histogram instead of the mean?



we don’t have currently a function calculating t he mean of an histogram. It could be added in the next release.
Anyway it is easy to implement, here is function calculating it, given a TH1D

#include "TH1.h"
#include "TMath.h"
#include <vector>

double Median(const TH1D * h1) { 

   int n = h1->GetXaxis()->GetNbins();  
   std::vector<double>  x(n);
   h1->GetXaxis()->GetCenter( &x[0] );
   const double * y = h1->GetArray(); 
   // exclude underflow/overflows from bin content array y
   return TMath::Median(n, &x[0], &y[1]); 

Best Regards


Just for the record this is how I did it in the end:

 int numBins = histo1->GetXaxis()->GetNbins();
  Double_t *x = new Double_t[numBins];
  Double_t* y = new Double_t[numBins];
  for (int i = 0; i < numBins; i++) {
    x[i] = histo1->GetBinCenter(i);
    y[i] = histo1->GetBinContent(i);
  double MedianOfHisto = TMath::Median(numBins, &x[], &y[]);

Thanks for this kshaw!

The “median” is just the “0.5 quantile”:

  // create, fill and draw the histogram
  TF1 *f = new TF1("f", "TMath::Gaus(x, 5, 1)", 0, 10);
  TH1D *h = new TH1D("h", "h", 100, 0, 10);
  // calculate and print the "median"
  Double_t x, q;
  q = 0.5; // 0.5 for "median"
  h->ComputeIntegral(); // just a precaution
  h->GetQuantiles(1, &x, &q);
  std::cout << "median = " << x << std::endl;
1 Like