2017-05-06 38 views
0

我對Python很新,所以我很抱歉如果我的問題不像流利的python用戶那樣一致,但是我搜索了網頁並且還沒有找到解決方案我正在努力去做。 我有一組csv文件中的實驗數據,我想繪製爲3D表面。它的結構如下:使用數據框在Python中繪製三維曲面

   x(time) 
y(depth) z(temperature readings) 
y   z(temperature readings) 
y   z(temperature readings) 
y   z(temperature readings) 

基本上,我的頂行和我的左手列應爲x的作用,深度時間陣列以及z Y的部分是溫度讀數在每個X,Y座標。

我已經嘗試設置我的x和y作爲數組,然後使用meshgrid(x,y)來設置網格。但是我的z是值,而不是x,y的顯式函數。所以我不能讓它工作。我嘗試使用x,y引用z,但這似乎不起作用。

我自己也嘗試導入它作爲一個數據幀,並且通過3D繪圖選項玩耍,但他們似乎都需要的格式:

x y z 
    ..... 
    ..... 
    ..... 

不與我的數據集幫助。我將不勝感激任何想法/建議!謝謝。

回答

1

這一開始如何?數據讀取和重新塑造部分並不是地球上最快和最可靠的部分 - 如果您在更大規模上進行這類工作,您可能會使用一些經過戰鬥驗證的Pandas例程 - 但這個例子可能會讓您深入瞭解如何做到這一點。

from plotly.offline import plot 
from plotly.graph_objs import Figure, Layout, Surface 

# Some "random" data in the desired format 
some_data = """depth;1;2;3;4 
0.2;0;1;1;0 
0.4;0.2;1.4;1.6;0.8 
0.6;0.3;1.2;1.7;0.7 
0.8;0.1;0.8;1.1;0.3 
""" 

# Iterate over lines in data - bringing it into shape 
data_z = [] 
data_y = [] 
for line_index, line in enumerate(some_data.split('\n')): 
    # Get time vector (x) 
    if line_index == 0: 
     data_x = [float(x) for x in line.split(';')[1:]] 
    # Get z-values 
    else: 
     # If line is not empty 
     if line != '': 
      data_z.append([float(z) for z in line.split(';')[1:]]) 
      data_y.append(float(line.split(';')[0])) 

# Prepare a plot 
fig = Figure(
    data = [ 
     Surface(
      x = data_x, 
      y = data_y, 
      z = data_z 
     ) 
    ], 
    layout = Layout(
     title = 'some data plot', 
     autosize = True 
     ) 
    ) 

# Spit it out ... 
plot(fig, filename='some-data-surface') 
+0

謝謝。這足以讓我開始。我認爲熊貓會有更明顯的東西,但我一定沒有找到它。我會給這個鏡頭,看看我是怎麼做的。再次感謝。 – bwindi