繁体   English   中英

Python: Plotly 3D 表面 Z36BE98B843E778A6E7350354B6937C

[英]Python: Plotly 3D Surface Plot

我很难绘制 Plotly 3d 表面 plot。 我有一个 4000 行和三列的大数据框。 我确实在这里提出了问题并得到了一些答案。 当我尝试它们时,代码需要几个小时才能运行,但我看不到 plot。 我想确认我所做的是正确的。 因为我不熟悉表面情节。

我的代码:

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

我会很感激有人澄清我正在做什么来生成表面 plot 是正确的?

这是一个简单/精简的 3D 表面 plot 示例,希望能助您一臂之力。

这里的关键信息是:不要过度复杂化。 在具有 4000+ 行的 DataFrame 上,同样的逻辑应该没问题。 (当然,它将是 plot ~16M 数据点,因此需要一些时间)。

要记住的关键点是z必须是形状[x.shape[0], y.shape[0]]的二维数组。 本质上,如果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')

Output:

在此处输入图像描述

更有趣的东西:

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

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

Output:

在此处输入图像描述

使用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)
x_min = np.min(x)
y = np.unique(y_data)
y_min = np.min(y)

# 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[x_data[i] - x_min, y_data[i] - y_min] = z_data[I]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM