Imshow: हद और पहलू


85

मैं एक सॉफ्टवेयर सिस्टम लिख रहा हूं जो 3 डी डेटासेट के माध्यम से स्लाइस और अनुमानों की कल्पना करता है। मैं उपयोग कर रहा हूं matplotlibऔर विशेष रूप imshowसे छवि बफ़र्स की कल्पना करने के लिए मैं अपने विश्लेषण कोड से वापस आ गया हूं।

चूंकि मैं प्लॉट कुल्हाड़ियों के साथ छवियों को एनोटेट करना चाहता हूं, इसलिए मैं उस सीमा कीवर्ड का उपयोग करता हूं imshowजो छवि बफर पिक्सेल को मैप करने के लिए आपूर्ति करता है एक डेटा स्पेस समन्वय प्रणाली के लिए निर्देशांक।

दुर्भाग्य से, matplotlibइकाइयों के बारे में पता नहीं है। कहो (एक कृत्रिम उदाहरण लेते हुए) जिसे मैं आयामों के साथ एक छवि बनाना चाहता हूं 1000 m X 1 km। उस मामले में हद कुछ इस तरह होगी [0, 1000, 0, 1]। भले ही छवि सरणी वर्गाकार है, क्योंकि हद कीवर्ड द्वारा निहित पहलू अनुपात 1000 है, जिसके परिणामस्वरूप प्लॉट कुल्हाड़ियों का भी अनुपात अनुपात 1000 है।

क्या यह तब भी संभव है जब मैं हद तक कीवर्ड का उपयोग करके स्वचालित रूप से उत्पन्न प्रमुख टिक मार्क और लेबल रखते हुए प्लॉट के पहलू अनुपात को मजबूर कर सकूं?

जवाबों:


141

आप इसे मैन्युअल रूप से छवि के पहलू को सेट करके कर सकते हैं (या यह आंकड़ा की सीमा को भरने के लिए ऑटो-स्केल देकर)।

डिफ़ॉल्ट रूप से, imshowभूखंड के पहलू को 1 पर सेट करता है, क्योंकि यह अक्सर वही होता है जो लोग छवि डेटा के लिए चाहते हैं।

आपके मामले में, आप कुछ ऐसा कर सकते हैं:

import matplotlib.pyplot as plt
import numpy as np

grid = np.random.random((10,10))

fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, figsize=(6,10))

ax1.imshow(grid, extent=[0,100,0,1])
ax1.set_title('Default')

ax2.imshow(grid, extent=[0,100,0,1], aspect='auto')
ax2.set_title('Auto-scaled Aspect')

ax3.imshow(grid, extent=[0,100,0,1], aspect=100)
ax3.set_title('Manually Set Aspect')

plt.tight_layout()
plt.show()

यहाँ छवि विवरण दर्ज करें


धन्यवाद। अजीब बात है कि डॉक्स scalarविकल्प के बारे में कुछ नहीं कहते हैं । यह y-axisदिए गए स्केलर द्वारा पैमाने पर दिखाई देता है ।
orodbhen

@JoeKington व्यक्तिगत पिक्सल का आकार प्राप्त करना संभव है। यह आकार डेटा सेट के आकार पर निर्भर करता है और आपके मामले की तरह एक सतत भूखंड के लिए टाइल का एक पैचवर्क बना सकता है।
अलेक्जेंडर सीस्का

4

से plt.imshow()आधिकारिक गाइड, हम उस पहलू नियंत्रण पता कुल्हाड़ियों का पहलू अनुपात। वैसे मेरे शब्दों में, पहलू x इकाई और y इकाई का अनुपात है । अधिकांश समय हम इसे 1 के रूप में रखना चाहते हैं क्योंकि हम अनायास ही आंकड़ों को विकृत नहीं करना चाहते हैं। हालांकि, वास्तव में ऐसे मामले हैं जिन्हें हमें 1 के अलावा एक पहलू को निर्दिष्ट करने की आवश्यकता है। प्रश्नकर्ता ने एक अच्छा उदाहरण प्रदान किया कि x और y अक्ष में अलग-अलग भौतिक इकाइयाँ हो सकती हैं। मान लेते हैं कि x किमी में है और m में y है। इसलिए 10x10 डेटा के लिए, सीमा [0,10 किमी, 0,10 मीटर] = [0, 10000 मीटर, 0, 10 मीटर] होनी चाहिए। ऐसे मामले में, यदि हम डिफ़ॉल्ट पहलू = 1 का उपयोग करना जारी रखते हैं, तो आंकड़े की गुणवत्ता वास्तव में खराब है। इसलिए हम अपना आंकड़ा अनुकूलित करने के लिए पहलू = 1000 निर्दिष्ट कर सकते हैं। निम्नलिखित कोड इस विधि का वर्णन करते हैं।

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
rng=np.random.RandomState(0)
data=rng.randn(10,10)
plt.imshow(data, origin = 'lower',  extent = [0, 10000, 0, 10], aspect = 1000)

