2013-05-31 5 views
7

के साथ matplotlib में heatmap मैं अपने सिमुलेशन के परिणामों के साथ 3 डी हीटमैप प्लॉट करने के लिए matplotlib का उपयोग करने की कोशिश कर रहा हूं। मैंने this topic पढ़ा है और imshow का उपयोग करने की कोशिश की है। दुर्भाग्यवश, जब मैं एसवीजी या ईपीएस प्रारूपों में आकृति को सहेजता हूं, तो यह गर्मी को चित्र में परिवर्तित करता है (जो पत्रिका के लिए स्वीकार्य नहीं है)। तो, मैंने हेक्सबिन भी कोशिश की है - लेकिन छवि बहुत अजीब है। मुझे यकीन नहीं है कि यह जर्नल द्वारा स्वीकार किया जाएगा। क्या हमारे पास कुछ और है, या मुझे आयत से गर्मी भरना है?वेक्टर प्रारूप

उदाहरण के लिए, अगर एक इस कोड को चलाता है:

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

# Generate some test data 
x = np.random.randn(8873) 
y = np.random.randn(8873) 

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50) 
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]] 

print extent 
print heatmap 
plt.clf() 
surf = plt.imshow(heatmap, extent=extent) 
plt.colorbar(surf, shrink=0.75, aspect=5) 
plt.show() 

और एसवीजी फ़ाइल बचाने के लिए, यह PNG छवि CONTAINE देगा:

<g clip-path="url(#p6def4f5150)"> 
    <image height="347" width="315" x="115.127800906" xlink:href="data:image/png;base64, 

मैं उपयोग matplotlib, संस्करण 1.1.1 OpenSUSE और Ubuntu के तहत ओएस।

+0

मैं मुख्य विषय संपादित किया है @tcaswell – rth

उत्तर

9

pcolormesh का उपयोग करें जहां आप imshow का उपयोग कर रहे हैं यदि आप वेक्टर आउटपुट चाहते हैं।

pcolor या pcolormesh का उपयोग करते समय आप छवि को इंटरपोलेट नहीं कर सकते हैं। दूसरी ओर, यदि आप वेक्टर आउटपुट चाहते हैं तो शायद आप इंटरपोलेशन नहीं चाहते हैं।

मूल रूप से imshow और pcolor/pcolormesh के बीच अंतर का कारण है। imshow एक रास्टर का उत्पादन करता है, जबकि pcolormesh और pcolor आयताकार पैच का उत्पादन करता है।

आपको छवि की सीमा में पारित होने के तरीके को थोड़ा सा बदलने की भी आवश्यकता होगी। एक उदाहरण तुम्हारा के आधार पर के रूप में:

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

# Generate some test data 
x = np.random.randn(8873) 
y = np.random.randn(8873) 

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50) 

surf = plt.pcolormesh(xedges, yedges, heatmap) 
plt.axis('image') 
plt.colorbar(surf, shrink=0.75, aspect=5) 
plt.show() 

enter image description here

आप एक svg के रूप में सहेजते हैं, तो उत्पादन वेक्टर पैच हो जाएगा। जैसे

... 
    <g id="QuadMesh_1"> 
    <defs> 
    <path d=" 
M75.9063 -43.2 
L82.9705 -43.2 
L82.9705 -50.112 
L75.9063 -50.112 
L75.9063 -43.2" id="C0_0_9d1ab33858"/> 
    <path d=" 
M82.9705 -43.2 
L90.0348 -43.2 
L90.0348 -50.112 
L82.9705 -50.112 
L82.9705 -43.2" id="C0_1_d828245e6a"/> 
... 
+0

धन्यवाद! यह काम करता हैं! :) क्या आप यह समझा सकते हैं: 'plt.axis (' image ')'? – rth

+0

यह साजिश का पहलू अनुपात 1 (यानी वर्ग पिक्सेल चौकोर होगा) सेट करता है और सीमाओं को ट्रिम करता है। यह बस वहां है ताकि आउटपुट 'imshow' जैसा दिखता हो। –