可以删除BarChart Legend上的框架边框吗?

Ver*_*eia 7 charts wolfram-mathematica bar-chart

我正在为Mathematica中的各种绘图/图表绘制创建一个应用程序.最终它将具有GUI,但第一步是使代码正确,并且足够简单以便GUI进行管理.我很难设置传说,周围没有框架.

这是一个最小的例子(有一些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]]
Run Code Online (Sandbox Code Playgroud)

这就是我得到的: 在此输入图像描述

尽我所能,我无法摆脱传说中的边界.你可以看到LegendAppearance它什么也没做 - 我也尝试过其他一些方法.

我不愿意手工编写小矩形代码,因为在最终的GUI中很难做到这一点.ChartLabels也不会工作,因为它已经被用于图表真实版本中的日期标签.

有没有人有什么建议?

Sim*_*mon 10

我找不到任何关闭框架的选项.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"]
Run Code Online (Sandbox Code Playgroud)

与框架

bc /. Labeled[g_, Framed[leg_], pos_] :> Labeled[g, leg, pos]
Run Code Online (Sandbox Code Playgroud)

删除框架

以上还可以使用产生Replace[bc, Framed[leg_] :> leg, {1}]MapAt[Apply[Identity, #] &, bc, 2]或类似结构.如果您有更多标签或不同类型的图形对象,则修改代码不会花费太多.

  • @Simon.(小点).添加选项`FrameStyle-> None`似乎也有效.您的方法可用于对图例外观进行非常精细的控制.例如:`bc /.标签[g_,Framed [leg_],pos_]:>标签[g,框架[腿,FrameStyle - >无,RoundingRadius - > 10,背景 - >黄色],pos..谢谢. (2认同)

Mr.*_*ard 8

您可以通过设置临时,全局杀死帧:

SetOptions[Legending`GridLegend, Legending`LegendContainer -> Identity]
Run Code Online (Sandbox Code Playgroud)

要恢复默认行为,请设置:

SetOptions[Legending`GridLegend, Legending`LegendContainer -> Automatic]
Run Code Online (Sandbox Code Playgroud)