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

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

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

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

введите здесь описание изображения


person DavidC    schedule 19.09.2011    source источник


Ответы (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, если вы хотите запутаться с внутренними элементами графики/диаграммы/графика.

person Dr. belisarius    schedule 19.09.2011
comment
Боже мой. Я бы никогда не подумал сделать это. Итак, вы изменили порядок легенд после выполнения команды BarChart? - person DavidC; 20.09.2011
comment
@David Попробуйте следующее Barchart[ ....] // FullForm и посмотрите на команду Column почти в конце :) - person Dr. belisarius; 20.09.2011
comment
Это очень поучительно. Спасибо. - person DavidC; 20.09.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]

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

введите здесь описание изображения

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

bc[[2]]=bc[[2,1]];bc
person tomd    schedule 20.09.2011
comment
Хорошо сделано! Я не понимал, как глубоко можно проникнуть во внутренности диаграммы. Моя легенда выглядит очень большой. Я думаю, что я был в режиме презентации; это повлияло на размер шрифта легенды, а не на другие шрифты. Кстати, приятно подтолкнуть вас к более чем 2k. - person DavidC; 20.09.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}]

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

person Mr.Wizard    schedule 19.10.2011
comment
@ Дэвид, спасибо. См. мое другое использование этого здесь< /а>. - person Mr.Wizard; 21.10.2011