Выборочные шаблоны с Matplotlib imshow

Есть ли способ разместить пользовательские шаблоны в выбранных областях на графике imshow? Чтобы быть точным, мне нужно сделать так, чтобы в дополнение к цветным квадратам, несущим числовые данные, у меня также были разные рисунки в других квадратах, указывающие разные режимы неудачи для эксперимента (а также генерировать ключ, объясняющий значение этих разные модели). Примером шаблона, который был бы полезен, были бы различные типы штриховок. Я должен быть в состоянии сделать это, не нарушая основных цветовых и числовых данных на графике.

Ниже приведен код моей попытки использовать то, что было предложено в ответах. Если я прокомментирую раздел об ошибке, imshow будет хорошо отображаться с пробелами, где нет данных от маскировки. Я даже не пытаюсь сделать разные виды перекрестной штриховки для разных типов ошибок или иметь дело со случаями, когда симуляция или эксперимент работали, но другие пока не работали.

РЕДАКТИРОВАТЬ 3: Я получаю сообщения об ошибках из пакета многопроцессорной обработки о том, как он "не может засолить" объект. Благодаря программе эта часть проходит через многопроцессорный пакет. Любой способ исправить это или сделать это без add_patches (метод построения, предложенный ниже, не работает, так как построение графиков происходит по совершенно другой системе координат и рисует соединительные линии)?

import numpy as np
import matplotlib.patches as patches
...
grid = np.ma.array(grid, mask=np.isnan(grid))
plot.imshow(grid, interpolation='nearest', aspect='equal', vmax = private.vmax, vmin = private.vmin)
if show_fail and faildat != []:
    faildat = faildat[np.lexsort((faildat[:,yind],faildat[:,xind]))]
    fails = []
    for i in range(len(faildat)):
        fails.append((faildat[i,1],faildat[i,0]))
    for F in fails:
        p = patches.Rectangle(F,1,1,hatch='/',fill=False)
        plot.add_patch(p)
plot.minorticks_off()
plot.set_xticks(range(len(placex)))        
plot.set_yticks(range(len(placey)))
plot.set_xticklabels(placex)        
plot.set_yticklabels(placey, rotation = 0)
plot.colorbar()
plot.show()

1 ответ

Решение

Есть несколько способов сделать это, что лучше будет зависеть от того, нужно ли отмечать большие области или отдельные пиксели.

Если вам нужно отметить большие области, вы можете сделать это, добавив прямоугольники над изображением:

import matplotlib as mpl
import matplotlib.pyplot as plt

ax = plt.gca()
ax.imshow(rand(50,50))
ax.add_patch(mpl.patches.Rectangle((2,2),20,20,hatch='//////////',fill=False,snap=False))
plt.draw()

Rectangle (doc) множество вариантов хеширования. Это просто добавление дополнительных художников поверх изображения, они никак не повлияют на отображение цветов данных. Большое количество / увеличивает плотность хеш-меток, что может понадобиться для того, чтобы реально увидеть хэширование с небольшими прямоугольниками.

например:

from matplotlib.pylab import * # mostly to get rand()
import matplotlib as mpl
import matplotlib.pyplot as plt

ax = plt.gca()
ax.imshow(rand(50,50),interpolation='nearest')
for i,j in np.floor(50*rand(10,2)).astype('int'):
    ax.add_patch(mpl.patches.Rectangle((i-.5, j-.5), 1, 1, hatch='///////', fill=False, snap=False))

plt.draw()

Если вам просто нужно отметить несколько пикселей здесь, и вам, возможно, удастся сойти с рук, просто построив график (используя plot([x],[y],marker='x') и, возможно, игра с размером маркера).

Другие вопросы по тегам