Можно ли удалить рамку на легенде BarChart?

Я создаю приложение для различных видов рисования графиков в 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]]

И вот что я получаю:

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

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

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

3 ответа

Решение

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

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

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

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

Я не могу найти какие-либо варианты, чтобы выключить кадр. Документация для 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"]

с рамкой

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

со снятой рамкой

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

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

С помощью Part, где bc как определено в ответе Саймона:

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

дающий

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