पायथन में खाली सर्कल के साथ एक स्कैटर प्लॉट कैसे करें?


167

पाइथन में, माटप्लोटलिब के साथ, खाली सर्कल के साथ एक बिखराव की साजिश कैसे रची जा सकती है? लक्ष्य के लिए पहले से प्लॉट किए गए कुछ रंगीन डिस्क के चारों ओर खाली सर्कल बनाना है scatter(), ताकि उन्हें उजागर करने के लिए, आदर्श रूप से रंगीन सर्कल को फिर से खोले बिना।

मैंने कोशिश की facecolors=None, कोई फायदा नहीं हुआ।


1
अलग-अलग रंगों वाले खाली / खोखले बिखरे हुए भूखंडों को आकर्षित करने वाले लोग इस प्रश्न को देख सकते हैं ।
इम्पोर्टेंसऑफबिंगएर्नेस्ट

जवाबों:


243

बिखरने के लिए दस्तावेज से :

Optional kwargs control the Collection properties; in particular:

    edgecolors:
        The string none to plot faces with no outlines
    facecolors:
        The string none to plot unfilled outlines

निम्नलिखित आज़माएँ:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.random.randn(60) 
y = np.random.randn(60)

plt.scatter(x, y, s=80, facecolors='none', edgecolors='r')
plt.show()

उदाहरण छवि

नोट: अन्य प्रकार के भूखंडों के लिए और के उपयोग पर इस पोस्ट को देखें ।markeredgecolormarkerfacecolor


4
धन्यवाद! गोटा यह है कि अधिक सामान्य (पायथन में) facecolors=Noneकाम नहीं करता है, जिसने मुझे ट्रिप किया।
एरिक ओ लेबिगोट

24
बहुत मददगार। यह है markerfacecolor='none', यह अब ऐसा है।
झिझक_ईएम

2
मेरे पास मेरी मैटलोट्लिब शैली इस तरह से थी कि किनारों की चौड़ाई शून्य हो गई। यदि आप किसी भी मार्कर को markerfacecolor='none'जोड़ने की कोशिश के साथ नहीं देखते हैंmarkeredgewidth=1.0
oLas

यह दृष्टिकोण भी matplotlib के मानक आयात करने के बाद Seaborn में इस्तेमाल किया जा सकता %matplotlib inlineहै और import matplotlib.pyplot as plt, और फिर Seaborn की स्थापना द्वारा की साजिश रचने डिफ़ॉल्ट होने के लिएimport seaborn as sns; sns.set()
जेकब

68

क्या ये काम करेंगे?

plt.scatter(np.random.randn(100), np.random.randn(100), facecolors='none')

उदाहरण छवि

या प्लॉट () का उपयोग कर

plt.plot(np.random.randn(100), np.random.randn(100), 'o', mfc='none')

उदाहरण छवि


3
यह तब उपयोगी है जब आप plotइसके बजाय का उपयोग करते हैंscatter
ट्रेवर बॉयड स्मिथ

2
के लिए scatter, आप निर्दिष्ट करने की आवश्यकता edgecolorsकी तरह edgecolors='r'। अन्यथा, मंडलियां गायब हो जाती हैं। यहाँ देखें
T_T

14

यहां एक और तरीका है: यह वर्तमान अक्षों, भूखंड या छवि या जो भी हो, के लिए एक सर्कल जोड़ता है:

from matplotlib.patches import Circle  # $matplotlib/patches.py

def circle( xy, radius, color="lightsteelblue", facecolor="none", alpha=1, ax=None ):
    """ add a circle to ax= or current axes
    """
        # from .../pylab_examples/ellipse_demo.py
    e = Circle( xy=xy, radius=radius )
    if ax is None:
        ax = pl.gca()  # ax = subplot( 1,1,1 )
    ax.add_artist(e)
    e.set_clip_box(ax.bbox)
    e.set_edgecolor( color )
    e.set_facecolor( facecolor )  # "none" not None
    e.set_alpha( alpha )

वैकल्पिक शब्द

(चित्र में मौजूद वृत्तों की वजह से स्खलन हो जाता है imshow aspect="auto")।


5

