Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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 MyBarChart does not give the desired result. Has anyone an idea?

share|improve this question

3 Answers 3

up vote 2 down vote accepted

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.}}} *)
share|improve this answer

I suggest redefining your MyBarCharts to take additional options as:

MyBarCharts[list_, options:OptionsPattern[]] := 
    BarChart[list, Frame -> {{True, None}, {True, None}}, options]

Then you can supply a plot range that's the same for both as:

MyBarCharts[data1, PlotRange -> {All, {0, 75}}]
MyBarCharts[data2, PlotRange -> {All, {0, 75}}]
share|improve this answer
1  
I'd change options___ to options:OptionsPattern[] as it is clearer in intent. –  rcollyer Mar 19 '12 at 15:05
    
I want Mathematica to define its own "global" plot range, as I have to plot hundreds of histograms. –  John Mar 24 '12 at 17:10
    
It's relatively easy to work out what the PlotRange will be for bar charts. E.g. data = {{-2, -3}, {-5, -6}, {-7, -8}, {-9, -10}}; BarChart[data, PlotRange -> {{0, Length@Flatten@data + 1}, {Min@{data, 0}, Max@{data, 0}}}] –  Chris Degnen Jun 10 '12 at 10:44

Similar to R.M's answer I suggest that you implement a set of custom options for MyBarCharts. You can then use SetOptions to define defaults for your function, pass BarChart options to your function, etc. I described in some detail how to do this here:

Create a Function with Customized Options

See this question for the context of that answer.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.