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