pyplot ile daire çizmek


158

Şaşırtıcı bir şekilde, giriş merkezi (x, y) ve yarıçap r olarak alan matplotlib.pyplot (lütfen pilab yok) ile bir daire çizmek için basit bir açıklama bulamadım. Bunun bazı varyantlarını denedim:

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

... ama yine de işe yaramadı.


Bunu yapmak mümkün olduğuna eminim, ancak matplotlib esas olarak çizim yapmayı amaçlamaktadır (yani, burada bazı veriler, bir grafiğe koy), bu yüzden tamamen basit olmayabilir.
Thomas K

Dağılım grafiği noktalarının yarıçapı, verileri görselleştirmek için giderek daha fazla kullanılmaktadır. Google grafikleri onlara "kabarcık grafikler" adını vermektedir. Gapminder.org iyi bir örnek. Bu bir çekme değil, çizim. Ben boşuna "kabarcık" ve "dağılım yarıçapı" için matplotlib github repo aradı, bu yüzden bu bir özellik eklemek kadar yapılacaklar listesinde olduğunu sanmıyorum.
Bennett Brown

1
plt.scatter () bir boyut argümanı alır. Çevrelerin x ve y koordinatları, dairelerin yarıçapları ve dairelerin renkleri için listeler iletebilirsiniz. matplotlib.org/1.3.1/api/… . Benim hatam daha önce, böyle bir işlevsellik zaten matplotlib değildi düşünüyorum.
Bennett Brown

3
Sadece bahsetmek gerekirse: plt.Circle(..)yönlendirir matplotlib.patches.Circle(). Yani pyplot içermeyen bir çözüm olurdu circle = matplotlib.patches.Circle(..); axes.add_artist(circle).
ImportanceOfBeingErnest

Yanıtlar:


203

Bir eksene eklemeniz gerekir. A Circle, an'in bir alt sınıfıdır Artistve axesbir add_artistyöntemi vardır.

İşte bunu yapmanın bir örneği:

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

Bu, aşağıdaki şekilde sonuçlanır:

İlk çember başlangıç ​​noktasındadır, ancak varsayılan clip_onolarak Trueçemberin ötesine uzandığında kırpılır axes. Üçüncü (yeşil) daire, klibi kırpmazsanız ne olacağını gösterir Artist. Bu eksenler ötesine uzanır (ancak şekil ötesinde, figür boyutu olduğunu yani değil otomatik sanatçılarınızın çizmek için ayarlanmıştır).

X, y ve yarıçap birimleri, varsayılan olarak veri birimlerine karşılık gelir. Bu durumda, eksenlerim üzerinde hiçbir şey çizmedim ( fig.gca()geçerli eksenleri döndürür) ve sınırlar hiç ayarlanmadığından, varsayılan olarak 0 ile 1 arasında bir x ve y aralığındadır.

Birimlerin nasıl önemli olduğunu gösteren örneğin devamı:

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

sonuç:

FalseTemel sonuçları (sarı veri noktam gibi) kuşatmak için yararlı olan 2. dairenin dolgusunu nasıl ayarladığımı görebilirsiniz .


4
Bu cevabı beğendim çünkü çizim yapmak yerine bir daire çiziyorsunuz. Buna rağmen komplo benim de ilk içgüdüm olurdu.
samb8s

7
Bilginize: Bu cevap yazıldığı için Circle sınıfı matplotlib.pyplot'tan matplotlib.patches'e taşınmış gibi görünüyor.
pavon

6
Ama ama daireler oval!
16:50, rubenvb

1
@rubenvb diğer cevabımı gör: stackoverflow.com/questions/9230389/…
Yann

3
@pavon Benim için matplotlib.pyplot.Circle == matplotlib.patches.Circledeğerlendirir True, bu yüzden muhtemelen takma adlardır .
Evgeni Sergeev

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

