В Matplotlib, как вы добавляете объект Imagedraw в PyPlot? - PullRequest
1 голос
/ 23 мая 2011

Мне нужно добавить фигуру к существующему изображению, сгенерированному с помощью pyplot (plt).Лучший из известных мне способов быстрой генерации базовых фигур - это использование предопределенных фигур в Imagedraw.Исходные данные имеют точки с соответствующими цветами в line_holder и colorholder.Мне нужно добавить ограничивающий прямоугольник (или, в данном случае, эллипс) к графику, чтобы пользователю было ясно, находятся ли данные в приемлемом диапазоне.

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from PIL import Image
...
lines = LineCollection(mpl.line_holder, colors=mpl.colorholder , linestyle='solid')
plt.axes().add_collection(lines)
plt.axes().set_aspect('equal', 'datalim')
plt.axes().autoscale_view(True,True,True)
plt.draw()
plt.show()

Я попытался вставить это перед показом ():

image = Image.new('1',(int(ceil(disc/conv))+2,int(ceil(disc/conv))+1), 1)
draw = ImageDraw.Draw(image)
box=(1, 1, int(ceil(disc/conv)), int(ceil(disc/conv))) #create bounding box
draw.ellipse(box, 1, 0) #draw circle in black

, но я не могу найти способ добавить этот эллипс в кипу.Кто-нибудь знает, как можно собрать изображения вместе?Если невозможно добавить объект imagedraw в pyplot, есть ли хорошие альтернативы для выполнения этого типа операции?

1 Ответ

4 голосов
/ 24 мая 2011

Matplotlib имеет несколько патчей (фигур), которые соответствуют вашим потребностям (и удаляют PIL как зависимость). Они задокументированы здесь . Полезный пример использования фигур: здесь .

Чтобы добавить эллипс к графику, сначала создайте патч эллипса, а затем добавьте этот патч к осям, над которыми вы сейчас работаете. Помните, что круги (или эллипсы с равными второстепенными радиусами) будут выглядеть эллиптическими, если ваше соотношение сторон не равно.

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

Я также заменил вашу линию add_collection () на построение одной линии. По сути, они делают то же самое и позволяют выполнять мой фрагмент как отдельный скрипт.

import matplotlib.pyplot as plt
import matplotlib as mpl

# set up your axes object
ax = plt.axes()
ax.set_aspect('equal', 'datalim')
ax.autoscale_view(True, True, True)

# adding a LineCollection is equivalent to plotting a line
# this will run as a stand alone script
x = range(10)
plt.plot( x, x, 'x-')

# add and ellipse to the axes
c = mpl.patches.Ellipse( (5, 5), 1, 6, angle=45)
ax.add_patch(c)

# you can get the current axes a few ways
ax2 = plt.axes()
c2 = mpl.patches.Ellipse( (7, 7), 1, 6, angle=-45, color='green')
ax2.add_patch(c2)

ax3 = plt.gca()
c3 = mpl.patches.Ellipse( (0, 2), 3, 3, color='black')
ax3.add_patch(c3)

print id(ax), id(ax2), id(ax3)

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...