построить круг с pyplot - PullRequest
       30

построить круг с pyplot

126 голосов
/ 09 февраля 2012

удивительно, я не нашел прямого описания того, как нарисовать круг с помощью matplotlib.pyplot (пожалуйста, не пилаб), принимая в качестве центра ввода (x, y) и радиуса r.Я попробовал несколько вариантов этого:

import matplotlib.pyplot as plt
circle=plt.Circle((0,0),2)
# here must be something like circle.plot() or not?
plt.show()

... но все равно не получилось.

Ответы [ 6 ]

163 голосов
/ 09 февраля 2012

Вам нужно добавить его к осям.Circle является подклассом Artist, а axes имеет метод add_artist.

Вот пример этого:

import matplotlib.pyplot as plt

circle1 = plt.Circle((0, 0), 0.2, color='r')
circle2 = plt.Circle((0.5, 0.5), 0.2, color='blue')
circle3 = plt.Circle((1, 1), 0.2, color='g', clip_on=False)

fig, ax = plt.subplots() # note we must use plt.subplots, not plt.subplot
# (or if you have an existing figure)
# fig = plt.gcf()
# ax = fig.gca()

ax.add_artist(circle1)
ax.add_artist(circle2)
ax.add_artist(circle3)

fig.savefig('plotcircles.png')

Это приводит кследующий рисунок:

Первый круг находится в начале координат, но по умолчанию clip_on равен True, поэтому круг обрезается, когда он выходит за пределы axes.Третий (зеленый) круг показывает, что происходит, когда вы не обрезаете Artist.Он выходит за пределы осей (но не за пределы фигуры, т. Е. Размер фигуры не автоматически настраивается для построения всех ваших художников).

Единицы для x, y и радиуса соответствуютединицы данных по умолчанию.В этом случае я ничего не рисовал на своих осях (fig.gca() возвращает текущие оси), и, так как ограничения никогда не устанавливались, по умолчанию их значения составляют от 0 до 1.

Вот продолжение примера, показывающее, как важны единицы:

circle1 = plt.Circle((0, 0), 2, color='r')
# now make a circle with no fill, which is good for hi-lighting key results
circle2 = plt.Circle((5, 5), 0.5, color='b', fill=False)
circle3 = plt.Circle((10, 10), 2, color='g', clip_on=False)

ax = plt.gca()
ax.cla() # clear things for fresh plot

# change default range so that new circles will work
ax.set_xlim((0, 10))
ax.set_ylim((0, 10))
# some data
ax.plot(range(11), 'o', color='black')
# key data point that we are encircling
ax.plot((5), (5), 'o', color='y')

ax.add_artist(circle1)
ax.add_artist(circle2)
ax.add_artist(circle3)
fig.savefig('plotcircles2.png')

, что приводит к:

Вы можете увидеть, как я устанавливаю заполнение2-й кружок к False, что полезно для обобщения ключевых результатов (как моя желтая точка данных).

49 голосов
/ 21 марта 2015
import matplotlib.pyplot as plt
circle1=plt.Circle((0,0),.2,color='r')
plt.gcf().gca().add_artist(circle1)

Быстрый сокращенный вариант принятого ответа, чтобы быстро вставить круг в существующий сюжет. Обратитесь к принятому ответу и другим ответам, чтобы понять детали.

Кстати:

  • gcf() означает «Получить текущий рисунок»
  • gca() означает Получить текущую ось
36 голосов
/ 04 июля 2014

Если вы хотите построить набор окружностей, вы можете увидеть этот пост или этот гист (немного новее).В посте была предложена функция с именем circles.

. Функция circles работает так же, как scatter, но размеры изображенных кругов указаны в единицах данных.

Вот пример:

from pylab import *
figure(figsize=(8,8))
ax=subplot(aspect='equal')

#plot one circle (the biggest one on bottom-right)
circles(1, 0, 0.5, 'r', alpha=0.2, lw=5, edgecolor='b', transform=ax.transAxes)

#plot a set of circles (circles in diagonal)
a=arange(11)
out = circles(a, a, a*0.2, c=a, alpha=0.5, edgecolor='none')
colorbar(out)

xlim(0,10)
ylim(0,10)

enter image description here

19 голосов
/ 06 мая 2014

Если вы хотите, чтобы «круг» поддерживал визуальное соотношение сторон 1 независимо от координат данных, вы можете использовать метод scatter (). http://matplotlib.org/1.3.1/api/pyplot_api.html#matplotlib.pyplot.scatter

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
r = [100, 80, 60, 40, 20] # in points, not data units
fig, ax = plt.subplots(1, 1)
ax.scatter(x, y, s=r)
fig.show()

Image is a scatter plot. Five circles along the line y=10x have decreasing radii from bottom left to top right. Although the graph is square-shaped, the y-axis has 10 times the range of the x-axis. Even so, the aspect ratio of the circles is 1 on the screen.

19 голосов
/ 09 февраля 2012
#!/usr/bin/python
import matplotlib.pyplot as plt
import numpy as np

def xy(r,phi):
  return r*np.cos(phi), r*np.sin(phi)

fig = plt.figure()
ax = fig.add_subplot(111,aspect='equal')  

phis=np.arange(0,6.28,0.01)
r =1.
ax.plot( *xy(r,phis), c='r',ls='-' )
plt.show()

Или, если хотите, посмотрите на path s, http://matplotlib.sourceforge.net/users/path_tutorial.html

6 голосов
/ 03 января 2018

Расширение принятого ответа для общего варианта использования.В частности:

  1. Просмотр окружностей с естественным соотношением сторон.

  2. Автоматическое расширение границ осей для включения вновь построенных окружностей.

Автономный пример:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.add_patch(plt.Circle((0, 0), 0.2, color='r', alpha=0.5))
ax.add_patch(plt.Circle((1, 1), 0.5, color='#00ffff', alpha=0.5))
ax.add_artist(plt.Circle((1, 0), 0.5, color='#000033', alpha=0.5))

#Use adjustable='box-forced' to make the plot area square-shaped as well.
ax.set_aspect('equal', adjustable='datalim')
ax.plot()   #Causes an autoscale update.
plt.show()

Обратите внимание на разницу между ax.add_patch(..) и ax.add_artist(..): изво-вторых, только первый механизм автомасштабирования учитывает круг (ссылка: обсуждение ), поэтому после выполнения приведенного выше кода мы получим:

add_patch(..) vs add_artist(..)

См. Также: set_aspect(..) документация .

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