2012-03-16 20 views
5

मैं बस scipy स्टैक से शुरू कर रहा हूं। मैं एक सीएसवी संस्करण में आईरिस डेटासेट का उपयोग कर रहा हूं। मैं का उपयोग कर इसे ठीक लोड कर सकते हैं:पिलैब: रंगों के लिए लेबल लेबल

iris=numpy.recfromcsv("iris.csv") 

और यह साजिश:

pylab.scatter(iris.field(0), iris.field(1)) 
pylab.show() 

अब मैं भी कक्षाएं, जो iris.field(4) में जमा हो जाती प्लॉट करने के लिए करना चाहते हैं:

chararray(['setosa', ...], dtype='|S10') 

साजिश के लिए इन तारों को रंगों में मैप करने का एक शानदार तरीका क्या है? scatter(iris.field(0), iris.field(1), c=iris.field(4)) काम नहीं करता है (उन दस्तावेज़ों से जो फ्लोट वैल्यू या कॉलमैप की अपेक्षा करते हैं)। मुझे स्वचालित रूप से रंगीन नक्शा उत्पन्न करने का एक शानदार तरीका नहीं मिला है।

cols = {"versicolor": "blue", "virginica": "green", "setosa": "red"} 
scatter(iris.field(0), iris.field(1), c=map(lambda x:cols[x], iris.field(4))) 

लगभग करता है जो मैं चाहता हूँ, लेकिन मैं मैनुअल रंग विनिर्देश बहुत ज्यादा पसंद नहीं है।

संपादित: अंतिम पंक्ति के थोड़ा और अधिक सुरुचिपूर्ण संस्करण: एक तरह से खूबसूरत है या नहीं

scatter(iris.field(0), iris.field(1), c=map(cols.get, iris.field(4))) 

उत्तर

4

जो कुछ के लिए यह लायक है, आप आमतौर पर उस मामले में इस तरह के और अधिक कुछ करना चाहते हैं:

import numpy as np 
import matplotlib.pyplot as plt 

iris = np.recfromcsv('iris.csv') 
names = set(iris['class']) 

x,y = iris['sepal_length'], iris['sepal_width'] 

for name in names: 
    cond = iris['class'] == name 
    plt.plot(x[cond], y[cond], linestyle='none', marker='o', label=name) 

plt.legend(numpoints=1) 
plt.show() 

enter image description here

क्या @Yann सुझाव के साथ गलत कुछ भी नहीं है, लेकिन scatter बेहतर निरंतर के लिए अनुकूल है डेटा।

धुरी रंग चक्र पर भरोसा करना आसान है और केवल कई बार प्लॉट कॉल करें (आपको संग्रह के बजाय अलग कलाकार भी मिलते हैं, जो इस तरह के असतत डेटा के लिए एक अच्छी बात है)।

डिफ़ॉल्ट रूप से, अक्ष के लिए रंग चक्र है: नीला, हरा, लाल, सियान, मैजेंटा, पीला, काला। plot को

के बाद 7 कॉल, यह चक्र वापस उन रंगों से अधिक है, इसलिए यदि आप और अधिक आइटम नहीं हैं, तो आप set it manually करने की आवश्यकता होगी होगा (या बस क्या करने के लिए इसी तरह की एक अंतर्वेशित colorbar का उपयोग कर plot की प्रत्येक कॉल में रंग निर्दिष्ट @ यैन ने ऊपर सुझाव दिया)।

+0

