【问题标题】:How do I get rid of gray boundaries for ArrayPlot in Mathematica?如何摆脱 Mathematica 中 ArrayPlot 的灰色边界?
【发布时间】:2012-01-01 23:08:13
【问题描述】:

我有以下情节。

lst={{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 
  0, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 
  0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 
  1}, {1, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1}};
ArrayPlot[lst, Mesh -> All, 
 MeshStyle -> Directive[AbsoluteThickness[3.], Gray, Opacity[0.1]]]

但它看起来不像我预期的那样,我希望黑色方块的灰色边界/网格被这些黑色方块的颜色所掩盖。仅显示白色方块的灰色边界/网格。

【问题讨论】:

  • 你的问题对我来说不是很清楚。我已将您的代码输出上传到您的问题。根据我对您的问题的理解:“仅显示白色方块的灰色边界/网格。”,输出看起来正确。黑色方块没有灰色边界。您是否有其他想法,或者您是否获得了不同的输出?还是您的意思是最外面的灰色边框?
  • @yoda:你仍然可以看到黑色方块边界的一些阴影,不是吗?
  • 我现在看到了。起初它并不明显(可能是因为我的显示器),但将其更改为更亮的颜色就显露出来了。这可能并不简单,因为Grids 总是放置在 绘制完图形的其余部分之后。有一个未记录的选项可以解决此问题,但我现在似乎不记得了。让我搜索...
  • @yoda,我想您正在寻找Method->{"GridLinesInFront"->True}GridLines 子选项?我认为无论使用哪一个(MeshGridLines),该解决方案都需要为MeshStyleGridLinesStyle 使用自定义样式函数,该函数使用相邻单元格中的数据值来为段着色每个网格/网格线。确实不简单......
  • @kguler 是的,我发现了,但这也没有用。我有一个自定义解决方案,目前这是一个合理的解决方法。

标签: wolfram-mathematica plot


【解决方案1】:

这不是使用内置选项 (AFAIK) 可以轻松解决的问题。您可以定义一个自定义函数,该函数仅在您需要的那些行和列处绘制网格线并屏蔽其他的。这是我的解决方案:

gridArrayPlot[mat_?MatrixQ, options___] := Module[{dim = Dimensions@mat},
  Show[
    ArrayPlot[mat, Mesh -> ({Range[#1 - 1], Range[#2 - 1]} & @@ dim), options],
    ArrayPlot[mat, Mesh -> ({{0, #1}, {0, #2}} & @@ dim), 
       ColorRules -> {0 -> Directive[Opacity@0, White]}, 
       options /. Opacity[_] :> Opacity[1] /. (RGBColor[___] | GrayLevel[_]) :> White
    ]
  ]
]

上述解决方案首先绘制ArrayPlot,在除外边界之外的所有位置绘制网格,并覆盖第二个ArrayPlotWhite 单元格设置为透明,并在外部绘制White 网格线边界(以掩盖从前一个图中突出的位)。

你可以把上面的函数调用为

gridArrayPlot[lst,MeshStyle -> Directive[AbsoluteThickness[3.],Gray,Opacity[0.1]]]

输出是:

【讨论】:

    【解决方案2】:

    放弃网格线和网格线并使用EpilogLine 怎么样?

    ArrayPlot[lst, Mesh -> False, Frame -> False, 
     Epilog -> {GrayLevel[0.5], AbsoluteThickness[1], 
       Line@Table[{{2 + i, 8}, {2 + i, 1}}, {i, 0, 5}], 
       Line@Table[{{1, 2 + i}, {8, 2 + i}}, {i, 0, 5}]}]
    

    这显然是特定于该数据列表的,但可以直接概括为具有“x”单位黑色“周长”和“y”乘以“y”白色正方形的数据(即 y+2x 行列表和列)。

    gridArrayPlot[mat_?MatrixQ] := Module[{dim = First@Dimensions@mat, 
      white = Length@Cases[mat, {__, 0 .., __}], black, left, right, grid},
    
      black = (dim - white)/2;
      left = black + 1;
      right = dim - black;
      grid = white - 2;
    
      ArrayPlot[mat, Mesh -> False, Frame -> False, 
       Epilog -> {GrayLevel[0.5], AbsoluteThickness[1], 
         Line@Table[{{left + i, right}, {left + i, black}}, {i, 0, grid}],
          Line@Table[{{black, left + i}, {right, left + i}}, {i, 0, grid}]}]
    
      ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 2022-06-20
      • 1970-01-01
      • 2023-02-04
      • 2011-09-15
      相关资源
      最近更新 更多