用DataFrame在Python中绘制3D表面



我对python来说是相当新的,所以我很抱歉,如果我的问题不像流利的python用户那样连贯,但是我已经搜索了网络,并且真的没有找到解决方案我正在尝试做。我想在CSV文件中有一组实验数据,我想将其绘制为3D表面。它的结构如下:

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

基本上,我的顶行和左手列应作为深度时间阵列的x,y部分的作用,而z是每个x,y坐标处的温度读数。

我尝试将X和Y设置为数组,然后使用Meshgrid(X,Y(设置网格。但是我的z是值,而不是x,y的明确函数。所以我无法工作。我尝试使用X,Y引用Z,但这似乎不起作用。

我还尝试将其导入到数据框架上并使用3D绘图选项播放,但它们似乎都需要:

的格式
   x y z
   .....
   .....
   .....

这无助于我的数据集。我将感谢有关此的任何想法/建议!谢谢。

开始怎么样?数据读取和重塑部分不是地球上最快,最可靠的 - 如果您在更大范围内进行此类工作,则可能会使用一些战斗证实的熊猫例程 - 但是该示例可能会使您深入了解如何完成。

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')

最新更新