vẽ một vòng tròn với pyplot


158

đáng ngạc nhiên là tôi đã không tìm thấy một mô tả thẳng về cách vẽ một vòng tròn với matplotlib.pyplot (xin vui lòng không pylab) lấy làm trung tâm đầu vào (x, y) và bán kính r. Tôi đã thử một số biến thể của điều này:

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

... nhưng vẫn không làm cho nó hoạt động.


Tôi chắc chắn có thể làm điều này, nhưng matplotlib chủ yếu nhắm vào âm mưu (tức là đây là một số dữ liệu, đặt chúng trên biểu đồ), không vẽ, vì vậy nó có thể không hoàn toàn đơn giản.
Thomas K

Bán kính của các điểm phân tán ngày càng được sử dụng để trực quan hóa dữ liệu. Biểu đồ Google gọi chúng là "lô bong bóng". Gapminder.org là một ví dụ tốt. Đây âm mưu, không vẽ. Tôi đã tìm kiếm repo matplotlib github cho "bong bóng" và "bán kính phân tán" nhưng không có kết quả, vì vậy tôi không nghĩ rằng đây là trong danh sách việc cần làm khi thêm một tính năng.
Bennett Brown

1
plt.scatter () không có đối số kích thước. Bạn có thể chuyển danh sách cho tọa độ x và y của vòng tròn, bán kính của vòng tròn và màu của vòng tròn. matplotlib.org/1.3.1/api/ đá . Lỗi của tôi trước đó, khi nghĩ rằng chức năng như vậy chưa có trong matplotlib.
Bennett Brown

3
Chỉ cần đề cập: plt.Circle(..)chỉ đạo đến matplotlib.patches.Circle(). Vì vậy, một giải pháp mà không có pyplot sẽ được circle = matplotlib.patches.Circle(..); axes.add_artist(circle).
ImportanceOfByingErnest

Câu trả lời:


203

Bạn cần thêm nó vào một trục. A Circlelà một lớp con của an Artistaxescó một add_artistphương thức.

Đây là một ví dụ về việc này:

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

Kết quả này trong hình sau:

Vòng tròn đầu tiên là ở điểm gốc, nhưng theo mặc định clip_onTrue, vì vậy vòng tròn được cắt bớt khi bao giờ nó vượt ra ngoài axes. Vòng tròn thứ ba (màu xanh lá cây) hiển thị những gì xảy ra khi bạn không cắt Artist. Nó mở rộng ra ngoài các trục (nhưng không vượt quá con số, tức là kích thước hình không được điều chỉnh tự động để vẽ tất cả các nghệ sĩ của bạn).

Theo mặc định, các đơn vị cho x, y và bán kính tương ứng với các đơn vị dữ liệu. Trong trường hợp này, tôi không vẽ bất cứ thứ gì trên các trục của mình ( fig.gca()trả về các trục hiện tại) và vì các giới hạn chưa bao giờ được đặt, chúng mặc định là phạm vi x và y từ 0 đến 1.

Đây là phần tiếp theo của ví dụ, cho thấy các đơn vị quan trọng như thế nào:

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

kết quả là:

Bạn có thể thấy cách tôi đặt phần lấp đầy của vòng tròn thứ 2 False, rất hữu ích cho việc bao quanh các kết quả chính (như điểm dữ liệu màu vàng của tôi).


4
Tôi thích câu trả lời này vì bạn đang "vẽ" một vòng tròn, thay vì vẽ. Mặc dù âm mưu cũng là bản năng đầu tiên của tôi.
samb8s

7
FYI: Có vẻ như lớp Circle đã chuyển từ matplotlib.pyplot sang matplotlib.patches kể từ khi câu trả lời này được viết.
pavon

6
Nhưng nhưng hình tròn là hình bầu dục!
rubenvb

1
@rubenvb xem câu trả lời khác của tôi: stackoverflow.com/questions/9230389/NH
Yann

3
@pavon Đối với tôi matplotlib.pyplot.Circle == matplotlib.patches.Circleđánh giá True, vì vậy họ có thể là bí danh.
Evgeni Sergeev

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

Một phiên bản cô đọng nhanh chóng của câu trả lời được chấp nhận, để nhanh chóng cắm một vòng tròn vào một âm mưu hiện có. Tham khảo câu trả lời được chấp nhận và các câu trả lời khác để hiểu chi tiết.

Nhân tiện:

  • gcf() có nghĩa là có được hình hiện tại
  • gca() có nghĩa là Nhận trục hiện tại

