plot sebuah lingkaran dengan pyplot

158

mengherankan saya tidak menemukan deskripsi lurus ke depan tentang cara menggambar lingkaran dengan matplotlib.pyplot (tolong tidak ada pylab) mengambil sebagai pusat input (x, y) dan jari-jari r. Saya mencoba beberapa varian ini:

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

... tapi tetap tidak berhasil.

Max Li
sumber
Saya yakin ini mungkin dilakukan, tetapi matplotlib ditujukan terutama untuk merencanakan (yaitu, ada beberapa data, letakkan di grafik), bukan menggambar, jadi mungkin tidak sepenuhnya mudah.
Thomas K
Radius titik sebar semakin digunakan untuk memvisualisasikan data. Grafik Google menyebutnya "plot gelembung". Gapminder.org adalah exmaple yang bagus. Ini adalah merencanakan, tidak menggambar. Saya mencari repo matplotlib github untuk "bubble" dan "radius scatter" tidak berhasil, jadi saya tidak berpikir ini ada dalam daftar yang harus dilakukan sejauh menambahkan fitur.
Bennett Brown
1
plt.scatter () tidak mengambil argumen ukuran. Anda dapat meneruskan daftar untuk koordinat x dan y lingkaran, jari-jari lingkaran, dan warna lingkaran. matplotlib.org/1.3.1/api/… . Kesalahan saya sebelumnya, dalam berpikir bahwa fungsi seperti itu belum ada di matplotlib.
Bennett Brown
3
Hanya untuk menyebutkan: plt.Circle(..)mengarahkan ke matplotlib.patches.Circle(). Jadi solusi tanpa pyplot adalah circle = matplotlib.patches.Circle(..); axes.add_artist(circle).
ImportanceOfBeingErnest

Jawaban:

203

Anda harus menambahkannya ke sumbu. A Circleadalah subclass dari Artist, dan axesmemiliki add_artistmetode.

Berikut ini contoh melakukan ini:

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

Ini menghasilkan gambar berikut:

Lingkaran pertama adalah pada asal, tetapi secara default clip_onadalah True, sehingga lingkaran terpotong kapan pun ia melampaui luar axes. Lingkaran ketiga (hijau) menunjukkan apa yang terjadi ketika Anda tidak memotong Artist. Itu melampaui sumbu (tetapi tidak di luar angka, yaitu ukuran gambar tidak secara otomatis disesuaikan untuk merencanakan semua artis Anda).

Unit untuk x, y dan jari-jari sesuai dengan unit data secara default. Dalam hal ini, saya tidak merencanakan apa pun pada sumbu saya ( fig.gca()mengembalikan sumbu saat ini), dan karena batasnya tidak pernah ditetapkan, standarnya adalah rentang x dan y dari 0 hingga 1.

Berikut ini adalah kelanjutan dari contoh, yang menunjukkan bagaimana unit penting:

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

yang mengakibatkan:

Anda dapat melihat bagaimana saya mengatur isi lingkaran ke-2 False, yang berguna untuk melingkari hasil utama (seperti titik data kuning saya).

Yann
sumber
4
Saya suka jawaban ini karena Anda "menggambar" lingkaran, daripada merencanakan. Meskipun merencanakan akan menjadi insting pertamaku juga.
samb8s
7
FYI: Sepertinya kelas Circle telah berpindah dari matplotlib.pyplot ke matplotlib.patches sejak jawaban ini ditulis.
pavon
6
Tapi tapi lingkarannya oval!
rubenvb
1
@rubenvb lihat jawaban saya yang lain: stackoverflow.com/questions/9230389/…
Yann
3
@pavon Bagi saya matplotlib.pyplot.Circle == matplotlib.patches.Circlemengevaluasi True, jadi mereka mungkin alias.
Evgeni Sergeev
66
import matplotlib.pyplot as plt
circle1=plt.Circle((0,0),.2,color='r')
plt.gcf().gca().add_artist(circle1)

Versi ringkas dari jawaban yang diterima, untuk dengan cepat memasukkan lingkaran ke plot yang ada. Lihat jawaban yang diterima dan jawaban lain untuk memahami detailnya.

Ngomong-ngomong:

  • gcf() berarti Dapatkan Gambar Saat Ini
  • gca() berarti Dapatkan Sumbu Saat Ini
