python - Matplotlib में आकृति से रंग बारबार इंस्टेंस कैसे प्राप्त करें




colorbar (2)

सब। Imagedata बदल रहा है जब मैं एक आंकड़ा के रंग पट्टी को अद्यतन करना चाहते हैं तो ऐसा कुछ:

img = misc.lena()
fig = plt.figure()
ax = plt.imshow(im)
plt.colorbar(ax)
newimg = img+10*np.randn(512,512)

def update_colorbar(fig,ax,newimg):
    cbar = fig.axes[1]
    ax.set_data(newimg)
    cbar.update_normal(ax)
    plt.draw()

लेकिन ऐसा प्रतीत होता है कि अंजीर से निकलने वाले परिणाम। एक्सिस () में रंग पट्टी का उदाहरण नहीं है जैसे मुझे उम्मीद थी मैं संभवत: अद्यतन फ़ंक्शन के तर्क के रूप में कलरबार इंस्टेंस को भी पार कर सकता हूं, लेकिन मैंने सोचा था कि सिर्फ एक अंजीर पैरामीटर पार करने में काफी अच्छा हो सकता है क्या कोई आंकड़ा से रंग पट्टी को पुनः प्राप्त करने के बारे में थोड़ा सा समझा सकता है? या क्यों 'अंजीर। एक्सिस ()' अक्षांश या कोलबार उदाहरण वापस नहीं करता है, लेकिन सिर्फ ऐक्सिस या एक्ससस्पलोट? मुझे लगता है कि मुझे अक्ष / चित्रा के सामान की अधिक समझ की आवश्यकता है.धन्यवाद!


सबसे पहले, मुझे लगता है कि आप अक्षों (मूल रूप से, भूखंड), आंकड़ा, स्केलर मैप करने योग्य (इस मामले में छवि,) और कलरबार उदाहरण के बीच में थोड़ा भ्रमित हो रहे हैं।

figure है कि साजिश अंदर की गई खिड़की है। यह शीर्ष-स्तरीय कंटेनर है।

प्रत्येक आंकड़े में आमतौर पर एक या एक से अधिक axes । ये भूखंड / सबप्लॉट हैं

Colorbars आंकड़ा के अंदर भी हैं रंगबार जोड़ना एक नया कुल्हाड़ी बनाता है (जब तक कि आप अन्यथा निर्दिष्ट नहीं करते) में रंगबार प्रदर्शित करने के लिए। (यह आम तौर पर उसी कुल्हाड़ी में छवि के रूप में प्रदर्शित नहीं किया जा सकता, क्योंकि रंगबार को अपनी एक्स और वाई सीमाएं होने की आवश्यकता होती है, आदि।)

आपकी कुछ भ्रम इस तथ्य के कारण है कि आप राज्य-मशीन इंटरफ़ेस और ओओ इंटरफ़ेस मिश्रण कर रहे हैं। ऐसा करने के लिए ठीक है, लेकिन आपको ओ ओ इंटरफ़ेस को समझना होगा।

fig.axes[1] का उदाहरण नहीं है यह कुल्हाड़ियों है कि रंग बार में प्लॉट किया जाता है। (इसके अलावा, fig.axes[1]fig.axes[1] केवल आंकड़ों में दूसरी कुल्हाड़ी है। यह कुल्हाड़ियों का होना होता है, जो एक सबप्लॉट और एक रंग पट्टी के साथ एक आकृति के लिए है ऐसा आमतौर पर मामला नहीं होगा।)

यदि आप रंग बार अपडेट करना चाहते हैं, तो आपको रंग पट्टी आवृत्ति पर रखने की आवश्यकता होगी जो कि रंग colorbar रिटर्न करती है।

यहां एक उदाहरण दिया गया है कि आप सामान्य रूप से कैसे बातें करते हैं:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random((10,10)) # Generate some random data to plot

fig, ax = plt.subplots() # Create a figure with a single axes.
im = ax.imshow(data)     # Display the image data
cbar = fig.colorbar(im)  # Add a colorbar to the figure based on the image

यदि आप colorbar को अपडेट करने के लिए update_normal का उपयोग करने जा रहे हैं, तो यह उम्मीद करता है कि ScalarMappable (उदाहरण के लिए एक छवि जो imshow द्वारा बनाई गई है, संग्रह जो scatter बनाता है, ContourSet जो बनाता है, आदि) पारित किया जाना है। इसके साथ ही, आप पूरी तरह से पूरी चीज़ की बजाय सीमा को अपडेट करना चाहते हैं।) ऊपर दिए गए कोड के मामले में, आप cbar.update_normal(im) कॉल cbar.update_normal(im)

हालांकि, आपने एक नया AxesImage नहीं बनाया है, आपने अभी डेटा बदल दिया है। इसलिए, आप शायद बस करना चाहते हैं:

cbar.set_clim(newimg.min(), newimg.max())

कभी-कभी रंगबारी को पुनः प्राप्त करने के लिए उपयोगी हो सकता है, भले ही यह किसी चर में न हो। इस मामले में, प्लॉट से रंग पट्टी को पुनः प्राप्त करना संभव है:

#create a test image
img=np.arange(20).reshape(5,4)
plt.imshow(img)
plt.colorbar()

ax=plt.gca()        #plt.gca() for current axis, otherwise set appropriately.
im=ax.images        #this is a list of all images that have been plotted
cb=im[-1].colorbar   #in this case I assume to be interested to the last one plotted, otherwise use the appropriate index

अब आप cb पर काम कर सकते हैं जैसे कि यह संग्रहीत किया गया था, एक्समेन्ट बदल रहा है या अन्य टिप्पणियों में बताया गया कॉलिंग अद्यतन के रूप में। या आप इसे cb.remove() हटा सकते हैं और इसे plt.colorbar() साथ पुन: बनाएँ।

plt.draw() या show को प्लॉट को अपडेट करने के बाद कहा जाना चाहिए।

वैसे, छवि को रंगबारी से जुड़ा हुआ है और यह cb.mappable प्राप्त किया जा सकता है।





colorbar