如何摆脱Mathematica中ArrayPlot的灰色边界?

时间:2011-12-31 17:43:26

标签: wolfram-mathematica plot

我有以下情节。

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]]]

enter image description here

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

2 个答案:

答案 0 :(得分:4)

这不是使用内置选项(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,除了在外边界处绘制网格,并覆盖第二个ArrayPlot,其中White单元格设置为透明,并绘制{{ 1}}外边界上的网格线(用于掩盖从前一个图中伸出的位)。

您可以将上述功能称为

White

,输出为:

enter image description here

答案 1 :(得分:3)

如果只是抛弃网格线和网格线并使用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}]}]

enter image description here

这显然特定于此数据列表,但可以直接推广到您拥有" 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}]}]

  ]