pyplot으로 원을 그리다


158

놀랍게도 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()

...하지만 여전히 작동하지 않았습니다.


나는 이것을 할 수 있다고 확신하지만 matplotlib은 주로 그림을 그리는 것이 아니라 그림을 그리는 것을 목표로합니다 (예 : 일부 데이터는 그래프에 표시). 그래서 완전히 간단하지는 않을 수 있습니다.
Thomas K

산점도의 반경은 점점 데이터를 시각화하는 데 사용됩니다. 구글 차트는이를 "버블 플롯"이라고 부릅니다. Gapminder.org는 훌륭한 예입니다. 이 되는 그림이 아니라 음모를 꾸미고. "bubble"및 "scatter radius"에 대한 matplotlib github repo를 검색하지 않았으므로 기능을 추가하는 한 이것이 할 일 목록에 있다고 생각하지 않습니다.
베넷 브라운

1
plt.scatter ()는 크기 인수를 사용합니다. 원의 x 및 y 좌표, 원의 반지름 및 원의 색상에 대한 목록을 전달할 수 있습니다. matplotlib.org/1.3.1/api/… . 이전에는 그러한 기능이 matplotlib에 있지 않다고 생각하면서 오류가 발생했습니다.
베넷 브라운

3
단지 언급 : plt.Circle(..)지시합니다 matplotlib.patches.Circle(). 따라서 pyplot이없는 솔루션은 다음과 같습니다 circle = matplotlib.patches.Circle(..); axes.add_artist(circle).
ImportanceOfBeingErnest

답변:


203

축에 추가해야합니다. 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')

결과는 다음과 같습니다.

첫 번째 원은 원점이지만, 기본으로 clip_onTrue원이 잘린 때문에, 이제까지는 넘어 확장 할 때 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')

결과 :

두 번째 원의 채우기를로 설정하는 방법을 볼 수 있습니다 False. 노란색 데이터 포인트와 같은 주요 결과를 둘러싸는 데 유용합니다.


4
나는 당신이 음모를 꾸미기보다는 원을 "그리기"때문에이 대답을 좋아합니다. 음모를 꾸미는 것도 나의 첫 본능이었을 것입니다.
samb8s

7
참고 :이 답변이 작성된 이후 Circle 클래스가 matplotlib.pyplot에서 matplotlib.patches로 이동 한 것 같습니다.
pavon

6
그러나 그러나 원은 타원형입니다!
rubenvb

1
@rubenvb 내 다른 답변 참조 : stackoverflow.com/questions/9230389/…
Yann

3
@pavon 나를 위해 matplotlib.pyplot.Circle == matplotlib.patches.Circle평가 True하므로 아마도 별칭 일 것입니다.
Evgeni Sergeev

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

기존 플롯에 원을 빠르게 꽂을 수 있도록 허용 된 답변의 빠른 요약 버전입니다. 자세한 내용을 이해하려면 허용 된 답변 및 기타 답변을 참조하십시오.

그건 그렇고 :

  • gcf() 현재 수치 얻기를 의미
  • gca() 현재 축 가져 오기를 의미

4
완전한! 바로 지금 내가 볼 필요가 있었던 것입니다. 당신의 'By the Way'도 상당히 도움이되었습니다! dir(fig)30 가지가 넘는 'get'메소드를 보여 주지만 별명 gca이 없습니다 get_current_axis. 이런 종류의 참고 답변은 훌륭합니다.
uhoh

6
실제로 plt.gca()대신 할 수 있습니다plt.gcf().gca()
Andre Holzner

38

원 세트를 그리려면 이 게시물 또는 이 요점 (약간 새로운 내용) 을보고 싶을 수 있습니다 . 이 게시물은라는 기능을 제공했습니다 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)

여기에 이미지 설명을 입력하십시오


무엇을 transform=ax.transAxes합니까?
Lee

3
@Lee 오른쪽 아래 모서리에있는 원의 경우 데이터를 축 좌표로 변환합니다. 즉 (1,1)은 오른쪽 위 모서리를 의미하고 (1,0)은 오른쪽 아래 모서리를 의미합니다.
Syrtis Major

4
이것은 matplotlib의 일부 여야합니다.
JustAC0der

이것과 함께 사용할 수 있습니까 mplleaflet? 그렇다면 예를 들어 주시겠습니까?
François M.

@fmalaussena이 코드 스 니펫은 순수 matplotlib하기 때문에 mplleaflet시도하지는 않았지만 호환되어야한다고 생각합니다 .
Syrtis 메이저

21
#!/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들, http://matplotlib.sourceforge.net/users/path_tutorial.html


2
6.28319 0 라디안으로 변환 원의 degress 0 및 TP (360)의 방정식은 Trignometric mathopenref.com/coordparamcircle.html
알렉스에게 Punnen


11

일반적인 사용 사례에 대해 허용되는 답변 확장 특히:

  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(..)자료 : documentation .


python3에서는을 꺼내야합니다 fig, ax = plt.subplots(). 그렇지 않으면 두 개의 창이 나타납니다 (하나는 비어 있음).
albus_c

1

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

분류 문제의 동그라미 포인트.


0

안녕하세요, 원을 그리는 코드를 작성했습니다. 모든 종류의 원을 그리는 데 도움이됩니다. 이미지는 반경이 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()

행운을 빕니다


0

산점도와 마찬가지로 원 선 스타일의 일반 그림을 사용할 수도 있습니다. markersize매개 변수를 사용 하여 원의 반경을 조정할 수 있습니다.

import matplotlib.pyplot as plt

plt.plot(200, 2, 'o', markersize=7)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.