4
Hoàn hảo! chính xác những gì tôi cần để xem ngay bây giờ. 'Nhân tiện' cũng khá hữu ích! dir(fig)chỉ cho tôi hơn 30 phương thức 'nhận', nhưng gcakhông có get_current_axisbí danh. Những loại câu trả lời fyi là tuyệt vời.
uhoh

6
bạn thực sự có thể làm plt.gca()thay vìplt.gcf().gca()
Andre Holzner

38

Nếu bạn muốn vẽ một tập hợp các vòng tròn, bạn có thể muốn xem bài đăng này hoặc ý chính này (mới hơn một chút). Bài viết cung cấp một chức năng có tên circles.

Hàm này circleshoạt động như thế nào scatter, nhưng kích thước của các vòng tròn được vẽ nằm trong đơn vị dữ liệu.

Đây là một ví dụ:

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)

nhập mô tả hình ảnh ở đây


Không gì transform=ax.transAxeslàm gì?
Lee

3
@Lee Đó là cho vòng tròn ở góc dưới bên phải, chuyển đổi dữ liệu thành tọa độ trục, nghĩa là (1,1) có nghĩa là góc trên bên phải trong các trục, (1,0) có nghĩa là góc dưới bên phải, v.v.
Syrtis Major

4
Đây phải là một phần của matplotlib.
JustAC0der

Điều này có thể được sử dụng với mplleaflet? Nếu vậy, bạn có thể cung cấp một ví dụ, xin vui lòng?
François M.

@fmalaussena Vì đoạn mã này là thuần túy matplotlib, tôi đoán nó sẽ tương thích với mplleafletmặc dù tôi chưa bao giờ thử.
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()

Hoặc, nếu bạn thích, hãy xem paths, http://matplotlib.sourceforge.net/users/path_tutorial.html


2
Phương trình đo lường của một vòng tròn và suy giảm 0 tp 360, dịch từ 0 đến 6.28319 radian mathopenref.com/coordparamcircle.html
Alex Punnen

19

Nếu bạn đặt mục tiêu "vòng tròn" duy trì tỷ lệ khung hình trực quan là 1 cho dù tọa độ dữ liệu là gì, bạn có thể sử dụng phương thức phân tán (). 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()

Hình ảnh là một âm mưu phân tán.  Năm vòng tròn dọc theo đường y = 10x có bán kính giảm dần từ dưới trái sang trên phải.  Mặc dù đồ thị có dạng hình vuông, trục y có phạm vi gấp 10 lần trục x.  Mặc dù vậy, tỷ lệ khung hình của các vòng tròn là 1 trên màn hình.


11

Mở rộng câu trả lời được chấp nhận cho một usecase chung. Đặc biệt:

  1. Xem các vòng tròn ở tỷ lệ khung hình tự nhiên.

  2. Tự động mở rộng giới hạn trục để bao gồm các vòng tròn mới được vẽ.

Ví dụ khép kín:

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

Lưu ý sự khác biệt giữa ax.add_patch(..)ax.add_artist(..): của hai loại, chỉ có cái trước làm cho máy móc tự động lấy vòng tròn vào tài khoản (tham khảo: thảo luận ), vì vậy sau khi chạy đoạn mã trên, chúng tôi nhận được:

add_patch (..) so với add_artist (..)

Xem thêm: set_aspect(..)tài liệu .


Trong python3, bạn cần lấy ra fig, ax = plt.subplots(), nếu không bạn sẽ nhận được hai cửa sổ (một cửa sổ trống).
albus_c

1

Tôi thấy các lô với việc sử dụng (.circle) nhưng dựa trên những gì bạn có thể muốn làm, bạn cũng có thể thử điều này:

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)

Biểu đồ vòng tròn đồng tâm đơn giản sử dụng các điểm tiến triển tuyến tính

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

Điểm tròn của một vấn đề phân loại.


0

Xin chào tôi đã viết một mã để vẽ một vòng tròn. Nó sẽ giúp vẽ tất cả các loại hình tròn. Hình ảnh hiển thị vòng tròn có bán kính 1 và tâm ở 0,0 Có thể chỉnh sửa tâm và bán kính của bất kỳ lựa chọn nào.

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

Chúc may mắn


0

Tương tự như biểu đồ phân tán, bạn cũng có thể sử dụng cốt truyện bình thường với kiểu đường tròn. Sử dụng markersizetham số bạn có thể điều chỉnh bán kính hình tròn:

import matplotlib.pyplot as plt

plt.plot(200, 2, 'o', markersize=7)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.