python - Matplotlib-लाइन प्लॉट के अनुक्रम में रंग पट्टी जोड़ें




colorbar (3)

मेरे पास एक वैरिएबल जेड के कई अलग-अलग मानों के लिए दो चर (x, y) के लिए लाइन प्लॉट का अनुक्रम है। मैं सामान्य रूप से इस तरह की किंवदंतियों के साथ लाइन प्लॉट जोड़ता हूं:

import matplotlib.pyplot as plt

fig = plt.figure()
ax  = fig.add_subplot(111)
# suppose mydata is a list of tuples containing (xs, ys, z) 
# where xs and ys are lists of x's and y's and z is a number. 
legns = []
for(xs,ys,z) in mydata:
   pl = ax.plot(xs,ys,color = (z,0,0))
   legns.append("z = %f"%(z))
ax.legends(legns) 
plt.show()

लेकिन मेरे पास बहुत सारे ग्राफ हैं और किंवदंतियों में ग्राफ शामिल होगा। मैं रंगीन के अनुरूप जेड के मान को इंगित करने वाला एक रंगीन रंग चाहता हूं। मुझे गैलेरी में ऐसा कुछ नहीं मिल रहा है और मेरे सभी प्रयास कलरबार से निपटने में असफल रहे। जाहिर है, मुझे कलरबार जोड़ने की कोशिश करने से पहले भूखंडों का संग्रह बनाना होगा।

क्या इसे करने का कोई आसान तरीका है? धन्यवाद।

संपादित करें (स्पष्टीकरण):

मैं ऐसा कुछ करना चाहता था:

import matplotlib.pyplot as plt
import matplotlib.cm     as cm

fig = plt.figure()
ax  = fig.add_subplot(111)
mycmap = cm.hot
# suppose mydata is a list of tuples containing (xs, ys, z) 
# where xs and ys are lists of x's and y's and z is a number between 0 and 1
plots = []
for(xs,ys,z) in mydata:
   pl = ax.plot(xs,ys,color = mycmap(z))
   plots.append(pl)
fig.colorbar(plots)
plt.show()

लेकिन यह Matplotlib संदर्भ के अनुसार काम नहीं करेगा क्योंकि भूखंडों की एक सूची "मैपबल" नहीं है, जो भी इसका मतलब है।

मैंने LineCollection का उपयोग कर एक वैकल्पिक साजिश समारोह बनाया है:

def myplot(ax,xs,ys,zs, cmap):
    plot = lc([zip(x,y) for (x,y) in zip(xs,ys)], cmap = cmap)
    plot.set_array(array(zs))
    x0,x1 = amin(xs),amax(xs)
    y0,y1 = amin(ys),amax(ys)
    ax.add_collection(plot)
    ax.set_xlim(x0,x1)
    ax.set_ylim(y0,y1)
    return plot

एक्स और ys एक्स और वाई निर्देशांक की सूचियों की सूचियां हैं और zs प्रत्येक पंक्ति को रंगीन करने के लिए विभिन्न स्थितियों की एक सूची है। हालांकि यह एक झुकाव की तरह थोड़ा महसूस करता है ... मैंने सोचा था कि ऐसा करने के लिए एक और साफ तरीका होगा। मुझे plt.plot() फ़ंक्शन की लचीलापन पसंद है।


(मुझे पता है कि यह एक पुराना सवाल है लेकिन ...) Colorbars को matplotlib.cm.ScalarMappable आवश्यकता होती है, plt.plot रेखाओं का उत्पादन करता है जो स्केलर मैपबल नहीं हैं, इसलिए, एक रंगीन बनाने के लिए, हमें एक बनाने की आवश्यकता होगी स्केलर मैपेबल।

ठीक। तो एक ScalarMappable के निर्माता एक cmap और एक norm उदाहरण लेता है। (मानदंड स्केल डेटा 0-1, cmaps के लिए पहले से ही काम कर चुके हैं और 0-1 के बीच एक संख्या लेते हैं और एक रंग देता है)। तो आपके मामले में:

import matplotlib.pyplot as plt
sm = plt.cm.ScalarMappable(cmap=my_cmap, norm=plt.normalize(min=0, max=1))
plt.colorbar(sm)

चूंकि आपका डेटा पहले से 0-1 की सीमा में है, इसलिए आप sm निर्माण को सरल बना सकते हैं:

sm = plt.cm.ScalarMappable(cmap=my_cmap)

उम्मीद है कि किसी की मदद करता है।

संपादित करें : matplotlib v1.2 या इससे अधिक के लिए कोड बन जाता है:

import matplotlib.pyplot as plt
sm = plt.cm.ScalarMappable(cmap=my_cmap, norm=plt.normalize(vmin=0, vmax=1))
# fake up the array of the scalar mappable. Urgh...
sm._A = []
plt.colorbar(sm)

