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

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

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, но выглядит не очень хорошо, учитывая множество записей легенды.

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

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

Есть предложения?

enter image description here

Ответы [ 3 ]

10 голосов
/ 20 сентября 2011
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]

enter image description here

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

Не забывайте использовать FullForm, если вы хотите испортить внутреннюю графику / диаграмму / график

6 голосов
/ 20 сентября 2011

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

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

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

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

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

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

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

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

enter image description here

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

bc[[2]]=bc[[2,1]];bc
2 голосов
/ 19 октября 2011

Для этого вы можете использовать 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}]

same as belisarius' graph

...