matplotlib круги вокруг определенных точек [дубликат]

В дополнение к более прямым ответам, я был бы упущен, если бы не упомянул iPython . Нажмите «вкладку», чтобы просмотреть доступные методы с автозаполнением.

И как только вы нашли метод, попробуйте:

help(object.method) 

, чтобы увидеть подпись pydocs, подпись метода и т. Д. .

Ahh ... REPL .

100
задан Max Li 9 February 2012 в 19:23
поделиться

6 ответов

Вам нужно добавить его к осям. A 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')

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

[/g1]

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

Единицы для x, y и радиуса соответствуют по умолчанию единицам данных. В этом случае я ничего не рисовал на своих осях (fig.gca() возвращает текущие оси), и поскольку пределы никогда не были установлены, они по умолчанию устанавливают диапазон x и y от 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')

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

[/g2]

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

134
ответ дан mnky9800n 31 August 2018 в 17:03
поделиться

Если вы хотите, чтобы «круг» поддерживал визуальное соотношение сторон 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. [/g1]

18
ответ дан Bennett Brown 31 August 2018 в 17:03
поделиться

Если вы хотите построить набор кругов, вы можете увидеть этот пост или этот gist (бит более новый). Сообщение предложило функцию с именем 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 [/g2]

32
ответ дан Community 31 August 2018 в 17:03
поделиться
#!/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

18
ответ дан ev-br 31 August 2018 в 17:03
поделиться

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

  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(..): из двух, только первая делает автомасштабирующее оборудование учитывающим круг (ссылка: обсуждение ), поэтому после запуска вышеуказанного кода мы получаем:

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

2
ответ дан Evgeni Sergeev 31 August 2018 в 17:03
поделиться
import matplotlib.pyplot as plt
circle1=plt.Circle((0,0),.2,color='r')
plt.gcf().gca().add_artist(circle1)

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

Кстати:

  • gcf() означает Get Current Figure
  • gca() означает Получить текущую ось
36
ответ дан Seanny123 31 August 2018 в 17:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: