Consider the following data:
data1={73.9377, 54.4122, 53.0826, 24.1936};
data2={76.828, 49.1673, 45.7883, 18.9015};
I defined my own BarChart as follows:
MyBarCharts[list_]:= 
 BarChart[
   list,
   Frame -> {{True, None}, {True, None}}
 ]
When applying MyBarCharts to data1 and data2 I get (not really surprising) two different (with regard to the coordinate system) plots. Now I would like to have for both plots the exact same coordinate system. I know that with Histogram it works as follows:
Histogram[
data2,
PlotRange -> Part[PlotRange /. Options[Histogram[
                                       data1,
                                       PlotRange -> Automatic
                                       ],PlotRange], 2],
Frame -> {{True, None}, {True, None}}]
But the implementation of that approach in MyBarCharts does not give the desired result. Has anyone an idea?
Answer
Extracting the PlotRange from a BarChart is not as straightforward as it should be. If no PlotRange is specified in creating the chart, then Options will return PlotRange -> All and AbsoluteOptions will return PlotRange -> {{0., 1.}, {0., 1.}
bc = BarChart[{1, 2, 3, 4}];
Options[bc, PlotRange]
(* {PlotRange -> All} *)
AbsoluteOptions[bc, PlotRange]
(* {PlotRange -> {{0., 1.}, {0., 1.}}} *)
The incorrect result from AbsoluteOptions appears to be related to the presence of dynamic objects in the graphics expression (i.e. the bars with their mouseover effects) . I don't know why this causes AbsoluteOptions to go wrong, but a workaround is to replace the dynamic bars with straighforward rectangles, allowing AbsoluteOptions to extract the correct PlotRange. Thus, a replacement for AbsoluteOptions for BarCharts is:
barChartOptions[chart_, opts___] := 
 AbsoluteOptions[chart /. 
  Tooltip[StatusArea[RawBoxes[DynamicBox[{_, RectangleBox[data__]}]], _], _] :> 
    Rectangle[data], opts]
barChartOptions[bc, PlotRange]
(* {PlotRange -> {{0.545455, 4.45455}, {0., 4.}}} *)
Comments
Post a Comment