Я использую matplotlib.patches для создания круга. Однако полученный круг визуально не является круглым. Похоже на эллипс. Вероятно, это связано с некоторыми настройками соотношения сторон, которые я не могу понять с помощью патчей. Как я могу получить визуально круглый круг с модулем matplotlib.patches?

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.path as mpath
import matplotlib.lines as mlines
import matplotlib.patches as mpatches
from matplotlib.collections import PatchCollection

fig, ax = plt.subplots()
grid = np.mgrid[0.2:0.8:3j, 0.2:0.8:3j].reshape(2,-1).T

patches = []

circle1 = mpatches.Circle(grid[4], 0.25, linestyle='-.', fill=False)

ax.add_patch(circle1)

ax.grid(color='r', linestyle='-.', linewidth=1)

# plt.subplots_adjust(left=0.1, bottom=0.1, right=0.5, top=0.5,
#                 wspace=0.1, hspace=0.1)
# plt.tight_layout()
plt.show()

1
100rabh 15 Сен 2018 в 02:28

2 ответа

Лучший ответ

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

fig, ax = plt.subplots(figsize=(6,6))

С правильным желаемым выходом, как показано ниже.

В качестве альтернативы вы также можете использовать следующую строку кода (поместите в любом месте после определения ax и перед отображением), чтобы сделать такое же соотношение сторон, как

ax.set_aspect('equal')

< Сильный > Выход

enter image description here

0
Sheldore 14 Сен 2018 в 23:34

Если вы хотите, чтобы круг в координатах данных выглядел круглым в координатах экрана, вам необходимо установить одинаковое соотношение сторон осей.

Вы можете выбрать

ax.set_aspect("equal")

Чтобы оси масштабировались.

enter image description here

Или вы можете выбрать

ax.set_aspect("equal", adjustable="datalim")

Чтобы данные масштабировались

enter image description here

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

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.scatter([.5], [.5], s=10000, edgecolor="k", facecolor="none")
ax.grid(color='r', linestyle='-.', linewidth=1)
ax.axis([0,1,0,1])

plt.show()

enter image description here

1
ImportanceOfBeingErnest 14 Сен 2018 в 23:42