我有以下情节。
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]]]
但它看起来并不像我预期的那样,我希望黑色方块的灰色边界/网格被这些黑色方块的颜色所掩盖。仅显示白色方块的灰色边界/网格。
答案 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
,输出为:
答案 1 :(得分:3)
如果只是抛弃网格线和网格线并使用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行和列列表)。
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}]}]
]