2010-12-06 35 views
6

बिना मेरे जीवन के लिए मैं यह नहीं समझ सकता कि this के समान परिणाम कैसे प्राप्त करें।3 डी प्लॉटिंग में 3 डी प्लॉटिंग में 3 डी प्लॉटिंग में matplotlib रंग contour

लिंक रंगीन 3 डी प्लॉट को समोच्च का उपयोग किए बिना उत्पन्न करता है। यदि मैं एक ही तकनीक का उपयोग करता हूं लेकिन अपने स्वयं के एक्स, वाई, जेड डेटा सेट के साथ मुझे केवल एक रंग मिलता है।

अंतर यह है कि मैं साजिश के लिए जेड डेटा उत्पन्न कर रहा हूं।

वैसे भी

, इस का उपयोग करते हुए:

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.mlab import griddata 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FormatStrFormatter 
import matplotlib.pyplot as plt 
import numpy as np 
import sys 

def xyz_ret(file): 
    f = open(file, 'r') 

    xyz = [] 
    for i in f: 
     ret = i.replace('\n','') 
     xyz.append(map(float,(ret.split('\t')))) 

    xyz = np.array(xyz) 
    return xyz[:,0],xyz[:,1],xyz[:,2]  


x,y,z = xyz_ret('300.txt') 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

xi = np.linspace(min(x), max(x)) 
yi = np.linspace(min(y), max(y)) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi) 

surf = ax.plot_surface(X, Y, Z, rstride=6, cstride=6, cmap=cm.jet, 
     linewidth=0) 

ax.set_zlim3d(min(z), max(z)) 

ax.w_zaxis.set_major_locator(LinearLocator(10)) 
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) 

fig.colorbar(surf, shrink=0.5, aspect=5) 

plt.show() 

डेटा सेट:

-2187.99902 9380.009151 0.0209 
-2187.00111 2474.994061 0.022 
-10755.98931 6119.598968 0.0296 
-5781.347693 609.427388 0.0301 
-8761.562524 1942.391853 0.0285 
-5695.576244 1894.624701 0.0251 
-3801.215106 1096.153308 0.0257 
-1616.821487 2452.940102 0.0182 
-5790.547537 2975.622971 0.022 
-8095.18467 4074.330871 0.0208 
-9997.367785 2771.330212 0.0264 
-10547.5635 4397.127096 0.0251 
-5781.706776 3984.545588 0.0191 
-3346.855289 4347.670408 0.0172 
-918.639762 4518.515925 0.0142 
-892.428381 5850.710005 0.0143 
-5844.499993 6516.904257 0.0204 
-10877.96951 6015.755723 0.0265 
-10813.37291 7704.306099 0.0302 
-7991.878303 7733.626264 0.0223 
-5861.073574 8725.943697 0.0217 
-3188.107715 6997.19893 0.0206 
-897.427629 7474.426336 0.0188 
-1388.841321 8786.642046 0.0194 
-3370.72325 8825.154803 0.0225 
-8561.226722 8851.111988 0.0285 
-10275.58972 8849.798032 0.0341 
-5853.645621 10113.77051 0.0255 
-8101.002878 10754.8429 0.0332 
-5765.080546 11378.95524 0.0299 
-3081.969839 10549.46676 0.0242 

केवल एक रंग दिखाया गया है। यह भी ध्यान दें कि कलर बार में कोई टिक नहीं है।

क्या आप मेरी समस्या क्या समझा सकते हैं?

+0

मैं कहूंगा कि आप Axes3D.plot_surface उपयोग नहीं कर रहे। आप एक्सिस 3 डी आयात करते हैं लेकिन फिर आप इसका उपयोग नहीं करते हैं। – joaquin

+0

इसका उपयोग ax = fig.add_subplot (111, projection = '3d') में किया जाता है, अगर मैं एक्सिस 3 डी को हटा देता हूं तो स्क्रिप्ट उस पंक्ति में त्रुटि होगी। – hl3fx

उत्तर

2

पाठ डेटा को पढ़ने के लिए सबसे आसान तरीका है genfromtxt के माध्यम से है:

data = np.genfromtxt('300.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

sys आवश्यकता नहीं है।

+0

हां, tidbit के लिए अच्छा धन्यवाद! :) – hl3fx

+0

सामग्री का परीक्षण करने के लिए कोडिंग करते समय मैं स्क्रिप्ट से यादृच्छिक रूप से बाहर निकलने के लिए sys का उपयोग करता हूं। sys.exit() – hl3fx

16

मुझे लगता है कि "असंतुलित" सतह (griddata) भरने में कोई समस्या है। alt text

कोड:

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.mlab import griddata 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

data = np.genfromtxt('300.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

xi = np.linspace(min(x), max(x)) 
yi = np.linspace(min(y), max(y)) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi) 

surf = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap=cm.jet, 
         linewidth=1, antialiased=True) 

ax.set_zlim3d(np.min(Z), np.max(Z)) 
fig.colorbar(surf) 

plt.show() 

कृपया ध्यान दें कि अगर आप एक आयताकार क्षेत्र (xi x yi) ऊपर सतह पर विचार, इस कोड को ठीक से काम कर रहा है। दूसरे शब्दों में, यदि आप अनियमित किनारों को "काटते हैं"।

xi = np.linspace(-4000, -9000) 
yi = np.linspace(4000, 9000) 

alt text

+0

प्रतिक्रिया के लिए धन्यवाद। मैं अभी भी इसे समझने की कोशिश कर रहा हूं। मुझे आश्चर्य है कि क्या griddata का उपयोग किए बिना जेड डेटा प्राप्त करने का कोई और तरीका है? – hl3fx

+0

क्या उपरोक्त का लक्षण कलर बार में टिक अंकों की कमी भी होगा? मुझे लगता है कि ये दो समस्याएं सीधे संबंधित हैं। उदाहरण कोड में टिकों को ज़ेड ऊंचाई पर विभिन्न रंगों का प्रतिनिधित्व दिखाया जाता है। यदि आप उदाहरण कोड में ज़ेड प्रिंट करते हैं तो सूचियों की एक सरणी संख्याओं से भरा दिखाया गया है, उपर्युक्त कोड में यदि आप ज़ेड प्रिंट करते हैं --- की एक सूची दिखायी जाती है। कोई विचार? – hl3fx

+0

हम्म, यह खोजने के लिए धन्यवाद। अब टूटी हुई सतह को कैसे ठीक किया जाए? मैंने यहां एक ही मुद्दे के साथ किसी और को पाया: http://old.nabble.com/plot_surface-masked-array-tt27266471.html#a27266471। दुर्भाग्यवश उनके प्रश्न का कोई जवाब नहीं था। – hl3fx

2

मैं सिर्फ समान समस्या के साथ संघर्ष किया।

अंततः मुझे natgrid का उपयोग करना पड़ा (जिसे संदर्भित किया गया है here लेकिन लिंक काम नहीं करता है) griddata के बजाय।

मेरे लिए साजिश क्षेत्र काटने के साथ चाल काम नहीं करती थी, यह हमेशा एक रंग में थी।

जब पीएनएनजीएल स्थापित करते हैं तो जांच करें कि आपके पास numpy का नवीनतम संस्करण है।

गुड लक