Можно ли удалить границу рамки на легенде BarChart? - PullRequest
7 голосов
/ 16 августа 2011

Я создаю приложение для различных видов рисования графиков / диаграмм в Mathematica.В конечном счете, он будет иметь графический интерфейс, но первый шаг - сделать код правильным и достаточно простым для управления графическим интерфейсом.У меня возникают трудности с установкой легенд, чтобы вокруг них не было рамки.

Вот минимальный пример (некоторые параметры для BarChart уже настроены с использованием SetOptions.

mydata = {4.5644, 5.546, 6.8674, 2.7688, 1.742, 5.3952, 4.3392, 4.5016, \
 3.7748, 1.838, 2.24, 0.693, 2.818, 4.9, 3.939, 3.459, 3.755, 4.475, \
 3.857, 3.215, 2.206, 2.206, 2.117, 3.403, 3.277, 3.761, 4.276, 2.559, \
 3.486, 4.778, 2.281, 2.865, 3.629, 4.916, 4.572, 5.244, 5.395, 2.865, \
 -0.524, 5.01, 4.401, 4.513, 4.54}

BarChart[mydata, 
 ChartStyle -> {Join[
  Table[RGBColor[0.5, 0.5, 0.95], {Length[mydata] - 3}], {Magenta,
   Magenta, Magenta}]}, PlotRange -> {-2, 8}, 
 ChartLegends -> {Join[
  Table[None, {Length[mydata] - 3}], {Placed[
   Style["Forecasts", FontFamily -> "Arial", FontSize -> 18], 
   Bottom]}]}, BarSpacing -> 0.4, 
 LegendAppearance ->  Directive[Background -> Red, 
   Frame -> None, ImageSize -> 15]]

А здесьвот что я получаю: enter image description here

Как ни старайся, я не могу избавиться от этой границы вокруг легенды. Вы можете видеть, что LegendAppearance ничего не делает - я пробовал несколько других подходовк этому тоже.

Я не хочу кодировать маленькие прямоугольники вручную, потому что это будет очень трудно сделать правильно в конечном графическом интерфейсе. ChartLabels тоже не сработает, потому что это ужеиспользуется для меток даты в реальной версии графика.

У кого-нибудь есть предложения?

Ответы [ 3 ]

10 голосов
/ 16 августа 2011

Я не могу найти какие-либо варианты, чтобы выключить кадр.Документация для LegendAppearance довольно минимальна, а оформление легенд вообще не вызывает большого обсуждения (см. [ 2 ] и ссылки внутри).

Самое простое решениеЯ могу думать о том, чтобы вручную изменить графику.Графики с легендами производят Помеченные графические объекты.Для отдельной легенды созданный объект Labeled выглядит как Labeled[Graphics[...], Framed[...], pos], поэтому все, что вам нужно сделать, это удалить часть Framed.Это можно сделать, просто удалив все Framed головы, используя ReplaceAll (например, BarChart[...] /. Framed -> Identity), но, возможно, что-то более целевое было бы безопаснее.

mydata = {4.5644, 5.546, 6.8674, 2.7688, 1.742, 5.3952, 4.3392, 
   4.5016, 3.7748, 1.838, 2.24, 0.693, 2.818, 4.9, 3.939, 3.459, 
   3.755, 4.475, 3.857, 3.215, 2.206, 2.206, 2.117, 3.403, 3.277, 
   3.761, 4.276, 2.559, 3.486, 4.778, 2.281, 2.865, 3.629, 4.916, 
   4.572, 5.244, 5.395, 2.865, -0.524, 5.01, 4.401, 4.513, 4.54};

bc = BarChart[{Legended[Style[mydata[[;; -4]], Red], "Data"], 
   Legended[Style[mydata[[-3 ;;]], Blue], "Forecasts"]}, 
  PlotRange -> {-2, 8}, BarSpacing -> 0.4, LegendAppearance -> "Row"]

with frame

bc /. Labeled[g_, Framed[leg_], pos_] :> Labeled[g, leg, pos]

with frame removed

Вышесказанное также может быть получено с использованием Replace[bc, Framed[leg_] :> leg, {1}] или MapAt[Apply[Identity, #] &, bc, 2] или аналогичных конструкций.Изменение кода не займет много времени, если у вас есть больше меток или различных типов графических объектов.

8 голосов
/ 16 августа 2011

Вы можете временно, глобально убить кадр, установив:

SetOptions[Legending`GridLegend, Legending`LegendContainer -> Identity]

Чтобы восстановить поведение по умолчанию, установите:

SetOptions[Legending`GridLegend, Legending`LegendContainer -> Automatic]
3 голосов
/ 20 сентября 2011

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

Использование Part, где bc такое, как определено в ответе Саймона :

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

дача

enter image description here

...