matplotlib Python:绘制三维曲面图

9cbw7uwe  于 2023-03-30  发布在  Python
关注(0)|答案(2)|浏览(243)

绘制Plotly 3d曲面图时,我遇到了一些坚韧。我有一个4000行和3列的大数据框架。我在这里提出了一些问题,并得到了一些答案。当我尝试这些问题时,代码运行需要几个小时,但我看不到任何图。我想确认我所做的是正确的。因为我对曲面图是新手。
我的代码:

import plotly.graph_objects as go
import plotly.graph_objs
import plotly
df = 
index     x           y           z
0        10.2        40.5        70.5            
1        30.5        30.2       570.5
.
.
4000     100.5       201.5      470.5

df['z']= [df['z'].tolist for x in df.index]
df = 
index     x           y           z
0        10.2        40.5       [70.5,570.5,..,470.5]            
1        30.5        30.2       [70.5,570.5,..,470.5]
.
.
4000     100.5       201.5      [70.5,570.5,..,470.5]

    zdata = [df['z'].tolist()]*len(df)
    plotly.offline.plot({"data":[go.Surface(x=df['x'].values,
                                            y=df['y'].values,
                                            z = df['z'].values)],
    "layout":plotly.graph_objs.Layout(title='Some data', autosize=False,
                      width=600, height=600,
                    scene = dict(xaxis_title='x',
                    yaxis_title='y',
                    zaxis_title='z'),
                      margin=dict(l=10, r=10, b=10, t=10))})

如果有人能向我澄清,我生成曲面图的操作是否正确,我将不胜感激。

9wbgstp7

9wbgstp71#

这里是一个简单的/剥离的3D表面图的例子,希望能让你开始。
这里的关键信息是:同样的逻辑在一个有4000多行的DataFrame上应该没问题。(当然,它会绘制大约16 M个数据点,所以会花一些时间)。
要记住的关键点是z必须是形状为[x.shape[0], y.shape[0]]的2d数组。本质上,如果xy的长度为10,则z必须是以下形状:[10, 10] .
由于我没有完整的数据集,我已经合成了数据-希望可以用于说明目的。此外,为了简单起见,我坚持使用numpy,记住numpy数组本质上是DataFrame列。

简单示例:

import numpy as np
from plotly.offline import plot

n = 10
x = np.arange(n)
y = x
z = np.tile(x**2, [n, 1])

data = [{'x': x,
         'y': y,
         'z': z,
         'type': 'surface'}]

plot({'data': data}, filename='/path/to/graph.html')

输出:

来点更有趣的:

n = 360
x = np.arange(n)
y = x
v = np.tile([np.sin(i*(np.pi/180)) for i in range(n)], [n, 1]).T
z = (v.T[0]*v)

data = [{'x': x,
         'y': y,
         'z': z,
         'type': 'surface'}]

plot({'data': data}, filename='/path/to/graph.html')

你会注意到绘图逻辑是相同的。

输出:

iecba09b

iecba09b2#

当你使用go.Surface时,z应该是一个二维矩阵,xy应该是x_axis和y_axis的唯一值。这段代码为使用go.Surface准备了DataFrame值。

x_data = df['x'].values
y_data = df['y'].values
z_data = df['z'].values

x = np.unique(x_data)
y = np.unique(y_data)

# Set default value of np.Nan for z matrix
z = np.empty((x.shape[0], y.shape[0]))
z[:] = np.NaN
for i in range(len(z_data)):
    z[np.where(x, np.isclose(x, x_data[i])), 
      np.where(y, np.isclose(y, y_data[i]))] = z_data[i]
z=z.transpose()

fig = go.Figure(data=[go.Surface(z=z, x=x, y=y)])
fig.show()

相关问题