Mathematica: Могу ли я сопоставить легенду BarChart со сложенными барами?

Мне бы хотелось, чтобы вертикальное расположение цветов в столбцах сгруппировалось в соответствии с расположением цветов в легенде диаграммы. Но что бы я ни старался, они не совпадают. Вот ситуация

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}]

Chart1

В реальном примере в легенде есть еще несколько записей (6), поэтому было бы хорошо, если бы порядок цветов легенды соответствовал порядку в столбцах. Я понимаю, что мог бы установить ChartLegends отображать в Bottom, но не выглядит хорошо, учитывая много записей легенды.

Кроме того, изменение списка легенд не работает должным образом. Текст легенд был переупорядочен, но цвета не были переупорядочены (см. Ниже), поэтому подписи к легендам больше не соответствуют данным на диаграмме.

Изменение порядка данных (или данных и элементов легенды) также не работает.

Какие-либо предложения?

3 ответа

Решение
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]

редактировать

Не забудьте использовать FullForm when you want to mess up with Graphics/Chart/Plot internals

Опираясь на хороший ответ, данный Dr. belisarius, альтернативный метод, использующий Part

bc[[2,1,1,1]]= Reverse@bc[[2,1,1,1]];bc

Это может быть выведено из FullForm а также

Position[bc, #, Infinity]& /@ {Framed[___],
Column[___],List[___,"1-Volume",___]}

или от любого из них, возможно, и методом проб и ошибок.

Хотя это не является частью вопроса, трюк Simon(см. Здесь) может быть использован для дальнейшей манипуляции легендой.

bc/.Labeled[g_,Framed[leg_],pos_]:>
Labeled[g,Framed[leg,FrameStyle->Orange,RoundingRadius->10,
Background->LightYellow],pos]

например, дает следующее:

Part может также использоваться для удаления рамки вокруг легенды (см. этот вопрос), но метод Simon гораздо более универсален.

bc[[2]]=bc[[2,1]];bc

Ты можешь использовать LegendContainer за это.

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}]

такой же, как график Велисария

Другие вопросы по тегам