Исправление пропорций кругового графика с помощью matplotlib.patches - PullRequest
0 голосов
/ 15 сентября 2018

Я использую 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()

image

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

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

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

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

0 голосов
/ 15 сентября 2018

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

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

с правильным желаемым значением, как показано ниже.

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

ax.set_aspect('equal')

Выход

enter image description here

...