2011-11-25 13 views
12

भरने के लिए pyplot.contourf पर समोच्च linestroke छुपाएं मेरे पास नक्शा की छवियां बनाने के लिए एक पालतू परियोजना है, जहां मैं इलाके की ऊंचाई के समोच्च साजिश पर सड़कों और अन्य सामान खींचता हूं। इसका उद्देश्य पहाड़ बाइक मार्गों की योजना बनाना है (मैंने अतीत में कुछ वेक्टरियल चित्रों को हाथ से बनाया है, और वे विज़ुअलाइज़ेशन के लिए बहुत अच्छा काम करते हैं)।केवल

वर्तमान में, मैं डाउनलोड GeoTiff में डिजिटल एलिवेशन मॉडल,, यहां से: http://www.ecologia.ufrgs.br/labgeo/arquivos/downloads/dados/SRTM/geotiff/rs.rar

और फिर GDAL और matplotlib contourf समारोह के साथ साजिश बनाने के लिए:

from osgeo import gdal 
import matplotlib 
import matplotlib.pyplot as plt 
from pylab import cm 
import numpy 

f = 'rs.tif' 

elev = gdal.Open(f) 

a = elev.GetRasterBand(1).ReadAsArray() 

w = elev.RasterXSize 
h = elev.RasterYSize 
print w, h 

altura = (0.35, 0.42) 
largura = (0.70, 0.82) 

a = a[int(h*altura[0]):int(h*altura[1]), 
     int(w*largura[0]):int(w*largura[1])] 


cont = plt.contourf(a, origin='upper', cmap=cm.gist_earth, levels=numpy.arange(0,1000,20)) 
plt.title('Altitudes - max: %d m; min: %d m' % (numpy.amax(a), numpy.amin(a))) 
plt.show() 

कौन देता है:

enter image description here

समस्या यह है कि समोच्च रेखाएं हैं "सफेद", और कुछ दृश्य प्रदूषण उत्पन्न करते हैं, जो अवांछित है क्योंकि मैं बाद में सड़कों और नदियों को साजिश करना चाहता हूं।

तो, मैं, जिस तरह से contourf इन लाइटर पंक्तियां बनाने के संशोधित करने के लिए कोशिश कर रहा हूँ या तो पैरामीटर सेटिंग के माध्यम से, या हैक के माध्यम से (स्रोत कोड को बदलने), एक के समान यहां प्रस्तावित:

How to format contour lines from Matplotlib

इसके अलावा , यदि कोई जानता है कि अन्य पुस्तकालयों का उपयोग करके, इस तरह के मानचित्र को और अधिक सुरुचिपूर्ण तरीके से कैसे उत्पन्न किया जाए, तो मैं टिप की बहुत सराहना करता हूं!

पढ़ने के लिए धन्यवाद।

उत्तर

20

मैं अंत में यह लंबे समय से समस्या का उचित समाधान नहीं मिला (वर्तमान में matplotlib 2.0 में) है, जो समोच्च या आंकड़ा rasterizing के लिए कई कॉल की आवश्यकता नहीं है।

ध्यान दें कि प्रश्न में दिखाई गई समस्या केवल पीडीजी जैसी कम गुणवत्ता वाले रास्टर फ़ाइलों में नहीं, बल्कि पीडीएफ जैसे गुणवत्ता वाले प्रकाशन-गुणवत्ता वाले आंकड़े प्रारूपों में दिखाई देती है।

मेरा समाधान कलरबार के साथ एक ही समस्या से संबंधित this उत्तर से प्रेरित था।

import numpy as np 
import matplotlib.pyplot as plt 

np.random.seed(123) 
x, y = np.random.uniform(size=(100, 2)).T 
z = np.exp(-x**2 - y**2) 
levels = np.linspace(0, 1, 100) 

cnt = plt.tricontourf(x, y, z, levels=levels, cmap="ocean") 

# This is the fix for the white lines between contour levels 
for c in cnt.collections: 
    c.set_edgecolor("face") 

plt.savefig("test.pdf")  

यहाँ नीचे ठीक

enter image description here

से पहले आकृति का एक उदाहरण है और यहाँ नीचे के बाद एक ही आंकड़ा है: इस प्रकार है ऐसा ही एक समाधान पता चला है समोच्च साजिश को हल करने के साथ ही, ऊपर फिक्स

enter image description here

+2

ठीक है, बेशक यह अब स्वीकार्य उत्तर है, क्योंकि यह संभवतः और गैर-हैकली अंतर्निहित समस्या को हल करने लगता है। इतने सारे पोस्ट करने के लिए भी धन्यवाद समय !! – heltonbiker

+1

धन्यवाद @heltonbiker इसे अद्यतन करने के लिए। सलाह इस समाधान की चीज यह है कि यह फ़ाइल आकार में वृद्धि नहीं करता है और छवि गुणवत्ता को कम नहीं करता है। – divenex

+1

बहुत बढ़िया! मैं इसके लिए इंतजार कर रहा हूं, और मुझे उम्मीद है कि अगली बार जब मुझे इसकी ज़रूरत है तो मैं अपनी पसंदीदा पोस्ट को देखना नहीं भूलूंगा;) –

3

plt.contourf(...) पर केडब्ल्यू आर्ग्रमेंट जोड़ने का प्रयास करें: या तो lw=0 या ls=Nonehttp://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.contourf

+0

