2012-10-18 19 views
23

के रूप में मैं जानना चाहता हूं कि मैटलप्लिब के स्कैटर फ़ंक्शन रंग बिंदु को तीसरे चर द्वारा कैसे बनाया जाए।matplotlib स्कैटर प्लॉट रंग तीसरे चर के

प्रश्न gnuplot linecolor variable in matplotlib? और Matplotlib scatterplot; colour as a function of a third variable मिलती-जुलती क्वेरी उत्पन्न, तथापि, उन सवालों के जवाब मेरी समस्या का समाधान नहीं है: बिखराव समारोह में c=arraywhichspecifiespointcolour के उपयोग केवल भरण रंग, नहीं बढ़त रंग सेट करता है। इसका अर्थ यह है कि c=arr... का उपयोग markersymbol='+' का उपयोग करते समय विफल रहता है, उदाहरण के लिए (क्योंकि उस मार्कर को भरना नहीं है, केवल किनारों पर)। मैं बिंदुओं को एक तीसरे चर द्वारा विश्वसनीय रूप से रंगना चाहता हूं, भले ही किस प्रतीक का उपयोग किया जाए।

क्या Matplotlib के स्कैटर फ़ंक्शन के साथ इसे प्राप्त करने का कोई तरीका है?

+0

जब मैं 'marker = '+' सेट करता हूं तो मुझे रंगीन' + 'प्रतीक मिलते हैं। – Avaris

+0

@Avaris: मेरे लिए भी काम करता है। मैंने तदनुसार अपना जवाब अपडेट किया। –

उत्तर

28

यह मेरे लिए काम करता है, matplotlib 1.1 का उपयोग कर:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.arange(10) 
y = np.sin(x) 

plt.scatter(x, y, marker='+', s=150, linewidths=4, c=y, cmap=plt.cm.coolwarm) 
plt.show() 

परिणाम:

enter image description here

वैकल्पिक रूप से, एन अंक के लिए, आकार (एन, 3 के साथ RGB कलर मूल्यों की एक सरणी बनाने), और इसे edgecolorsscatter() की कीवर्ड तर्क:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 20, 100) 
y = np.sin(x) 
z = x + 20 * y 

scaled_z = (z - z.min())/z.ptp() 
colors = plt.cm.coolwarm(scaled_z) 

plt.scatter(x, y, marker='+', edgecolors=colors, s=150, linewidths=4) 
plt.show() 

परिणाम: enter image description here

उदाहरण रेंज [0,1] के z मूल्यों स्केलिंग, और रंग मैप मापे गए मान के साथ plt.cm.coolwarm फोन करके RGBA मान हो जाता है यही कारण है कि। इस तरह से कहा जाता है, एक matplotlib colormap आरजीबीए मानों की एक सरणी देता है, प्रत्येक पंक्ति संबंधित इनपुट मान का रंग दे रही है। उदाहरण के लिए:

>>> t = np.linspace(0, 1, 5) 
>>> t 
array([ 0. , 0.25, 0.5 , 0.75, 1. ]) 
>>> plt.cm.coolwarm(t) 
array([[ 0.2298, 0.2987, 0.7537, 1. ], 
     [ 0.5543, 0.6901, 0.9955, 1. ], 
     [ 0.8674, 0.8644, 0.8626, 1. ], 
     [ 0.9567, 0.598 , 0.4773, 1. ], 
     [ 0.7057, 0.0156, 0.1502, 1. ]]) 
+0

आपके उत्तर के लिए धन्यवाद वॉरेन। दुर्भाग्यवश, आपका पहला उदाहरण मेरे लिए ब्लैक प्लस में परिणाम देता है। मुझे नहीं पता क्यों। mpl .__ संस्करण__ 1.0.1 देता है, अगर यह प्रासंगिक है। मुझे 'एजकॉर्ड्स' को आरजीबीएस की एक सूची पास करने का प्रयास करना पड़ सकता है, लेकिन इसका मतलब है कि मुझे उन्हें 'z' मानों और रंगमंच से मैन्युअल रूप से बनाना है, है ना? – user1082930

+0

मैं संस्करण 1.1 का उपयोग कर रहा हूं। 1.0 और 1.1 के बीच मार्कर कोड में कुछ बदलाव हुए थे, इसलिए यह समस्या हो सकती है। मैंने रंगों के लिए 'z' मान मैपिंग का एक तरीका दिखाने के लिए दूसरा उदाहरण अपडेट किया है (लेकिन मैंने matplotlib 1.0 में कोशिश नहीं की है)। –

+0

हाय वॉरेन। बस इस पर अनुवर्ती करने के लिए, जब मैं matplotlib के एक नए (1.1) संस्करण का उपयोग करता हूं, तो मुझे वास्तव में एक ही कोड के साथ रंगीन अंक मिलते हैं। हल हल माना जाता है। धन्यवाद! – user1082930

संबंधित मुद्दे