2011-04-29 15 views
8

मैं एक बिंदु के रंग मान को जानना चाहता हूं जब मैं matplotlib में imshow() का उपयोग करता हूं। Matplotlib में इवेंट हैंडलर के माध्यम से इस जानकारी को खोजने का कोई तरीका है (वैसे ही जैसे आपके क्लिक के एक्स, वाई निर्देशांक उपलब्ध हैं)? यदि नहीं, तो मुझे यह जानकारी कैसे मिलेगी?matplotlib के लिए imshow में रंग मान?

विशेष रूप से मैं इस तरह के मामले के बारे में सोच रहा हूँ:

imshow(np.random.rand(10,10)*255, interpolation='nearest') 

धन्यवाद! - एरिन

उत्तर

10

यहां एक निष्क्रिय समाधान है। यह केवल interpolation = 'nearest' के लिए काम करता है। मैं अभी भी (बजाय, वाई गोलाई उठाया एक्स और मूल सरणी से चयन।) एक क्लीनर तरीका छवि से अंतर्वेशित मान प्राप्त करने के लिए के लिए देख रहा हूँ वैसे भी:

from matplotlib import pyplot as plt 
import numpy as np 

im = plt.imshow(np.random.rand(10,10)*255, interpolation='nearest') 
fig = plt.gcf() 
ax = plt.gca() 

class EventHandler: 
    def __init__(self): 
     fig.canvas.mpl_connect('button_press_event', self.onpress) 

    def onpress(self, event): 
     if event.inaxes!=ax: 
      return 
     xi, yi = (int(round(n)) for n in (event.xdata, event.ydata)) 
     value = im.get_array()[xi,yi] 
     color = im.cmap(im.norm(value)) 
     print xi,yi,value,color 

handler = EventHandler() 

plt.show() 
+1

धन्यवाद, पॉल! यही वह है जिसकी तलाश में मैं हूं। मैंने इस प्रश्न से दो पंक्तियों को खारिज कर दिया है: http://stackoverflow.com/questions/214359/converting-hex-to-rgb-and-vice-versa#214657 और अब आरजीबी हेक्स मानों को भी प्रिंट कर सकते हैं:) –

1

ऊपर समाधान केवल एक के लिए काम करता एकल छवि यदि आप एक ही स्क्रिप्ट में दो या दो से अधिक छवियों को प्लॉट करते हैं, तो "इनएक्स" घटना दोनों धुरी के बीच कोई फर्क नहीं पड़ेगी। आपको कभी पता नहीं चलेगा कि आप किस अक्ष पर क्लिक कर रहे हैं, इसलिए आप नहीं जान पाएंगे कि कौन सा छवि मान प्रदर्शित होना चाहिए।

1

यदि 'रंग मान' से आपका मतलब ग्राफ पर क्लिक किए गए बिंदु पर सरणी का मान है, तो यह उपयोगी है। आप अंक पर क्लिक करें और वापस आ numpy सरणी के सूचकांक हैं

from collect_points import collect_points 
import numpy as np 

array = np.random.rand(10,10)*255 
indices = collect_points(array).indices() 

एक साजिश रचने खिड़की से दिखाई देना चाहिए:

from matplotlib import pyplot as plt 
import numpy as np 


class collect_points(): 
    omega = [] 
    def __init__(self,array): 
     self.array = array 
    def onclick(self,event): 
     self.omega.append((int(round(event.ydata)), int(round(event.xdata)))) 

    def indices(self): 
     plot = plt.imshow(self.array, cmap = plt.cm.hot, interpolation = 'nearest', origin= 'upper') 
     fig = plt.gcf() 
     ax = plt.gca() 
     zeta = fig.canvas.mpl_connect('button_press_event', self.onclick) 
     plt.colorbar() 
     plt.show() 
     return self.omega 

प्रयोग होगा कुछ की तरह।

0

आप नीचे दिए गए की तरह कुछ की कोशिश कर सकते:

x, y = len(df.columns.values), len(df.index.values) 

# subplot etc 

# Set values for x/y ticks/labels 
ax.set_xticks(np.linspace(0, x-1, x)) 
ax.set_xticklabels(ranges_df.columns) 
ax.set_yticks(np.linspace(0, y-1, y)) 
ax.set_yticklabels(ranges_df.index) 

for i, j in product(range(y), range(x)): 
    ax.text(j, i, '{0:.0f}'.format(ranges_df.iloc[i, j]), 
    size='small', ha='center', va='center') 
+0

अच्छा चिल्लाओ, धन्यवाद एंड्रेस – cardycakes

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