2010-03-30 14 views
14

में कच्चे डेटा का प्रतिनिधित्व करने वाले कलरबार के साथ लॉग-सामान्यीकृत इम्शो प्लॉट कैसे खींच सकता हूं, मैं लॉग-सामान्यीकृत छवियों को साजिश करने के लिए matplotlib का उपयोग कर रहा हूं लेकिन मैं मूल कच्चे छवि डेटा को रंगीन में प्रदर्शित करना चाहता हूं [0-1] अंतराल। मुझे लगता है कि कुछ प्रकार के सामान्यीकरण ऑब्जेक्ट का उपयोग करके और डेटा को पहले से नहीं बदलकर ऐसा करने का एक और matplotlib'y तरीका है ... किसी भी मामले में, कच्चे चित्र में नकारात्मक मान हो सकते हैं।मैं matplotlib

import matplotlib.pyplot as plt 
import numpy as np 

def log_transform(im): 
    '''returns log(image) scaled to the interval [0,1]''' 
    try: 
     (min, max) = (im[im > 0].min(), im.max()) 
     if (max > min) and (max > 0): 
      return (np.log(im.clip(min, max)) - np.log(min))/(np.log(max) - np.log(min)) 
    except: 
     pass 
    return im 

a = np.ones((100,100)) 
for i in range(100): a[i] = i 
f = plt.figure() 
ax = f.add_subplot(111) 
res = ax.imshow(log_transform(a)) 
# the colorbar drawn shows [0-1], but I want to see [0-99] 
cb = f.colorbar(res) 

मैं cb.set_array का उपयोग कर की कोशिश की है, लेकिन वह कुछ भी, और cb.set_clim करने के लिए प्रकट नहीं किया था, लेकिन वह पूरी तरह से रंग rescales।

+0

तो जाहिरा तौर पर मैं एक सामान्य उदाहरण imshow में पारित कर सकते हैं और छवि मेरे लिए सामान्य हो जाएगा: आपको लगता है कि समारोह cmap_map() रसोई की किताब में दी गई साथ क्या कर सकते रेस = ax.imshow (आईएम, के आदर्श = mpl.colors.LogNorm()) फिर भी, अगर मैं एक कलरबार संलग्न करता हूं, तो कच्चे डेटा के बजाय मान सामान्यीकृत vals पर सेट होते हैं। –

उत्तर

27

हाँ, वहाँ है! LogNorm का प्रयोग करें। यहां एक उपयोगिता से कोड उद्धरण दिया गया है जिसे मैंने लॉग स्केल पर भ्रम मैट्रिस प्रदर्शित करने के लिए लिखा था।

from pylab import figure, cm 
from matplotlib.colors import LogNorm 
# C = some matrix 
f = figure(figsize=(6.2,5.6)) 
ax = f.add_axes([0.17, 0.02, 0.72, 0.79]) 
axcolor = f.add_axes([0.90, 0.02, 0.03, 0.79]) 
im = ax.matshow(C, cmap=cm.gray_r, norm=LogNorm(vmin=0.01, vmax=1)) 
t = [0.01, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0] 
f.colorbar(im, cax=axcolor, ticks=t, format='$%.2f$') 
f.show() 
+0

महान जवाब! लेकिन आपने दूसरी-से-आखिरी पंक्ति पर प्रारूप में $ प्रतीकों को क्यों शामिल किया? यदि आप उन्हें छोड़ देते हैं, तो धुरी लेबल एक सान-सेरिफ़ फ़ॉन्ट में होंगे और बाकी अक्ष अक्षरों से मेल खाते हैं। – DanHickstein

+0

अच्छा बिंदु; मैंने शायद इसे मौजूदा कोड से कॉपी और चिपकाया है। मैं अपने साजिश पाठ को लाटेक्सिज़ करना चाहता हूं। –

6

तुम सिर्फ छवि जा लॉग-सामान्यीकृत चाहते हैं (विवरण को बढ़ाने के लिए), लेकिन नहीं डेटा (भौतिक मूल्यों को बचाने के लिये), तो आप रंग मैप पर ही परिवर्तन आवेदन करना होगा। http://www.scipy.org/Cookbook/Matplotlib/ColormapTransformations