यहाँ छवि विवरण दर्ज करें

फिर भी, मुझे लगता है कि एक विकल्प है जो प्रश्नकर्ता की मांग को पूरा कर सकता है। हम बस [0,10,0,10] के रूप में सीमा निर्धारित कर सकते हैं और इकाइयों को निरूपित करने के लिए अतिरिक्त xy अक्ष लेबल जोड़ सकते हैं। निम्नानुसार कोड।

plt.imshow(data, origin = 'lower',  extent = [0, 10, 0, 10])
plt.xlabel('km')
plt.ylabel('m')

यहाँ छवि विवरण दर्ज करें

एक सही आंकड़ा बनाने के लिए , हमें हमेशा यह ध्यान रखना चाहिए कि , x_max-x_min = x_res * data.shape[1]और y_max - y_min = y_res * data.shape[0]कहाँ extent = [x_min, x_max, y_min, y_max]। डिफ़ॉल्ट रूप से aspect = 1, जिसका अर्थ है कि इकाई पिक्सेल वर्ग है। यह डिफ़ॉल्ट व्यवहार भी x_res और y_res के लिए ठीक काम करता है जिनके अलग-अलग मूल्य हैं। पिछले उदाहरण का विस्तार करते हुए, मान लेते हैं कि x_res 1.5 है जबकि y_res 1 है। इसलिए सीमा [0,15,010] के बराबर होनी चाहिए। डिफ़ॉल्ट पहलू का उपयोग करते हुए, हमारे पास आयताकार रंगीन पिक्सेल हो सकते हैं, जबकि यूनिट पिक्सेल अभी भी वर्ग है!

plt.imshow(data, origin = 'lower',  extent = [0, 15, 0, 10])
# Or we have similar x_max and y_max but different data.shape, leading to different color pixel res.
data=rng.randn(10,5)
plt.imshow(data, origin = 'lower',  extent = [0, 5, 0, 5])

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

रंग पिक्सेल का पहलू है x_res / y_res। इकाई पिक्सेल (यानी aspect = x_res / y_res = ((x_max - x_min) / data.shape[1]) / ((y_max - y_min) / data.shape[0])) के पहलू पर अपना पहलू स्थापित करना हमेशा चौकोर रंग पिक्सेल देगा। हम पहलू = 1.5 को बदल सकते हैं ताकि एक्स-अक्ष इकाई 1.5 गुना y- अक्ष इकाई हो, जिससे एक वर्ग रंग पिक्सेल और वर्ग पूरे चित्र लेकिन आयताकार पिक्सेल इकाई हो। जाहिर है, यह आम तौर पर स्वीकार नहीं किया जाता है।

data=rng.randn(10,10)
plt.imshow(data, origin = 'lower',  extent = [0, 15, 0, 10], aspect = 1.5)

यहाँ छवि विवरण दर्ज करें

सबसे अवांछित मामला यह है कि सेट पहलू एक मनमाना मूल्य है, जैसे 1.2, जो न तो वर्ग इकाई पिक्सेल और न ही वर्ग रंग पिक्सेल को जन्म देगा।

plt.imshow(data, origin = 'lower',  extent = [0, 15, 0, 10], aspect = 1.2)

यहाँ छवि विवरण दर्ज करें

लंबी कहानी छोटी, यह हमेशा सही सीमा निर्धारित करने के लिए पर्याप्त है और मैटप्लोटलिब को हमारे लिए शेष चीजें करने दें (भले ही x_res! = Y_res)! पहलू बदलो तभी जब यह होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.