-4

Есть код к решению задачи:

Составьте программу для получения на экране произвольного изображения, содержащего линии, прямоугольники, окружности, эллипсы, многоугольники. Выполнить закрашивание некоторых из полученных замкнутых областей. Предусмотрите вывод текста.

Код:

import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
# Линии
ax.plot([0, 1], [0, 1], 'r-', linewidth=2) # Красная линия
ax.plot([1, 0], [0, 1], 'g--', linewidth=2) # Зеленая пунктирная
# Прямоугольник
rect = plt.Rectangle((0.2, 0.2), 0.3, 0.4, color='blue', alpha=0.5)
ax.add_patch(rect)
# Окружность
circle = plt.Circle((0.7, 0.5), 0.1, color='purple', fill=True)
ax.add_patch(circle)
# Эллипс
ellipse = plt.Ellipse((0.4, 0.7), 0.2, 0.1, color='orange')
ax.add_patch(ellipse)
# Многоугольник
polygon = plt.Polygon([[0.5, 0.2], [0.6, 0.4], [0.7, 0.2]], color='cyan')
ax.add_patch(polygon)
# Текст
ax.text(0.3, 0.9, 'Научная графика', fontsize=12, color='black')
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_xticks([])
ax.set_yticks([])
plt.show()

Выдает ошибку:

ellipse = plt.Ellipse((0.4, 0.7), 0.2, 0.1, color='orange')
 ^^^^^^^^^^^ 
AttributeError: module 'matplotlib.pyplot' has no attribute 'Ellipse' 
strawdog
27.6k4 золотых знака24 серебряных знака36 бронзовых знаков
задан 10 февр. 2025 в 17:39
2
  • Уже вижу ошибку в самой первой строке: отступ. Текст ошибки можно было бы и показать. Здесь не телепаты. Зачем тут модуль numpy? Использование matplotlib не запрещено, но выглядит слишом заумно. Произвольность изображения тоже вызывает сомнения. Теперь по поводу "ничего не работает". Это кусок программы в лучшем случае, а не автономный исполняемый скрипт. Commented 10 февр. 2025 в 17:51
  • 1
    ellipse = plt.Ellipse((0.4, 0.7), 0.2, 0.1, color='orange') ^^^^^^^^^^^ AttributeError: module 'matplotlib.pyplot' has no attribute 'Ellipse' Commented 10 февр. 2025 в 18:06

2 ответа 2

4

matplotlib 3.7.2

Модуль pyplot библиотеки matplotlib импортирует и делает доступными через точку только четыре геометрические фигуры из модуля patches: Polygon, Rectangle, Circle, Arrow. Все остальные нужно импортировать самостоятельно:

from matplotlib.patches import Ellipse
plt.gca().add_patch(Ellipse((0.4, 0.7), 0.2, 0.1, color='orange'))

Здесь:

  • plt.gca() - взять текущую систему координат
  • add_patch - добавить геометрическую фигуру в систему координат

p.s. В версии 3.10.x ситуация в целом не изменилась. Добавлено лишь дополнительное импортирование на случай проверки типов, что не играет роли при штатном использовании библиотеки.

ответ дан 10 февр. 2025 в 18:35
8
  • "...импортирует и делает доступными через точку только четыре геометрические фигуры из модуля patches..." - ? Commented 10 февр. 2025 в 20:06
  • 1
    @FoxFox Это вопрос или предложение улучшить формулировку? Если второе, буду рад услышать ваш вариант. Commented 10 февр. 2025 в 20:08
  • Вы очень уверенно заявили, что только четыре фигуры... Ниже мой пример, там уже 5. Я посмотрел документацию, там похоже ещё больше. Commented 10 февр. 2025 в 20:19
  • 1
    @FoxFox В модуше patches больше чем 5 объектов. Речь идет о тех, которые представлены непосредственно в pyplot и могут быть извлечены как pyplot.Something. Таких было и пока остается 4. Commented 10 февр. 2025 в 20:45
  • 1
    @FoxFox Да, это об одном и том же: pyplot - это модуль. Внутри модуля есть строка импорта классов из модуля patches, благодаря которой мы можем использовать их напрямую, например pyplot.Rectangle вместо matplotlib.patches.Rectangle. Commented 10 февр. 2025 в 20:57
0

Вот пример:

import matplotlib.pyplot
import matplotlib.patches
# Создаем фигуру и оси
fig, ax = matplotlib.pyplot.subplots()
# Добавляем эллипс
ellipse = matplotlib.patches.Ellipse((0.5, 0.5), width=0.4, height=0.2, angle=0, edgecolor='r', facecolor='yellow')
ax.add_patch(ellipse)
# Добавляем окружность
circle = matplotlib.patches.Circle((0.3, 0.7), radius=0.1, edgecolor='b', facecolor='blue')
ax.add_patch(circle)
# Добавляем треугольник
triangle = matplotlib.patches.Polygon([[0.6, 0.2], [0.8, 0.2], [0.7, 0.4]], edgecolor='g', facecolor='green')
ax.add_patch(triangle)
# Добавляем прямоугольник
rectangle = matplotlib.patches.Rectangle((0.1, 0.1), width=0.2, height=0.3, edgecolor='purple', facecolor='pink')
ax.add_patch(rectangle)
# Добавляем шестиугольник
hexagon = matplotlib.patches.RegularPolygon((0.8, 0.8), numVertices=6, radius=0.1, edgecolor='orange', facecolor='cyan')
ax.add_patch(hexagon)
# Устанавливаем лимиты осей
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
# Показываем диаграмму
matplotlib.pyplot.show()
ответ дан 10 февр. 2025 в 18:47

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.