Bir daireyi mevcut bir arsaya hızlı bir şekilde bağlamak için, kabul edilen cevabın hızlı bir yoğunlaştırılmış versiyonu. Ayrıntıları anlamak için kabul edilen cevaba ve diğer cevaplara bakınız.

Bu arada:

  • gcf() Geçerli Şekil Al anlamına gelir
  • gca() Geçerli Ekseni Al anlamına gelir

4
Mükemmel! tam da şu anda görmem gereken şeydi. 'Bu arada' da oldukça yardımcı oldu! dir(fig)30'dan fazla 'get' yöntemini gösteriyor, ancak takma adı gcayok get_current_axis. Bu tür fyi cevapları harika.
uhoh

6
aslında plt.gca()yerine yapabilirsinizplt.gcf().gca()
Andre Holzner

38

Bir dizi çevreyi çizmek istiyorsanız, bu yayını veya bu özeti (biraz daha yeni) görmek isteyebilirsiniz . Gönderi adlı bir işlev sundu circles.

İşlev şu şekilde circlesçalışır scatter, ancak çizilen dairelerin boyutları veri birimindedir.

İşte bir örnek:

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)

resim açıklamasını buraya girin


Ne yapar transform=ax.transAxes?
Lee

3
@ Bu, sağ alt köşedeki daire için, verileri eksen koordinatına dönüştürür, yani (1,1) eksenlerdeki sağ üst köşe anlamına gelir, (1,0) sağ alt köşe vb.
Anlamına

4
Bu matplotlib'in bir parçası olmalıdır.
JustAC0der

Bu ile kullanılabilir mplleafletmi? Varsa, lütfen bir örnek verebilir misiniz?
François M.

@fmalaussena Bu kod snippet'i saf olduğundan matplotlib, mplleaflethiç denememiş olmama rağmen uyumlu olması gerektiğini düşünüyorum .
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()

İsterseniz path, http://matplotlib.sourceforge.net/users/path_tutorial.html adresine bakın.


2
0 6,28319 radyan çeviren bir daire ve santigrat 0 tp 360, bir Trignometric denklem mathopenref.com/coordparamcircle.html
Alex Punnen


11

Ortak bir kullanım için kabul edilen cevabı genişletmek. Özellikle:

  1. Daireleri doğal en boy oranında görüntüleyin.

  2. Eksen sınırlarını yeni çizilen daireleri içerecek şekilde otomatik olarak uzatın.

Bağımsız örnek:

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

İkisinin ax.add_patch(..)ve ax.add_artist(..): arasındaki farka dikkat edin, sadece eskisi otomatik ölçeklendirme makineleri daireyi dikkate alır (referans: tartışma ), bu nedenle yukarıdaki kodu çalıştırdıktan sonra:

add_patch (..) ve add_artist (..) karşılaştırması

Ayrıca bakınız: set_aspect(..)belgeler .


Python3'te, çıkarmanız gerekir fig, ax = plt.subplots(), aksi takdirde iki pencere alırsınız (bir tanesi boştur).
albus_c

1

(.Circle) kullanımı ile araziler görüyorum, ancak ne yapmak isteyebileceğinize dayanarak bunu da deneyebilirsiniz:

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)

Doğrusal ilerleme noktaları kullanan basit eşmerkezli daire çizimi

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

Sınıflandırma probleminin daire içine alınmış noktaları.


0

Merhaba Bir daire çizmek için bir kod yazdım. Her türlü dairenin çizilmesine yardımcı olacaktır. Resim, yarıçap 1 ve orta 0,0 olan daireyi gösterir . Merkez ve yarıçap herhangi bir seçimle düzenlenebilir.

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

İyi şanslar


0

Dağılım grafiğine benzer şekilde, daire çizgi stiliyle normal grafiği de kullanabilirsiniz. markersizeParametreyi kullanarak bir dairenin yarıçapını ayarlayabilirsiniz:

import matplotlib.pyplot as plt

plt.plot(200, 2, 'o', markersize=7)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.