संपादित करें : matplotlib v1.3 या इससे अधिक के लिए कोड बन जाता है:

import matplotlib.pyplot as plt
sm = plt.cm.ScalarMappable(cmap=my_cmap, norm=plt.Normalize(vmin=0, vmax=1))
# fake up the array of the scalar mappable. Urgh...
sm._A = []
plt.colorbar(sm)

Plt.plot () का उपयोग करते हुए इसे करने का एक तरीका यहां दिया गया है। असल में, आप एक फेंकने वाली साजिश बनाते हैं और वहां से रंगीन पट्टी प्राप्त करते हैं।

import matplotlib as mpl
import matplotlib.pyplot as plt

min, max = (-40, 30)
step = 10

# Setting up a colormap that's a simple transtion
mymap = mpl.colors.LinearSegmentedColormap.from_list('mycolors',['blue','red'])

# Using contourf to provide my colorbar info, then clearing the figure
Z = [[0,0],[0,0]]
levels = range(min,max+step,step)
CS3 = plt.contourf(Z, levels, cmap=mymap)
plt.clf()

# Plotting what I actually want
X=[[1,2],[1,2],[1,2],[1,2]]
Y=[[1,2],[1,3],[1,4],[1,5]]
Z=[-40,-20,0,30]
for x,y,z in zip(X,Y,Z):
    # setting rgb color based on z normalized to my range
    r = (float(z)-min)/(max-min)
    g = 0
    b = 1-r
    plt.plot(x,y,color=(r,g,b))
plt.colorbar(CS3) # using the colorbar info I got from contourf
plt.show()

यह थोड़ा अपर्याप्त है, लेकिन सुविधाजनक है। यदि आप एकाधिक प्लॉट बनाते हैं तो यह भी बहुत अपमानजनक नहीं है क्योंकि आप इसके लिए जानकारी पुन: उत्पन्न किए बिना plt.colorbar () को कॉल कर सकते हैं।


यहां और द्वारा दिए गए शीर्ष उत्तर से प्रेरित एक सरल सरलीकृत उदाहरण है (महान विचार के लिए धन्यवाद!):

1. अलग रंग पट्टी

अलग रंग mpl.cm.get_cmap() अधिक शामिल है, क्योंकि mpl.cm.get_cmap() द्वारा उत्पन्न mpl.cm.get_cmap() एक mappable छवि नहीं है जो एक colorbar() तर्क के रूप में आवश्यक है। नीचे दिखाए गए एक डमी मैप्टेबल को उत्पन्न करने की आवश्यकता है:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

n_lines = 5
x = np.linspace(0, 10, 100)
y = np.sin(x[:, None] + np.pi * np.linspace(0, 1, n_lines))
c = np.arange(1, n_lines + 1)

cmap = mpl.cm.get_cmap('jet', n_lines)

fig, ax = plt.subplots(dpi=100)
# Make dummie mappable
dummie_cax = ax.scatter(c, c, c=c, cmap=cmap)
# Clear axis
ax.cla()
for i, yi in enumerate(y.T):
    ax.plot(x, yi, c=cmap(i))
fig.colorbar(dummie_cax, ticks=c)
plt.show();

यह एक अलग रंगीन रंग के साथ एक साजिश का उत्पादन करेगा:

2. निरंतर रंगीन पट्टी

निरंतर colorbar कम शामिल है, क्योंकि mpl.cm.ScalarMappable() हमें mpl.cm.ScalarMappable() लिए "छवि" प्राप्त करने की अनुमति देता है।

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl


n_lines = 5
x = np.linspace(0, 10, 100)
y = np.sin(x[:, None] + np.pi * np.linspace(0, 1, n_lines))
c = np.arange(1, n_lines + 1)

norm = mpl.colors.Normalize(vmin=c.min(), vmax=c.max())
cmap = mpl.cm.ScalarMappable(norm=norm, cmap=mpl.cm.jet)
cmap.set_array([])

fig, ax = plt.subplots(dpi=100)
for i, yi in enumerate(y.T):
    ax.plot(x, yi, c=cmap.to_rgba(i + 1))
fig.colorbar(cmap, ticks=c)
plt.show();

यह एक सतत रंगीन रंग के साथ एक साजिश का उत्पादन करेगा:

[साइड नोट] इस उदाहरण में, मैं व्यक्तिगत रूप से नहीं जानता कि cmap.set_array([]) क्यों आवश्यक है (अन्यथा हमें त्रुटि संदेश मिलेंगे)। अगर कोई हुड के नीचे सिद्धांतों को समझता है, तो कृपया टिप्पणी करें :)





colorbar