jmn
sumber
4
Sempurna! Persis apa yang saya perlu lihat sekarang. Omong-omong Anda juga cukup membantu! dir(fig)menunjukkan kepada saya lebih dari 30 metode 'dapatkan', tetapi gcatidak memiliki get_current_axisalias. Jawaban seperti ini sangat bagus.
uhoh
6
Anda benar-benar dapat melakukan plt.gca()alih - alihplt.gcf().gca()
Andre Holzner
38

Jika Anda ingin merencanakan serangkaian lingkaran, Anda mungkin ingin melihat posting ini atau intisari ini (sedikit lebih baru). Pos menawarkan fungsi bernama circles.

Fungsi circleskerjanya seperti scatter, tetapi ukuran lingkaran yang diplot ada dalam unit data.

Ini sebuah contoh:

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)

masukkan deskripsi gambar di sini

Syrtis Major
sumber
Apa yang transform=ax.transAxesharus dilakukan
Lee
3
@Lee Itu untuk lingkaran di sudut kanan bawah, mengubah data menjadi koordinat sumbu, yaitu (1,1) berarti sudut kanan atas di sumbu, (1,0) berarti sudut kanan bawah, dll.
Syrtis Major
4
Ini harus menjadi bagian dari matplotlib.
JustAC0der
Bisakah ini digunakan mplleaflet? Jika ya, bisakah Anda memberikan contoh?
François M.
@ fmalaussena Karena potongan kode ini murni matplotlib, saya kira itu harus kompatibel mplleafletwalaupun saya tidak pernah mencoba.
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()

Atau, jika Anda mau, lihat paths, http://matplotlib.sourceforge.net/users/path_tutorial.html

ev-br
sumber
2
Persamaan trignometrik dari lingkaran dan degress 0 tp 360, yang diterjemahkan menjadi 0 hingga 6,28319 radian mathopenref.com/coordparamcircle.html
Alex Punnen
19

Jika Anda bertujuan untuk memiliki "lingkaran" mempertahankan rasio aspek visual 1 tidak peduli apa data koordinatnya, Anda bisa menggunakan metode 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()

Gambar adalah sebaran plot.  Lima lingkaran di sepanjang garis y = 10x memiliki jari-jari yang berkurang dari kiri bawah ke kanan atas.  Meskipun grafik berbentuk persegi, sumbu y memiliki 10 kali kisaran sumbu x.  Meski begitu, rasio aspek lingkaran adalah 1 di layar.

Bennett Brown
sumber
11

Memperluas jawaban yang diterima untuk kata kunci umum. Khususnya:

  1. Lihat lingkaran pada rasio aspek alami.

  2. Secara otomatis memperpanjang batas sumbu untuk menyertakan lingkaran yang baru diplot.

Contoh lengkap:

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

Perhatikan perbedaan antara ax.add_patch(..)dan ax.add_artist(..): dari keduanya, hanya yang pertama membuat mesin autoscaling yang memperhitungkannya (referensi: diskusi ), jadi setelah menjalankan kode di atas kita dapatkan:

add_patch (..) vs add_artist (..)

Lihat juga: set_aspect(..)dokumentasi .

Evgeni Sergeev
sumber
Di python3, Anda harus menghapus fig, ax = plt.subplots(), jika tidak, Anda akan mendapatkan dua jendela (satu kosong).
albus_c
1

Saya melihat plot dengan penggunaan (.circle) tetapi berdasarkan apa yang ingin Anda lakukan, Anda juga dapat mencoba ini:

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)

Plot lingkaran konsentris sederhana menggunakan titik progres linier

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

Poin melingkar dari masalah klasifikasi.

inyang kpongette
sumber
0

Halo Saya telah menulis kode untuk menggambar lingkaran. Ini akan membantu untuk menggambar semua jenis lingkaran. Gambar menunjukkan lingkaran dengan jari-jari 1 dan pusat di 0,0 tengah dan jari-jari dapat diedit dari pilihan apa pun.

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

Semoga berhasil

AJEET
sumber
0

Demikian pula untuk menyebarkan plot Anda juga dapat menggunakan plot normal dengan gaya garis lingkaran. Dengan menggunakan markersizeparameter, Anda dapat menyesuaikan jari-jari lingkaran:

import matplotlib.pyplot as plt

plt.plot(200, 2, 'o', markersize=7)
Marcin Szałajski
sumber