I would like to have the vertical arrangement of colors in stacked bars match the arrangement of colors in the chart legend. But no matter what I try, they don't match. Here's the situation
BarChart[{{5, 37, 56}, {22, 49, 28}, {31, 60, 10}},
ChartLayout -> "Percentile",
ChartLegends -> Placed[{"1-Volume", "2-Area", "3-Length"}, Right],
ChartLabels -> {{"Before", "During", "After"}, None}]
In the real-world example the legend has quite a few more entries (6), so it would be nice if the order of the legend colors matched the order in the bars. I realize that I could set the ChartLegends
to display at Bottom
, but doesn't look good given the many legend entries.
Also, reversing the Legends list does not work as desired. The text of the legends was re-ordered, but the colors were not reordered (see below), so the legend captions no longer match the data in the chart.
Changing the order of the data (or the data and the legend items) does not work either.
Any suggestions?
BarChart is also known as a bar graph or column graph. A bar chart shows the values in a dataset as equal-width rectangular bars with lengths corresponding to the values.
A bar chart shows the values in a dataset as equal-width rectangular bars with lengths corresponding to the values. By default, the bars are vertical, but horizontal bars can also be used. Bar charts are typically used when the data is relatively small.
BarChart is also known as a bar graph or column graph. A bar chart shows the values in a dataset as equal-width rectangular bars with lengths corresponding to the values. By default, the bars are vertical, but horizontal bars can also be used.
BarChart[{{5, 37, 56}, {22, 49, 28}, {31, 60, 10}},
ChartLayout -> "Percentile",
ChartLegends -> {"1-Volume", "2-Area", "3-Length"},
ChartLabels -> {{"Before", "During", "After"}, None}] /.
Column[List[a : Grid[List[___]] ..]] :> Column[Reverse@List@a]
Edit
Remember to use FullForm
when you want to mess up with Graphics/Chart/Plot internals
Building on the nice answer given by Belisarius, an alternative method using Part
bc[[2,1,1,1]]= Reverse@bc[[2,1,1,1]];bc
This may be inferred from FullForm
and
Position[bc, #, Infinity]& /@ {Framed[___],
Column[___],List[___,"1-Volume",___]}
or from any one of these, perhaps, and trial-and-error.
Although not part of the question, Simon's trick (see here) may be used to further manipulate the legend.
bc/.Labeled[g_,Framed[leg_],pos_]:>
Labeled[g,Framed[leg,FrameStyle->Orange,RoundingRadius->10,
Background->LightYellow],pos]
for example, gives the following:
Part
may also be used to remove the frame around the legend (see this question)
but Simon's method is much more versatile.
bc[[2]]=bc[[2,1]];bc
You can use LegendContainer
for this.
SetOptions[Legending`GridLegend,
Legending`LegendContainer -> (Framed@MapAt[Reverse, #, {1, 1}] &)];
BarChart[{{5, 37, 56}, {22, 49, 28}, {31, 60, 10}},
ChartLayout -> "Percentile",
ChartLegends -> {"1-Volume", "2-Area", "3-Length"},
ChartLabels -> {{"Before", "During", "After"}, None}]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With