Matplotlib 2.0 में एक पैरामीटर है जिसे fillstyle मार्करों के भरे जाने के तरीके पर बेहतर नियंत्रण की अनुमति मिलती है। मेरे मामले में मैंने इसे एररबार्स के साथ प्रयोग किया है, लेकिन यह सामान्य रूप से मार्करों के लिए काम करता है http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstyleनिम्नलिखित मूल्यों को स्वीकार करता है: ['पूर्ण' | 'छोड़ दिया' | 'सही' | 'नीचे' | 'शीर्ष' | 'कोई नहीं']

उपयोग करते समय ध्यान रखने योग्य दो महत्वपूर्ण बातें हैं fillstyle,

1) यदि एमएफसी को किसी भी प्रकार के मूल्य पर सेट किया जाता है तो यह प्राथमिकता लेगा, इसलिए, यदि आपने 'कोई नहीं' के लिए फिलस्टाइल सेट किया है तो यह प्रभावी नहीं होगा। इसलिए फिलस्टाइल के साथ संयोजन में एमएफसी का उपयोग करने से बचें

2) आप मार्कर किनारे की चौड़ाई (उपयोग markeredgewidthया mew) को नियंत्रित करना चाह सकते हैं क्योंकि यदि मार्कर अपेक्षाकृत छोटा है और किनारे की चौड़ाई मोटी है, तो मार्कर भरे हुए दिखेंगे भले ही वे न हों।

निम्नलिखित एररबार का उपयोग करके एक उदाहरण दिया गया है:

myplot.errorbar(x=myXval, y=myYval, yerr=myYerrVal, fmt='o', fillstyle='none', ecolor='blue',  mec='blue')

2

गैरी केर के उदाहरण पर आधारित और यहाँ प्रस्तावित एक के रूप में निम्नलिखित कोड के साथ निर्दिष्ट मूल्यों से संबंधित खाली सर्कल बना सकते हैं:

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.markers import MarkerStyle

x = np.random.randn(60) 
y = np.random.randn(60)
z = np.random.randn(60)

g=plt.scatter(x, y, s=80, c=z)
g.set_facecolor('none')
plt.colorbar()
plt.show()

यह अनिवार्य रूप से स्वीकृत उत्तर का एक जटिल संस्करण है ...
एरिक ओ लेबिगॉट

मेरी बात से यह नहीं है। रंगों के साथ स्कैटर प्लॉट का उपयोग करना कमांड के भीतर फेसकलर = "नो" को छोड़कर नहीं होता है। दिए गए लिंक में वर्णित के अनुसार फेसकोलर के बाद के निष्कासन की आवश्यकता है। Unfortunaly इस जटिल समाधान को कलरकोडिंग के साथ तितर बितर भूखंडों में हटाने के लिए आवश्यक है।
प्रात

इस उत्तर में दृष्टिकोण वास्तव में उपयोगी है यदि कोई ऐसे ग्राफ़ को अपडेट करना चाहता है जिसमें मूल रूप से खाली सर्कल नहीं हैं। हालांकि, इन हलकों को सीधे बनाने के बारे में सवाल है , इसलिए स्वीकृत समाधान जाने का तरीका है, क्योंकि यह इस उत्तर के समान है, लेकिन सीधे, पहले ग्राफ़ के किसी भी बाहरी अद्यतन के साथ नहीं।
एरिक ओ लेबिगॉट

इस "जटिल संस्करण" ने मेरे लिए काम किया जब तर्क को एम्बेड .scatter()नहीं किया। संदर्भ के लिए, मैं एक कॉलॉर्मैप ( c=z, cmap='jet') भी लगा रहा था ।
एंड्रयू सिल्वर

1

इसलिए मुझे लगता है कि आप कुछ बिंदुओं को उजागर करना चाहते हैं जो एक निश्चित मानदंड के अनुकूल हैं। आप खाली स्थान के साथ हाईलाइट किए गए बिंदुओं के दूसरे स्कैटर प्लॉट और सभी बिंदुओं को प्लॉट करने के लिए पहली कॉल करने के लिए प्रील्यूड की कमांड का उपयोग कर सकते हैं। सुनिश्चित करें कि छोटे भरे हुए घेरों को घेरने के लिए बड़े खाली घेरे के लिए s पैरामटर पर्याप्त रूप से छोटा है।

अन्य विकल्प तितर बितर का उपयोग नहीं करना है और सर्कल / दीर्घवृत्त कमांड का उपयोग करके व्यक्तिगत रूप से पैच खींचना है। ये matplotlib.patches में हैं, यहाँ हलकों आयतों आदि को बनाने के बारे में कुछ नमूना कोड दिए गए हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.