Wolfram mathematica 如何去除Mathematica中ArrayPlot的灰色边界?

Wolfram mathematica 如何去除Mathematica中ArrayPlot的灰色边界?,wolfram-mathematica,plot,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,

我有下面的情节

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


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

这不是使用内置选项(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
单元格设置为透明,并在外部边界上绘制
White
网格线(以屏蔽上一个绘图中突出的位)

您可以根据需要调用上述函数

gridArrayPlot[lst,MeshStyle -> Directive[AbsoluteThickness[3.],Gray,Opacity[0.1]]]
输出为:


直接将网格线和网格线挖沟,然后使用
Epilog
Line

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行和列列表)的数据


你的问题我不太清楚。我已将您的代码输出上载到您的问题。根据我对您的问题re的理解:“仅显示白色正方形的灰色边界/网格”,输出看起来是正确的。黑色方块没有灰色边界。您是否有其他想法,或者您是否得到了不同的输出?或者你指的是最外面的灰色边界?@yoda:你仍然可以看到黑色方块边界的阴影,是吗?我现在看到了。一开始它并不明显(可能是因为我的显示器),但把它换成更亮的颜色显示出来了。这可能并不简单,因为
Grid
s总是在绘制完图形的其余部分之后进行分层。有一个未记录的选项来解决这个问题,但我现在似乎记不起来了。让我搜索…@yoda,我想您正在寻找
方法->{“GridLinesInFront”->True}
网格线的子选项?我认为,无论使用哪一种(
Mesh
GridLines
),解决方案都需要为
MeshStyle
GridLinesStyle
使用相邻单元格中的数据值为每个网格/网格线的线段着色的自定义样式功能。确实不简单…@kguler是的,我发现了,但那也不起作用。我在下面有一个自定义解决方案,这是目前一个合理的解决方案。
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}]}]

  ]