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}]
В реальном примере в легенде есть еще несколько записей (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}]