【问题标题】:Can the frame border on a BarChart Legend be removed?BarChart Legend 上的边框可以去掉吗?
【发布时间】:2011-10-27 19:14:34
【问题描述】:

我正在为 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]]

这是我得到的:

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

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

有人有什么建议吗?

【问题讨论】:

    标签: charts wolfram-mathematica bar-chart


    【解决方案1】:

    我找不到任何关闭相框的选项。 LegendAppearance 的文档非常少,图例的样式通常不会引起太多讨论(请参阅 [2] 和其中的链接)。

    我能想到的最简单的解决方案是手动修改图形。带有图例的图表产生Labeled 图形对象。对于单个图例,生成的 Labeled 对象看起来像 Labeled[Graphics[...], Framed[...], pos],因此您需要做的就是删除 Framed 部分。这可以通过使用ReplaceAll(例如BarChart[...] /. Framed -> Identity)删除所有Framed 头部来完成,但也许更有针对性的东西会更安全。

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

    【讨论】:

    • +1 我正要建议相同的解决方案,但您的解决方案更完整。 LegendAppearance 这个名字所暗示的不仅仅是它在实践中的作用。
    • +1 - 谢谢西蒙,第二个例子(使用/. Labeled[g_, Framed[leg_], pos_] :> Labeled[g, leg, pos])完全符合它的要求,即使情节本身有Frame。解决一般情况并看看是否可以在 GUI 中完成会很有趣。
    • @Simon InputForm[bc],后面可能是(InputForm[bc /. {Framed[legend_] :> legend}])[[1]],有助于阐明您的解决方案为何有效。 [[1]] 删除 InputForm[] 包装器。
    • @David:替换规则(以及MapApply 等)总是作用于表达式的FullForm。但是,是的,我确实使用InputForm[bc] 来查看发生了什么以构建我的答案。 @Sjoerd 感谢您的编辑!
    • @西蒙。 (小点)。添加选项FrameStyle-> None 似乎也有效。您的方法可用于对图例外观进行非常微妙的控制。例如:bc /. Labeled[g_, Framed[leg_], pos_] :> Labeled[g, Framed[leg, FrameStyle -> None, RoundingRadius -> 10, Background -> Yellow], pos]. 谢谢。
    【解决方案2】:

    您可以通过设置暂时、全局地杀死框架:

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

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

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

    【讨论】:

    • +1:抱歉,我生病了,只是检查一下它是否有效。它确实适用于 v8,这是我可以默认放入包中的那种东西。谢谢!
    • 非常非常有趣:?Legending'*(其中引号是反引号)给出了一大堆未记录的点点滴滴。:AssembleLegendContainer ContourLegend Legend LegendImage LegendPane Legends BubbleScaleLegend CurveLegend LegendContainer LegendItemLayout LegendPosition LegendSize ColorGradientLegend GridLegend LegendHeading LegendLayout LegendReap LegendSow
    • @Verbeia 感谢您确认它有效,我希望它会有所帮助。如果我听起来不耐烦,请原谅。我不是。相反,一个可行的解决方案通常在八小时后至少获得一票,所以我认为这个未记录的选项可能已在版本 8 中删除。(顺便说一句,我认为您可以通过对代码块使用双反引号来嵌入反引号。让我试试:?Legending`*)
    • +1 表示反引号,不用担心,时区差异和相对较少的用户群的组合意味着有时一段时间内什么都没有发生。我发现很难找到尚未得到很好回答的问题,因为大多数问题都是在澳大利亚的就寝时间提出的。
    【解决方案3】:

    不像Simon 给出的above 的方法那样通用,但仍然值得发布。 (我在阅读this 问题时发现了这一点)

    使用Part,其中bc 定义在Simon 的answer

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

    给予

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 2011-01-24
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多