pyplot के साथ एक सर्कल प्लॉट करें


158

आश्चर्यजनक रूप से मुझे एक सीधा-सीधा वर्णन नहीं मिला कि कैसे इनपुट सेंटर (x, y) और त्रिज्या r के रूप में matplotlib.pyplot (कृपया कोई pylab) के साथ एक वृत्त आकर्षित करने के लिए। मैंने इसके कुछ वेरिएंट आज़माए:

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

... लेकिन फिर भी यह काम नहीं कर पाया।


मुझे यकीन है कि ऐसा करना संभव है, लेकिन matplotlib का उद्देश्य मुख्य रूप से प्लॉटिंग करना है (यानी यहां कुछ डेटा हैं, उन्हें एक ग्राफ पर रखें), ड्राइंग नहीं, इसलिए यह पूरी तरह से सीधा नहीं हो सकता है।
थॉमस के

स्कैडप्लॉट बिंदुओं की त्रिज्या का उपयोग डेटा की कल्पना करने के लिए किया जाता है। Google चार्ट उन्हें "बबल प्लॉट" कहते हैं। Gapminder.org एक अच्छा उदाहरण है। यह है की साजिश रचने, नहीं ड्राइंग। मैंने "बबल" और "स्कैटर रेडियस" के लिए माटलपोटलिब जीथब रेपो को बिना किसी लाभ के खोजा, इसलिए मुझे नहीं लगता कि यह टू-डू लिस्ट में है जहां तक ​​एक फीचर को जोड़ना है।
बेनेट ब्राउन

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_onहै True, इसलिए सर्कल को क्लिप किया जाता है जब कभी भी यह परे से बाहर निकलता है axes। तीसरा (हरा) सर्कल दिखाता है कि जब आप क्लिप नहीं करते हैं तो क्या होता है Artist। यह कुल्हाड़ियों से परे फैली हुई है (लेकिन आकृति से परे नहीं, यानी आंकड़ा आकार स्वचालित रूप से आपके सभी कलाकारों को प्लॉट करने के लिए समायोजित नहीं होता है)।

डिफ़ॉल्ट रूप से x, y और त्रिज्या के लिए इकाइयों डेटा इकाइयों के अनुरूप हैं। इस मामले में, मैंने अपनी कुल्हाड़ियों पर कुछ भी साजिश नहीं की ( fig.gca()वर्तमान कुल्हाड़ियों को लौटाता है), और चूंकि सीमाएं कभी भी निर्धारित नहीं की गई हैं, वे एक एक्स और वाई श्रेणी में 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
मुझे यह उत्तर पसंद है क्योंकि आप साजिश रचने के बजाय एक वृत्त "चित्रित" कर रहे हैं। हालांकि प्लॉटिंग मेरी पहली वृत्ति भी रही होगी।
सांबा

7
FYI करें: ऐसा लगता है कि इस उत्तर के लिखे जाने के बाद से सर्कल वर्ग matplotlib.pyplot से matplotlib.patches में चला गया है।
पावन

6
लेकिन लेकिन लेकिन मंडलियां अंडाकार हैं!
रुबेंव

1
@rubenvb मेरा अन्य उत्तर देखें: stackoverflow.com/questions/9230389/…
Yann

3
मेरे लिए @pavon matplotlib.pyplot.Circle == matplotlib.patches.Circleमूल्यांकन करता है True, इसलिए वे शायद उपनाम हैं।
एवगेनी सर्गेव

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अन्य नहीं है । इस तरह के फी जवाब शानदार हैं।
उहॉ

6
आप वास्तव plt.gca()मेंplt.gcf().gca()
आंद्रे होल्ज़नर

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
@ यह है कि दाएं-निचले कोने में सर्कल के लिए, डेटा को कुल्हाड़ियों में समन्वयित करें, अर्थात (1,1) का अर्थ है कुल्हाड़ियों में दाएं-ऊपरी कोने, (1,0) का अर्थ है दाएं-निचले कोने, आदि
सिर्टिस मेजर

4
यह मैटलपोटलिब का हिस्सा होना चाहिए।
JustAC0der

क्या इसके साथ प्रयोग किया जा सकता है mplleaflet? यदि हां, तो क्या आप एक उदाहरण प्रदान कर सकते हैं?
फ्रांस्वा एम।

@fmalaussena जैसा कि यह कोड स्निपेट शुद्ध है matplotlib, मुझे लगता है कि इसे mplleafletमेरे साथ संगत होना चाहिए, हालांकि मैंने कभी कोशिश नहीं की।
सिरिटिस मेजर

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.tv.html


2
एक वृत्त का त्रिभुज समीकरण और degress 0 tp 360, जो 0 से 6.28319 रेडियंस mathopenref.com/coordparamcircle.html में
एलेक्स पुन्नन

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

एक सामान्य उपयोग के लिए स्वीकृत उत्तर का विस्तार। विशेष रूप से:

  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(..)प्रलेखन


Python3 में, आपको बाहर निकालने की आवश्यकता है fig, ax = plt.subplots(), अन्यथा आपको दो खिड़कियां मिलेंगी (एक खाली है)।
एल्बस_सी सीपी

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

नमस्कार मैंने एक वृत्त खींचने के लिए एक कोड लिखा है। यह सभी प्रकार के हलकों को खींचने में मदद करेगा। छवि 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.