Можно ли удалить границу рамки в легенде 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 тоже не сработает, потому что он уже используется для меток дат в реальной версии графика.

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


person Verbeia    schedule 16.08.2011    source источник


Ответы (3)


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

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

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

SetOptions[Legending`GridLegend, Legending`LegendContainer -> Automatic]
person Mr.Wizard    schedule 16.08.2011
comment
+1: извините, я дома болен и только что проверил, работает ли это. Он работает на v8, и я могу включить его в пакет по умолчанию. Спасибо! - person Verbeia; 17.08.2011
comment
Очень, очень интересно: ?Legending'* (где эта кавычка является обратной кавычкой) дает целую кучу недокументированных фрагментов. - person Verbeia; 17.08.2011
comment
@Verbeia спасибо за подтверждение того, что это работает, и я надеюсь, что это будет полезно. Простите меня, если я прозвучал нетерпеливо. Я не был. Скорее, рабочее решение обычно получает по крайней мере один голос через восемь часов, поэтому я подумал, что, возможно, эта недокументированная опция была удалена в версии 8. (Кстати, я думаю, что вы можете встроить обратную кавычку, используя двойные обратные кавычки для блока кода. Позвольте мне попробуй: ?Legending`*) - person Mr.Wizard; 17.08.2011
comment
+1 за обратную галочку, и не волнуйтесь, сочетание разницы часовых поясов и относительно небольшого числа пользователей означает, что иногда какое-то время ничего не происходит. Мне трудно найти вопросы, на которые еще нет хороших ответов, потому что большинство вопросов задают, когда в Австралии пора спать. - person Verbeia; 17.08.2011

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

Самое простое решение, которое я могу придумать, это вручную изменить графику. Диаграммы с легендами создают графические объекты Labeled. Для одной легенды созданный объект 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] или подобных конструкций. Код не займет много времени, если у вас больше меток или различных типов графических объектов.

person Simon    schedule 16.08.2011
comment
+1 Я собирался предложить то же решение, но ваше более полное. Название LegendAppearance предполагает больше, чем то, что оно делает на практике. - person Sjoerd C. de Vries; 16.08.2011
comment
+1 - спасибо, Саймон, второй пример (с использованием /. Labeled[g_, Framed[leg_], pos_] :> Labeled[g, leg, pos]) делает именно то, что должен, даже если в самом сюжете есть Frame. Будет интересно разобраться в общем случае и посмотреть, можно ли это сделать в графическом интерфейсе. - person Verbeia; 16.08.2011
comment
@Simon InputForm[bc], за которым, возможно, следует (InputForm[bc /. {Framed[legend_] :> legend}])[[1]], помогает понять, почему ваше решение работает. [[1]] удаляет оболочку InputForm[]. - person DavidC; 16.08.2011
comment
@David: правила замены (и Map, Apply и т. д.) всегда действуют на FullForm выражения. Но да, я использовал InputForm[bc], чтобы увидеть, что происходит, чтобы построить свой ответ. @Sjoerd Спасибо за редактирование! - person Simon; 16.08.2011
comment
@Саймон. (Незначительный момент). Добавление опции FrameStyle-> None также работает. Ваш метод можно использовать для довольно тонкого управления внешним видом легенды. Например: bc /. Labeled[g_, Framed[leg_], pos_] :> Labeled[g, Framed[leg, FrameStyle -> None, RoundingRadius -> 10, Background -> Yellow], pos]. Спасибо. - person tomd; 16.08.2011
comment
Ответы Саймона и @MrWizard верны, а ответ Саймона более гибкий. Но недокументированные параметры Legending — это именно то, что мне нужно, чтобы сделать это общим для всего приложения. - person Verbeia; 17.08.2011

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

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

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

давать

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

person tomd    schedule 20.09.2011