2013-06-18 6 views
17

में पिक्सेल मानों के आधार पर पारदर्शिता सेट करना मैं एक पेपर के लिए कुछ आंकड़े प्लॉट करने के लिए मैटलप्लिब का उपयोग करने का प्रयास कर रहा हूं। मैं 2 डी NumPy सरणी में डेटा के दो सेट है: एक ASCII hillshade रेखापुंज जो मैं खुशी से साजिश और का उपयोग कर ठीक कर सकते हैं:Matplotlib

import matplotlib.pyplot as pp 
import numpy as np 

hillshade = np.genfromtxt('hs.asc', delimiter=' ', skip_header=6)[:,:-1] 

pp.imshow(hillshade, vmin=0, vmax=255) 
pp.gray() 
pp.show() 

कौन देता है:

Hillshade

और एक दूसरे ascii रेखापुंज जो रूपरेखा परिदृश्य में बहने वाली नदी के गुण। इस डेटा को उपर्युक्त तरीके से प्लॉट किया जा सकता है, हालांकि सरणी में मान जो नदी नेटवर्क से मेल नहीं खाते हैं, को 99 99 का डेटा मान नहीं दिया जाता है। इसका उद्देश्य यह है कि कोई डेटा मान पारदर्शी होने के लिए सेट न हो ताकि नदी के मूल्य पहाड़ी छाया को खत्म कर दें।

यह नदी डेटा है, आदर्श रूप से 0 के रूप में प्रतिनिधित्व हर पिक्सेल पूरी तरह से पारदर्शी होगा।

River data

ऐसा लगता है मैं एक RGBA सरणी में अपने डेटा को बदलने और अवांछित कोशिकाओं को पारदर्शी बनाने के लिए ही अल्फा मूल्यों को निर्धारित करने में सक्षम हो सकता है इस पर कुछ शोध किया करने के बाद। हालांकि, नदी सरणी में मान फ़्लोट होते हैं और इन्हें परिवर्तित नहीं किया जा सकता है (क्योंकि मूल मान आकृति का पूरा बिंदु हैं) और मेरा मानना ​​है कि imshow फ़ंक्शन केवल आरजीबीए प्रारूप का उपयोग करते हुए हस्ताक्षरित पूर्णांक ले सकता है।

क्या इस सीमा के आसपास कोई रास्ता है? मैंने आशा की थी कि मैं बस पिक्सेल मान और अल्फा मूल्य के साथ एक टुपल बना सकता हूं और उन्हें इस तरह साजिश कर सकता हूं, लेकिन ऐसा प्रतीत नहीं होता है।

मेरे पास डेटा डेटा की पीएनजी फ़ाइल बनाने के प्रयास के लिए PIL के साथ एक नाटक भी है, डेटा डेटा पारदर्शी के साथ, हालांकि यह स्वचालित रूप से पिक्सेल मानों को 0-255 पर स्केल करने लगता है, जिससे मुझे आवश्यक मूल्यों को खोना पड़ता है सम्भाल कर रखना।

मैं इस समस्या पर किसी भी अंतर्दृष्टि का स्वागत करता हूं।

उत्तर

31

बस अपनी "नदी" सरणी मास्क करें।

उदा।

rivers = np.ma.masked_where(rivers == 0, rivers) 

इस तरह से दो भूखंडों डालने की एक त्वरित उदाहरण के रूप में:

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

# Generate some data... 
gray_data = np.arange(10000).reshape(100, 100) 

masked_data = np.random.random((100,100)) 
masked_data = np.ma.masked_where(masked_data < 0.9, masked_data) 

# Overlay the two images 
fig, ax = plt.subplots() 
ax.imshow(gray_data, cmap=cm.gray) 
ax.imshow(masked_data, cmap=cm.jet, interpolation='none') 
plt.show() 

enter image description here

इसके अलावा, एक तरफ ध्यान दें पर, imshow खुशी से अपने RGBA प्रारूप के लिए तैरता को स्वीकार करेंगे। यह उम्मीद करता है कि सबकुछ 0 और 1.

+1

शानदार साथ clim का समायोजन करके अपनी सीमा बदल सकते हैं! धन्यवाद। मैंने इस तरह के एक सुरुचिपूर्ण समाधान की उम्मीद की थी, लेकिन स्पष्ट रूप से गलत पेड़ को भौंकने वाला था। – sgrieve

+0

क्या यह 2 सरणी तक सीमित है या यह 3 या उससे अधिक के साथ काम करेगा? – MyCarta

+2

@ माईकार्टा - यह जितना चाहें उतने एरे के साथ काम करेगा, लेकिन आपका मुखौटा अभिव्यक्ति जटिल हो सकता है। Numpy arrays के साथ बूलियन अभिव्यक्तियों को गठबंधन करने के लिए, आपको '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'के बजाय' '' '' '' '' '' '' '' और (बी> 5) '' 5> और बी> 5' के बजाय। आप ऑपरेटरों को भी उसी तरह से श्रृंखलाबद्ध नहीं कर सकते हैं, उदा। आपको '2> x> 5' के बजाय' (x> 2) और (x <5) 'की आवश्यकता है। –

10

मास्क किए गए सरणी का उपयोग करके इसे करने का एक वैकल्पिक तरीका यह निर्धारित करना है कि कलर मैप कैसे कम से कम clim के नीचे क्लिपिंग मानों के साथ सौदा करता है (जो किंग किंगटन के लापरवाही से उपयोग कर रहा है उदाहरण):

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

# Generate some data... 
gray_data = np.arange(10000).reshape(100, 100) 

masked_data = np.random.random((100,100)) 

my_cmap = cm.jet 
my_cmap.set_under('k', alpha=0) 


# Overlay the two images 
fig, ax = plt.subplots() 
ax.imshow(gray_data, cmap=cm.gray) 
im = ax.imshow(masked_data, cmap=my_cmap, 
      interpolation='none', 
      clim=[0.9, 1]) 
plt.show() 

example

भी ऊपर से कतरन के लिए एक set_over रूप

वहाँ और डेटा में कैसे रंग नक्शे हैंडल 'बुरे' मूल्यों की स्थापना के लिए एक set_bad

यह कर का एक लाभ यह इस तरह से तुम सिर्फ im.set_clim([bot, top])