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()