धन्यवाद। मैंने बहु-साजिश का विकल्प देखा, लेकिन मुझे अभी तक उपयोग की जाने वाली सुरुचिपूर्ण हालत चाल के बारे में पता नहीं था (+1)। मुझे 'स्कैटर' के बारे में असहमत होना है। मेरी समझ के लिए यह बिल्कुल इस तरह के भूखंडों के लिए है, जहां अंक स्वतंत्र हैं और कनेक्ट नहीं हैं (जो आप 'linestyle = "none" ' –

+0

सेट करके चारों ओर काम करते हैं' प्लॉट' बनाम 'स्कैटर' बिंदु दुर्भाग्यपूर्ण है और सामान्य गलतफहमी। प्वाइंट प्वाइंट्स के लिए 'प्लॉट' का उपयोग करें, और केवल तीसरे या चौथे चर के आधार पर मार्करों के आकार और/या रंग को बदलने की आवश्यकता होने पर चीजों को साजिश करने के लिए 'स्कैटर' का उपयोग करें। 'स्कैटर' एक संग्रह देता है जो प्रबंधन के लिए बहुत कठिन है। 'साजिश' _really is_ डिस्कनेक्ट किए गए बिंदुओं को साजिश करने का इरादा है, डिफ़ॉल्ट सिर्फ एक रेखा होती है। यदि आप अधिक संक्षिप्त कॉल चाहते हैं, तो 'plt.plot (x, y,' o ') 'plt.plot (x, y, linestyle =' none ', marker =' o ') जैसी ही चीज़ करेगा। । –

+0

धन्यवाद। मैं 'np.unique (iris.field (4)) का उपयोग करता हूं '(क्योंकि मेरे सीएसवी में कोलम लेबल पंक्ति नहीं है)। लेकिन इसके अलावा अब मैं अनिवार्य रूप से आपके कोड का उपयोग कर रहा हूं। मुझे वास्तव में हालत की चाल पसंद है। –

5

चाहे कुछ हद तक व्यक्तिपरक है। मैं व्यक्तिगत रूप से आपके दृष्टिकोण को 'matplotlib' तरीके से बेहतर तरीके से ढूंढता हूं। matplotlib के color मॉड्यूल से:

Colormapping आम तौर पर दो चरण होते हैं: एक डेटा सरणी पहले रेंज 0-1 मानक के अनुसार की या एक उपवर्ग का एक उदाहरण का उपयोग करते हुए पर मैप किया गया है, तो 012 श्रेणी में यह संख्या का उपयोग कर रंग में मैप किया गया है जो कोलोर्मैप के उप-वर्ग का एक उदाहरण है।

क्या मैं आपकी समस्या के संबंध में इस से ले कि आप Normalize कि तार लेता है और उन्हें 0-1 करने के लिए नक्शे का एक उपवर्ग की जरूरत है।

यहां एक उदाहरण है जो Normalize से उप-वर्ग TextNorm बनाने के लिए विरासत में मिलता है, जिसका उपयोग स्ट्रिंग को 0 से 1 तक मान में परिवर्तित करने के लिए किया जाता है। यह सामान्यीकरण एक संबंधित रंग प्राप्त करने के लिए उपयोग किया जाता है।

import matplotlib.pyplot as plt 
from matplotlib.colors import Normalize 
import numpy as np 
from numpy import ma 

class TextNorm(Normalize): 
    '''Map a list of text values to the float range 0-1''' 

    def __init__(self, textvals, clip=False): 
     self.clip = clip 
     # if you want, clean text here, for duplicate, sorting, etc 
     ltextvals = set(textvals) 
     self.N = len(ltextvals) 
     self.textmap = dict(
      [(text, float(i)/(self.N-1)) for i, text in enumerate(ltextvals)]) 
     self.vmin = 0 
     self.vmax = 1 

    def __call__(self, x, clip=None): 
     #Normally this would have a lot more to do with masking 
     ret = ma.asarray([self.textmap.get(xkey, -1) for xkey in x]) 
     return ret 

    def inverse(self, value): 
     return ValueError("TextNorm is not invertible") 

iris = np.recfromcsv("iris.csv") 
norm = TextNorm(iris.field(4)) 

plt.scatter(iris.field(0), iris.field(1), c=norm(iris.field(4)), cmap='RdYlGn') 
plt.savefig('textvals.png') 
plt.show() 

यह पैदा करता है:

enter image description here

मैं 'RdYlGn' रंग नक्शा चुना है इतना है कि यह अंक के तीन प्रकार के बीच अंतर करना आसान था। मैंने के हिस्से के रूप में clip सुविधा शामिल नहीं की है, हालांकि कुछ संशोधनों के साथ यह संभव है।

परंपरागत रूप से आप norm कीवर्ड का उपयोग scatter विधि को सामान्य परीक्षण कर सकते हैं, लेकिन scatterc कीवर्ड देखने के लिए अगर यह तार संग्रहीत करता है परीक्षण, और अगर यह होता है, तो यह मान लिया गया है कि आप अपने स्ट्रिंग मूल्यों के रूप में रंग में से गुजर रहे हैं, जैसे 'रेड', 'ब्लू' इत्यादि। तो plt.scatter(iris.field(0), iris.field(1), c=iris.field(4), cmap='RdYlGn', norm=norm) पर कॉल करना विफल रहता है। इसके बजाय मैं TextNorm का उपयोग करता हूं और 0 से 3 से लेकर मानों की सरणी वापस करने के लिए iris.field(4) पर "संचालित" करता हूं।

ध्यान दें कि +1 का मान स्टिंग के लिए वापस किया गया है textvals सूची में नहीं। यह वह जगह है जहां मास्किंग काम में आ जाएगी।

+0

मैं एक उदाहरण पर काम कर रहा हूं .... – Yann

+0

चूंकि मैंने अभी भी 'आर' (टूल्स का अवलोकन करने की कोशिश कर रहा है) में ऐसा ही किया है, मैं सोच रहा था कि '' अनक्लास 'के बराबर है या नहीं। scipy'। –

+0

@ एनी-मूस मुझे यकीन नहीं है कि आप अपनी टिप्पणी में क्या पूछ रहे हैं। आप 'अनक्लास' का उपयोग कैसे करेंगे और आप इसका क्या उपयोग करेंगे। – Yann