พล็อตวงกลมที่มี 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 มีจุดประสงค์หลักในการวางแผน (เช่นนี่คือข้อมูลบางส่วนวางลงบนกราฟ) ไม่ใช่วาดภาพดังนั้นมันอาจไม่ตรงไปตรงมาทั้งหมด
โทมัส K

รัศมีของจุดกระจายที่ใช้กันมากขึ้นในการมองเห็นข้อมูล ชาร์ตของ Google เรียกพวกเขาว่า "Bubble Plots" Gapminder.org เป็น exmaple ที่ดี นี่คือการวางแผนไม่ใช่การวาด ฉันค้นหา matplotlib github repo เพื่อหา "bubble" และ "scatter radius" เพื่อหาประโยชน์ดังนั้นฉันไม่คิดว่านี่เป็นรายการที่ต้องทำเท่าที่เพิ่มคุณสมบัติ
Bennett Brown

1
plt.scatter () ใช้อาร์กิวเมนต์ขนาด คุณสามารถส่งรายการสำหรับ x- และ y- พิกัดของวงกลมรัศมีของวงกลมและสีของวงกลม matplotlib.org/1.3.1/api/… . ข้อผิดพลาดของฉันก่อนหน้านี้โดยคิดว่าการทำงานดังกล่าวไม่ได้อยู่ใน matplotlib
Bennett Brown

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_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ซึ่งเป็นประโยชน์สำหรับการล้อมรอบผลลัพธ์หลัก (เช่นจุดข้อมูลสีเหลืองของฉัน)


4
ฉันชอบคำตอบนี้เพราะคุณ "วาด" วงกลมแทนที่จะวางแผน แม้ว่าการวางแผนจะเป็นสัญชาตญาณแรกของฉันเช่นกัน
samb8s

7
FYI: ดูเหมือนว่าคลาส 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
ที่สมบูรณ์แบบ! สิ่งที่ฉันต้องการเห็นในตอนนี้ 'ทาง' ก็มีประโยชน์เช่นกัน! dir(fig)แสดงวิธีรับมากกว่า 30 ครั้ง แต่gcaไม่มีget_current_axisนามแฝง คำตอบ fyi ประเภทนี้วิเศษมาก
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ทำอย่างไร
ลี

3
@ Lee สำหรับวงกลมที่มุมขวาล่างเปลี่ยนข้อมูลเป็นพิกัดแกนคือ (1,1) หมายถึงมุมบนขวาในแกน (1,0) หมายถึงมุมขวาล่าง ฯลฯ
Syrtis Major

4
นี่ควรเป็นส่วนหนึ่งของ matplotlib
JustAC0der

นี้สามารถใช้กับmplleaflet? ถ้าเป็นเช่นนั้นคุณช่วยยกตัวอย่างได้ไหม
François M.

@fmalaussena เนื่องจากโค้ดนี้บริสุทธิ์matplotlibฉันเดาว่าควรใช้งานร่วมกับmplleafletแม้ว่าฉันไม่เคยลอง
Syrtis Major

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

หรือหากคุณต้องการดูที่paths, http://matplotlib.sourceforge.net/users/path_tutorial.html


2
สมการเชิงตรีโกณมิติของวงกลมและ degress 0 tp 360 ซึ่งแปลเป็น 0 ถึง 6.28319 เรเดียนmathopenref.com/coordparamcircle.html
Alex Punnen

19

หากคุณต้องการให้ "วงกลม" คงอัตราส่วนภาพไว้ที่ 1 ไม่ว่าพิกัดข้อมูลจะเป็นอย่างไรคุณสามารถใช้วิธีการกระจาย () 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()

ภาพเป็นโครงเรื่องกระจาย  วงกลมห้าวงตามเส้น y = 10x ลดรัศมีจากล่างซ้ายไปขวาบน  แม้ว่ากราฟจะเป็นรูปสี่เหลี่ยมจตุรัส แต่แกน y มีช่วงของแกน x 10 เท่า  ถึงกระนั้นอัตราส่วนภาพของวงกลมก็คือ 1 บนหน้าจอ


11

การขยายคำตอบที่ยอมรับสำหรับ usecase ทั่วไป โดยเฉพาะอย่างยิ่ง:

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


ใน 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.