2012-01-20 15 views
6

मेरे पास वाई-वैल्यू की एक सरणी है जो एक रेखा बनाती है। इसके अतिरिक्त, मेरे पास 0 से 1 तक के मानों की वाई-सरणी के समान तत्वों के साथ एक सरणी है। हम इस सरणी 'z' को कॉल करेंगे। मैं y-values ​​की सरणी को साजिश करना चाहता हूं ताकि प्रत्येक बिंदु का रंग z-value के अनुरूप हो।matplotlib में gnuplot linecolor चर?

plot ’data’ using 1:2:3 with points lc variable 

यहाँ से सलाह का उपयोग करना::

gnuplot में, आप 'नियंत्रण रेखा चर' का उपयोग कर ऐसा कर सकते हैं Matplotlib scatterplot; colour as a function of a third variable , मैं एक बिखराव साजिश है, जो काम किया है का उपयोग करने में सक्षम था:

import matplotlib as mpl 
import matplotlib.pyplot as plt 

plt.scatter(x, y, c=z, s=1, edgecolors='none', cmap=mpl.cm.jet) 
plt.colorbar() 
plt.show() 

वहाँ matplotlib में साजिश विधि, इस के समान के साथ ऐसा करने के लिए एक रास्ता है?

plt.plot(x, y, c=z) 

जब मैंने उपर्युक्त कोड की कोशिश की, तो सभी पंक्तियां सिर्फ काले दिखाई दीं।

+0

gnuplot में 'नियंत्रण रेखा variable' * लाइन प्रकार सूचकांक का चयन करता है * के आधार पर:

यहाँ मेरी उदाहरण है, जो एक Basemap में प्रक्षेप पथ भूखंडों, उनमें रंग भरने उसकी ऊंचाई के अनुसार है अंतिम कॉलम का मूल्य। इसे रंग के रूप में उपयोग करने के लिए, उदाहरण का प्रयोग करें 'एलसी पैलेट जेड'। – Christoph

उत्तर

2

आप बिखराव का उपयोग कर सकते हैं:

plt.scatter(range(len(y)), y, c=z, cmap=cm.hot) 
यहाँ

आप IPython -pylab सत्र है:

In [27]: z = [0.3,0.4,0.5,0.6,0.7,0.2,0.3,0.4,0.5,0.8,0.9] 

In [28]: y = [3, 7, 5, 6, 4, 8, 3, 4, 5, 2, 9] 

In [29]: plt.scatter(range(len(y)), y, s=60, c=z, cmap=cm.hot) 
Out[29]: <matplotlib.collections.PathCollection at 0x9ec8400> 

enter image description here

आप साजिश उपयोग करना चाहते हैं तो आप बराबर व्यक्ति के रूप में प्राप्त कर सकते हैं ऊपर (पाइक्रस्ट सत्र):

>>> from matplotlib import pyplot as plt 
>>> from matplotlib import cm 
>>> y = [3,7,5,6,4,8,3,4,5,2,9] 
>>> z = [0.3,0.4,0.5,0.6,0.7,0.2,0.3,0.4,0.5,0.8,0.9] 
>>> for x, (v, c) in enumerate(zip(y,z)): 
...  plt.plot(x,v,marker='o', color=cm.hot(c)) 
...  
[<matplotlib.lines.Line2D object at 0x0000000008C42518>] 
[<matplotlib.lines.Line2D object at 0x0000000008C426D8>] 
[<matplotlib.lines.Line2D object at 0x0000000008C42B38>] 
[<matplotlib.lines.Line2D object at 0x0000000008C452B0>] 
[<matplotlib.lines.Line2D object at 0x0000000008C45438>] 
[<matplotlib.lines.Line2D object at 0x0000000008C45898>] 
[<matplotlib.lines.Line2D object at 0x0000000008C45CF8>] 
[<matplotlib.lines.Line2D object at 0x0000000008C48198>] 
[<matplotlib.lines.Line2D object at 0x0000000008C485F8>] 
[<matplotlib.lines.Line2D object at 0x0000000008C48A58>] 
[<matplotlib.lines.Line2D object at 0x0000000008C4B1D0>] 
>>> plt.show() 
>>> 
+0

धन्यवाद जॉक्विन। मैंने साजिश के बजाय स्कैटर का उपयोग करने का फैसला किया है। –

17

मुझे एक ही समस्या थी: गैर-वर्दी रंग के साथ लाइन (ओं) प्लॉट करना चाहता था, जिसे मैं तीसरे चर (z) पर निर्भर होना चाहता था।

लेकिन मैं निश्चित रूप से एक लाइन का उपयोग करना चाहता था, मार्कर नहीं (जैसा कि @ जोक्विन के जवाब में)। मुझे कक्षा matplotlib.collections.LineCollection (लिंक here) का उपयोग करके matplotlib gallery example में एक समाधान मिला।

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
from matplotlib.collections import LineCollection 
import numpy as np 

m = Basemap(llcrnrlon=-42,llcrnrlat=0,urcrnrlon=5,urcrnrlat=50, resolution='h') 
fig = plt.figure() 
m.drawcoastlines() 
m.drawcountries() 

for i in trajectorias: 
    # for each i, the x (longitude), y (latitude) and z (height) 
    # are read from a file and stored as numpy arrays 

    points = np.array([x, y]).T.reshape(-1, 1, 2) 
    segments = np.concatenate([points[:-1], points[1:]], axis=1) 

    lc = LineCollection(segments, cmap=plt.get_cmap('Spectral'), 
         norm=plt.Normalize(250, 1500)) 
    lc.set_array(z) 
    lc.set_linewidth(2) 

    plt.gca().add_collection(lc) 

axcb = fig.colorbar(lc) 
axcb.set_label('cota (m)') 

plt.show() 

height dependent trajectories

+0

बहुत अच्छा उदाहरण! – Christoph

+0

यदि आप रेखा सेगमेंट के बीच एक आसान संक्रमण चाहते हैं तो आप 'सेगमेंट = एनपी.कोनकेनेट ([अंक [: - 2], अंक [1: -1], अंक [2:]], अक्ष = 1)' इसके बजाय कर सकते हैं। – shockburner