2017-05-06 35 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