के रूप में आप ने कहा कि मैंने किया था, और मैं पहले कुछ इसी तरह की कोशिश कर याद किया, लेकिन दुर्भाग्य से यह काम नहीं किया। मुझे संदेह है कि इन लाइटस्ट्रोक लाइनें वास्तव में अनुचित एंटी-एलाइजिंग के कारण एक प्रतिपादन समस्या हो सकती हैं, लेकिन कोई कैसे जान सकता है? – heltonbiker

+0

ईमानदारी से, मुझे वास्तव में पता नहीं है :-(। हालांकि, थोड़ा आश्चर्यजनक बात यह है कि, इस उदाहरण में, http://matplotlib.sourceforge.net/examples/pylab_examples/contourf_log.html, रेखाएं वहां नहीं हैं। अगर मैं आप थे, तो मैं यह उदाहरण देखने के लिए शुरू करूंगा कि ये लाइनें कहां दिख रही हैं। –

+0

वाह! अब यह देखने में आश्चर्य की बात थी! होमवर्क करने का समय, जैसे ही मुझे कुछ नतीजा मिलेगा, मैं आऊंगा प्रतिक्रिया के साथ वापस। बहुत धन्यवाद !!! – heltonbiker

5

हेल्टनबाकर, क्या आपको अपनी समस्या का समाधान मिला? मैंने गलती से इस सवाल पर ठोकर खाई, और मुझे थोड़ी देर के लिए एक ही समस्या थी। मैंने जेन्या द्वारा सुझावों की कोशिश की, हालांकि, वे मेरे लिए भी काम नहीं करते हैं। वास्तविक समाधान न होने के बावजूद समस्या का हल, लेकिन अधिक कामकाज सरल है: बस उसी contourf कमांड को दोहराएं और यह जादुई रूप से नकली रूप से छुटकारा पायेगा।

ओपी द्वारा बताए गए अनुसार, एक दूसरे के करीब अंतराल के साथ समोच्च भरने (contourf) करते समय नकली समोच्च दिखाई देते हैं।

plt.contourf(plon,plat,ssh,np.arange(-1,1.001,0.001)) # 2001 intervals 

यह हमें आउटपुट के रूप में देता है:: हम जैसे अंतराल की एक बहुत बड़ी संख्या है, की स्थापना करके इस व्यवहार को पुन: पेश कर सकते हैं

enter image description here

पतली नकली आकृति स्पष्ट रूप से समोच्च का शुद्ध रंग को प्रभावित भरें।

आप आदेश दो बार करते हैं:

plt.contourf(plon,plat,ssh,np.arange(-1,1.001,0.001)) # Not once, 
plt.contourf(plon,plat,ssh,np.arange(-1,1.001,0.001)) # but twice! 

मुझे देता है:

enter image description here

अब बहुत बेहतर।

enter image description here

मैं अब और नहीं किसी भी पतली आकृति नहीं देख सकते हैं: यहाँ बेहतरीन एक, 3 लगातार contourf आदेशों के साथ है! दुर्भाग्यवश, यह सरणी आकार और समोच्च अंतराल की संख्या के आधार पर आपकी स्क्रिप्ट को महत्वपूर्ण रूप से धीमा कर सकता है। अगर अधिक समोच्च अंतराल का उपयोग किया जाता है तो नकली रूपरेखा अधिक खड़े हो जाते हैं। आमतौर पर मेरे लिए सबसे अच्छा काम करता है 50 से 100 समोच्च अंतराल का उपयोग करना, और contourf दो बार करना है।

ध्यान दें कि matplotlib का संस्करण मैं उपयोग कर रहा हूं नवीनतम नहीं है। यह समस्या संस्करण 1.1.0 में हल हो गई हो सकती है। यदि यह है, तो कृपया मुझे बताएं।

Python 2.7.1 |EPD 7.0-2 (32-bit)| (r271:86832, Nov 29 2010, 13:52:51) 
In [1]: matplotlib.__version__ 
Out[1]: '1.0.1' 
+0

पुराने प्रश्न में आपकी रूचि के लिए बहुत बहुत धन्यवाद! मुझे पूरा यकीन है कि समस्या एलियासिंग प्रभाव से संबंधित है, पिक्सेल सीमाओं पर "रंगीन दाएं" नहीं है। यह आपके समाधान के साथ बहुत अधिक सहमत है, क्योंकि अर्ध-पारदर्शी (या अर्ध-"uncolored") पिक्सेल को पुनर्निर्मित करने के बाद "उन्हें भरें" और उन्हें रंगीन बनाते हैं। मैं अब इस सुझाव का प्रयास नहीं कर सकता, लेकिन निश्चित रूप से जब मैं समय आऊंगा (मेरे भूखंड इतने घने नहीं हैं कि निषिद्ध प्रदर्शन समस्याएं हैं)। धन्यवाद!! – heltonbiker

+0

(और यह शर्म की बात है कि उबंटू से संबंधित डिस्ट्रोज़ के नवीनतम संस्करण अभी भी matplotlib 0.9 का उपयोग कर रहे हैं ...) – heltonbiker

+0

@heltonbiker यह है। मैं फेडोरा, आरएचईएल और सेंटोस पर एनथॉट पायथन वितरण का उपयोग करता हूं, और मैं दृढ़ता से इसकी अनुशंसा करता हूं।matplotlib 1.1.0 इसके साथ आता है, कई अन्य विज्ञान उन्मुख मॉड्यूल के बीच। जाहिर है, मैं नवीनतम ईपीडी संस्करण का उपयोग नहीं कर रहा हूँ :)। http://enthought.com/products/epd.php (मैं एनथॉट से जुड़ा नहीं हूं) – milancurcic