I have an histogram (h1) and the user can zoom on it (click drag on the x or y axis). From time to time I get a new histogram (h2 per instance) to replace h1. I would like to have the same viewing range in h2 than in h1.
First question : how to get the viewing range ?
I see GetMaximum in the TH1 class but this is only for axis Y.
There is GetXMin in the TAxis class, but it doesn’t seem to return the viewing range.
Finally, I guess I should use GetUxmin, GetUxmax, etc… methods from the TPad, but I am not entirely sure.
Second question : How to change the viewing range of h2 ?
Using the Range method of TPad ? the TH1::SetMinimum ? or the TAxis::SetRange ?
Thanks in advance for any explanation on the differences between those methods.
Your solution for the Y axis works perfectly.
However the solution for the X axis works to set new limits but what about retrieving the limits values of an histogram ?
Here is an example of what I want :
root [0] new TCanvas
(class TCanvas*)0x873dc50
root [1] h = new TH1F("test", "test", 20, 0, 20)
(class TH1F*)0x87b8ad8
root [2] h->Draw()
root [3] h->Fill(4)
(Int_t)(5)
root [4] // here you manually zoom on a part of X axis
root [5] TAxis *x = h->GetXaxis()
root [6] x->GetXmin()
(const Double_t)0.00000000000000000e+00
After the zoom, I want to get the new limits but I still get 0.0.
No problem. I should have replied myself with mypartial solution.
I finally do the following to get range of axes X and Y with and without zoom:
// this gives you the value taking into account the zoom
Double_t xmin = pad->GetUxmin();
Double_t xmax = pad->GetUxmax();
Double_t ymin = pad->GetUymin();
Double_t ymax = pad->GetUymax();
// and this gives you the "real" value of the axis (no zoom)
Double_t xminLimit = histo->GetXaxis()->GetXmin();
Double_t xmaxLimit = histo->GetXaxis()->GetXmax();
Double_t yminLimit = histo->GetMinimum();
Double_t ymaxLimit = histo->GetMaximum();
I don’t know if it is the correct way of doing it, but it works. And I understand why the zoom values are stored in the pad, as you can have the same histogram displayed in two different pads.
However, I don’t understand why there is no common way of retrieving axes extremities (histo->GetXaxis()->GetXmin(); and histo->GetMinimum(); ). This is missleading.
Moreover, the synthax histo->GetXaxis()->GetXmin() leads you to search for a histo->GetYaxis()->GetYmin() which doesn’t exist. You end up with histo->GetYaxis()->GetXmin() which is non-sense and doesn’t work.
Now, what bothers me is how to set the zoom. I don’t want to set it on the histogram but on the pad (again, if I display the histogram in 2 pads, I want to put different values on each of them). I was looking for something like SetUymin(), as I used GetUymin(), but it simply doesn’t exist. How should I do it ?
I am sorry but that doesn’t solve the problem I was mentionning: 1 histogram displayed on 2 pads (A and B). If you use histo->SetRange or whatever method on the histogram, it will be applied on both pads.
The zoom should belong to the TPad and not to the histogram. And I am sure it is the case as you can have different zoom in A and B when setting the zoom manually.
Do you know if there is a method equivalent to GetUxmin (and others) but to set these values on the pad ?