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

Удивительно, но я не нашел прямого описания того, как нарисовать круг с помощью matplotlib.pyplot (пожалуйста, без pylab), в качестве центра ввода (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 ответов

Решение

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

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

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

import matplotlib.pyplot as plt
circle1=plt.Circle((0,0),.2,color='r')
plt.gcf().gca().add_artist(circle1)

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

Кстати:

  • gcf() означает получить текущий рисунок
  • gca() значит получить текущую ось

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

введите описание изображения здесь

#!/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()

Или, если вы предпочитаете, посмотрите на paths, http://matplotlib.sourceforge.net/users/path_tutorial.html

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

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()

Изображение представляет собой точечный график. Пять кругов вдоль линии y = 10x имеют уменьшающиеся радиусы снизу слева вверху справа. Хотя график имеет квадратную форму, ось у имеет в 10 раз больший диапазон оси х. Несмотря на это, соотношение сторон на экране равно 1

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

  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 (..) против add_artist

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

Я вижу графики с использованием (.circle), но в зависимости от того, что вы, возможно, захотите сделать, вы также можете попробовать это:

import matplotlib.pyplot as plt
import numpy as np

x = list(range(1,6))
y = list(range(10, 20, 2))

print(x, y)

for i, data in enumerate(zip(x,y)):
    j, k = data
    plt.scatter(j,k, marker = "o", s = ((i+1)**4)*50, alpha = 0.3)

centers = np.array([[5,18], [3,14], [7,6]])
m, n = make_blobs(n_samples=20, centers=[[5,18], [3,14], [7,6]], n_features=2, 
cluster_std = 0.4)
colors = ['g', 'b', 'r', 'm']

plt.figure(num=None, figsize=(7,6), facecolor='w', edgecolor='k')
plt.scatter(m[:,0], m[:,1])

for i in range(len(centers)):

    plt.scatter(centers[i,0], centers[i,1], color = colors[i], marker = 'o', s = 13000, alpha = 0.2)
    plt.scatter(centers[i,0], centers[i,1], color = 'k', marker = 'x', s = 50)

plt.savefig('plot.png')

Подобно диаграмме рассеивания, вы также можете использовать обычный график со стилем линии круга. С помощьюmarkersize параметром вы можете настроить радиус круга:

import matplotlib.pyplot as plt

plt.plot(200, 2, 'o', markersize=7)

Здравствуйте, я написал код для рисования круга. Он поможет рисовать всевозможные круги. На изображении показан круг с радиусом 1 и центром в 0,0. Центр и радиус можно редактировать по любому выбору.

## Draw a circle with center and radius defined
## Also enable the coordinate axes
import matplotlib.pyplot as plt
import numpy as np
# Define limits of coordinate system
x1 = -1.5
x2 = 1.5
y1 = -1.5
y2 = 1.5

circle1 = plt.Circle((0,0),1, color = 'k', fill = False, clip_on = False)
fig, ax = plt.subplots()
ax.add_artist(circle1)
plt.axis("equal")
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.xlim(left=x1)
plt.xlim(right=x2)
plt.ylim(bottom=y1)
plt.ylim(top=y2)
plt.axhline(linewidth=2, color='k')
plt.axvline(linewidth=2, color='k')

##plt.grid(True)
plt.grid(color='k', linestyle='-.', linewidth=0.5)
plt.show()

Удачи

Другие вопросы по тегам