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

时间:2011-08-16 06:06:34

标签: 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]]

以下是我得到的: enter image description here

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

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

有人有任何建议吗?

3 个答案:

答案 0 :(得分: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"]

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]或类似结构制作。如果您有更多标签或不同类型的图形对象,则修改代码不会花费太多。

答案 1 :(得分:8)

您可以通过设置:

暂时全局杀死帧
SetOptions[Legending`GridLegend, Legending`LegendContainer -> Identity]

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

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

答案 2 :(得分:3)

不像[{3}}给出Simon的方法那样多才多艺,但仍然值得张贴。 (我在阅读above问题时发现了这个问题)

使用Part,其中bc与Simon this中定义的一样:

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

enter image description here