2012-02-09 9 views
83

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

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

... लेकिन अभी भी यह काम नहीं कर रहा है।

+0

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

+0

स्कैटरप्लॉट बिंदुओं का त्रिज्या डेटा को देखने के लिए तेजी से उपयोग किया जाता है। Google चार्ट उन्हें "बबल प्लॉट" कहते हैं। Gapminder.org एक अच्छा exmaple है। यह * प्लॉटिंग है, ड्राइंग नहीं। मैंने "बबल" और "स्कैटर त्रिज्या" के लिए matplotlib github repo की खोज नहीं की है, इसलिए मुझे नहीं लगता कि यह एक सुविधा जोड़ने तक टू-डू सूची पर है। –

+1

plt.scatter() एक आकार तर्क लेता है। आप मंडलियों के x- और y-coordinates, मंडल 'त्रिज्या, और मंडलियों के रंगों के लिए सूचियां पास कर सकते हैं। http://matplotlib.org/1.3.1/api/pyplot_api.html#matplotlib.pyplot.scatter। मेरी गलती पहले, यह सोचकर कि ऐसी कार्यक्षमता पहले से ही matplotlib में नहीं थी। –

उत्तर

118

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

एक्स, वाई और त्रिज्या के लिए इकाइयां डिफ़ॉल्ट रूप से डेटा इकाइयों से मेल खाते हैं। इस मामले में, मैंने अपनी अक्षों पर कुछ भी प्लॉट नहीं किया था (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, जो घेराबंदी के लिए उपयोगी है करने के लिए 2 चक्र का भरण सेट मुख्य परिणाम (जैसे मेरा पीला डेटा बिंदु)।

+4

मुझे यह जवाब पसंद है क्योंकि आप साजिश के बजाय एक सर्कल "ड्राइंग" कर रहे हैं । हालांकि साजिश भी मेरी पहली प्रवृत्ति होगी। – samb8s

+0

एलिप्स जैसे कलाकारों को pylab.ion() या matplotlib.interactive (True) का सम्मान क्यों नहीं करते? उदा।, Xlabel() पर कॉल (आयन() या इंटरैक्टिव (ट्रू) को कॉल करने के बाद) तुरंत आंकड़े अपडेट करता है, लेकिन इन एलिप्स ऑब्जेक्ट्स से जुड़े कुछ भी एक स्पष्ट pylab.show() या matplotlib.show() की आवश्यकता होती है। –

+7

FYI: ऐसा लगता है कि सर्कल क्लास matplotlib.pyplot से matplotlib.patches में स्थानांतरित हो गया है क्योंकि यह उत्तर लिखा गया था। – pavon

15
#!/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_tutorial.html

+0

एक सर्कल और degress 0 tp 360 का ट्राइनोमेट्रिक समीकरण, जो 0 से 6.2831 9 रेडियंस तक अनुवाद करता है http://www.mathopenref.com/coordparamcircle.html –

13

यदि आप "सर्कल" को 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() 

Image is a scatter plot. Five circles along the line y=10x have decreasing radii from bottom left to top right. Although the graph is square-shaped, the y-axis has 10 times the range of the x-axis. Even so, the aspect ratio of the circles is 1 on the screen.

+0

आपको बहुत बहुत धन्यवाद। मुझे अनुपात और मंडल के पहलुओं के साथ कठिन समय था। स्कैटर एक आकर्षण की तरह काम किया। – OptimusCrime

30

आप हलकों का एक सेट प्लॉट करने के लिए चाहते हैं, आप this post या this gist (थोड़ा नया) को देखने के लिए चाहते हो सकता है। इस पोस्ट ने circles नामक एक समारोह की पेशकश की।

फ़ंक्शन circlesscatter जैसे काम करता है, लेकिन प्लॉट किए गए मंडल के आकार डेटा इकाई में हैं।

यहाँ एक उदाहरण है:

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) 

enter image description here

+0

'transform = ax.transAxes' क्या करता है? – Lee

+2

@Lee यह सही-निचले कोने में सर्कल के लिए है, डेटा को अक्ष समन्वय में परिवर्तित करें, यानी (1,1) का मतलब धुरी में दाएं कोने में है, (1,0) का अर्थ है दाएं कोने, आदि –

+3

matplotlib का एक हिस्सा बनें। – JustAC0der

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

स्वीकार किए जाते हैं जवाब का एक त्वरित संक्षिप्त संस्करण, कि मेरी जल्दी से एक मौजूदा साजिश में एक चक्र प्लग की जरूरत उपयुक्त है। विवरण को समझने के लिए स्वीकृत उत्तर और अन्य उत्तरों का संदर्भ लें।

वैसे:

  • जीसीएफ() का अर्थ है वर्तमान चित्रा जाओ
  • GCA() वर्तमान एक्सिस
+2

बिल्कुल सही! बस मुझे अभी देखने की ज़रूरत है। आपका 'वैसे भी' काफी मददगार था! 'डीआईआर (अंजीर)' मुझे 30 से अधिक 'तरीके' दिखाता है, लेकिन 'gca' में' get_current_axis' उपनाम नहीं है। इन प्रकार के fyi जवाब अद्भुत हैं। – uhoh

+1

@jmn शुरुआती लोगों के लिए अच्छा, त्वरित और आसान समाधान। – Karlo

+2

आप वास्तव में 'plt.gcf() के बजाय' plt.gca() 'कर सकते हैं। Gca()' –

1

जाओ एक आम 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(..) के बीच अंतर: दो में से सिर्फ पूर्व बनाता autoscaling मशीनरी खाते में वृत्त ले (संदर्भ: discussion), इसलिए उपर्युक्त कोड चलाने के बाद हमें मिलता है:

add_patch(..) vs add_artist(..)

यह भी देखें: set_aspect(..) documentation