# Make a histogram by giving the range and height of each bin one by one

I got the data of each bin by measurements like {start, end, height} and I want something like this picture: http://tinypic.com/view.php?pic=2i208hs&s=5

I have no other data for the Histogram[], just what you can see on the linked picture. So any ideas how to do this in Mathematica (version 9)?

(The whole thing is for fitting a distibution curve on it.)

-

Generate the test data:

points = 10;
SeedRandom[123];
xi = Sort[Table[n + RandomReal[{-.2, 1.5}], {n, points + 1}]]
yi = RandomReal[{1, 5}, points]
data = Table[{xi[[i]], xi[[i + 1]], yi[[i]]}, {i, Length[yi]}]


This creates the data in the format $\{start,end,height\}$. Draw the plot:

ListPlot[data[[All, {2, 3}]], PlotStyle -> None,
Prolog -> {Opacity[0], EdgeForm[Black],
Rectangle[{#[[1]], 0}, {#[[2]], #[[3]]}] & /@ data},
AxesOrigin -> {0, 0}]


-

First I'll generate some data in {start,end,height} format. This data is drawn from a standard normal distribution.

data = Partition[Flatten[Transpose[{Thread[{Most[#[[1]]], Rest[#[[1]]]}], #[[2]]}]], 3] &
[HistogramList[RandomReal[NormalDistribution[], 100], Automatic, "PDF"]]


Now you could try using a combination of explicit binning and a height function.

hfun[bins_, counts_] := counts
x = Union[Flatten[data[[All, 1 ;; 2]]]];
h = data[[All, -1]];
Histogram[x, {x}, hfun[#, h] &]


Suppose you want to compare it to the underlying distribution.

Show[Histogram[x, {x}, hfun[#, h] &],
Plot[PDF[NormalDistribution[], t], {t, -3, 3}], PlotRange -> All]


Edit:

In this particular case I assume normalized heights because I generated them with HistogramList and the setting "PDF". If this is not the case you may need to normalize them yourself. This can be accomplished by replacing h with hnorm in Histogram where hnorm is given by

hnorm = h/Differences[x].h

-