Как избавиться от серых границ для ArrayPlot в Mathematica? - PullRequest
4 голосов
/ 31 декабря 2011

У меня есть следующий график.

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 ]

4 голосов
/ 31 декабря 2011

Это не то, что может быть легко решено с помощью встроенных опций (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]]]

и вывод:

enter image description here

3 голосов
/ 01 января 2012

Как насчет того, чтобы просто отбросить линии сетки и линии сетки и использовать 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}]}]

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

  ]
...