2011-12-31 4 views
4

У меня есть следующий сюжет.Как избавиться от серых границ для ArrayPlot в Mathematica?

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

Но это не выглядит, как я и ожидал, в котором я хочу серые границы/сетки для черных квадратов, чтобы быть в тени цвета этих черных квадратов. Показывать только серые границы/сетки белых квадратов.

+0

Ваш вопрос не очень ясен для меня. Я загрузил вывод вашего кода на ваш вопрос. Из моего понимания вашего вопроса re: «Показывать только серые границы/сетки белых квадратов». Результат выглядит правильно. Черных квадратов нет серых границ. У вас было что-то еще, или вы получаете другой результат? Или вы имели в виду внешнюю серую границу? – abcd

+0

@yoda: Вы все еще можете видеть некоторые тени границ для черных квадратов, не так ли? –

+0

Я вижу это сейчас. Сначала это было не очевидно (вероятно, из-за моего монитора), но это изменило его на более яркий цвет. Это может быть не просто, потому что 'Grid' всегда кладут _after_, остальные рисунки рисуются. Существует недокументированный вариант, чтобы обойти это, но я, похоже, не помню его прямо сейчас. Позвольте мне искать ... – abcd

ответ

4

Это не то, что можно легко решить с помощью встроенных опций (AFAIK). Вы можете определить пользовательскую функцию, которая отображает линии сетки только в тех строках и столбцах, которые вам нужны, и маскирует другие. Вот мое решение:

gridArrayPlot[mat_?MatrixQ, options___] := Module[{dim = [email protected]}, 
    Show[ 
    ArrayPlot[mat, Mesh -> ({Range[#1 - 1], Range[#2 - 1]} & @@ dim), options], 
    ArrayPlot[mat, Mesh -> ({{0, #1}, {0, #2}} & @@ dim), 
     ColorRules -> {0 -> Directive[[email protected], 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

Как насчет канав линий сетки и сетки линий и используя Epilog и Line?

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

enter image description here

Это, очевидно, специфическое для данного списка данных, но прямо вперед обобщить данные, где у вас есть «х» единица черный «периметр» и «у» раз «Y» белый квадрат (т. е. список строк и столбцов y + 2x).

gridArrayPlot[mat_?MatrixQ] := Module[{dim = [email protected]@mat, 
    white = [email protected][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], 
    [email protected][{{left + i, right}, {left + i, black}}, {i, 0, grid}], 
     [email protected][{{black, left + i}, {right, left + i}}, {i, 0, grid}]}] 

    ] 
Смежные вопросы