使用三个浮点型一维数组在Plotly中创建3D表面绘图

5

我正在尝试使用浮点数数组创建3D表面图。我尝试了提供的答案,但没有成功。

我的代码:

     ydata       xdata      zdata
0  667.029710  38.666953  2156.370026
1  673.518030  38.578639  2167.733673
2  928.285970  39.558060  2984.315454
3  947.973966  39.329530  3065.414025
4  904.826638  40.241960  3071.355114
5  901.673720  40.259228  2947.752668
6  910.980404  41.478425  2906.467214
7  916.008852  41.813555  2933.900440
8  913.971114  41.583315  2955.543549
9  933.040692  42.577816  2979.264288 

import plotly.graph_objects as go
import plotly.graph_objs
import pandas as pd
import numpy as np
xdata = df['xdata'].values
ydata = df['ydata'].values
zdata = df['zdata'].values
plotly.offline.plot({"data":[go.Surface(z=zdata, x=xdata, y=ydata)],
"layout":plotly.graph_objs.Layout(title='Some data', autosize=False,
                  width=500, height=500,
                  margin=dict(l=65, r=50, b=65, t=90))})

代码没有输出结果。我可以看到三维图表,但没有任何数据。


1
这个回答解决了你的问题吗? Plotly绘制的3D曲面没有显示 - dm2
@dm2 不好意思,我的意思是我尝试理解它但是没成功。你能帮我把zdata转化为所提到的答案中的表面吗? - Mainland
1
我想你可以这样做,但形状/大小/维度要求仍然适用,因此每个x/y对仍需要一个z值。例如,按照链接答案中的代码,如果您执行go.Surface(z = [zdata]*10, x = xdata, y = ydata),它应该可以工作(如果我正确记得代码的话,我已经尝试过并且确实可以工作)。虽然与2D线图类似,我认为Surface图表示变量之间的某种关系。 - dm2
1
@dm2 好的。如果我正确理解答案,z=[zdata.tolist()]*len(xdata),这样对吗? - Mainland
1
我认为是这样的(虽然我写的代码也应该可以工作)。正如我所说,我还在学习中,所以也要查看文档。 - dm2
显示剩余5条评论
1个回答

3

如果数据只在一个维度上被指定,那么它将不会被显示,因为没有配置3D信息。如果像代码中一样指定整个数据框,则会显示出来。官方参考文档

import pandas as pd
import numpy as np
import io

data = '''
 ydata xdata zdata
0 667.029710 38.666953 2156.370026
1 673.518030 38.578639 2167.733673
2 928.285970 39.558060 2984.315454
3 947.973966 39.329530 3065.414025
4 904.826638 40.241960 3071.355114
5 901.673720 40.259228 2947.752668
6 910.980404 41.478425 2906.467214
7 916.008852 41.813555 2933.900440
8 913.971114 41.583315 2955.543549
9 933.040692 42.577816 2979.264288 
'''

df = pd.read_csv(io.StringIO(data), sep='\s+')

import plotly.graph_objects as go
import plotly.graph_objs

# xdata = df['xdata'].values
# ydata = df['ydata'].values
# zdata = df['zdata'].values

plotly.offline.plot({"data":[go.Surface(z=df.values)],
"layout":plotly.graph_objs.Layout(title='Some data', autosize=False,
                  width=500, height=500,
                  margin=dict(l=65, r=50, b=65, t=90))})

enter image description here


我不使用3D图表,所以不确定,但我认为y(0-9)和x(01,2)显示每个索引的数量。 - r-beginners
你的回答确实帮助我看到了我想要的。我使用了 plotly.offline.plot({"data":[go.Surface(x=df['x'].values,y=df['y'].values,z=df[['x','y','z']].values)], "layout":plotly.graph_objs.Layout(title='Some data', autosize=False,width=500, height=500,scene = dict(xaxis_title='X AXIS TITLE',yaxis_title='Y AXIS TITLE',zaxis_title='Z AXIS TITLE'),margin=dict(l=15, r=10, b=15, t=90))}) 这个方法完美地解决了我的问题。非常感谢。 - Mainland
最后一个问题:您知道如何保存此创建的HTML图像吗?plotly.offline.plot(fig, filename='temp-plot.html')是这样吗? - Mainland
您可以点击图表左上角显示的菜单中的相机图标,将图像以 PNG 格式保存到本地。 当您点击图表空白部分时,该菜单将出现。 - r-beginners
浏览器菜单中是否保存了任何HTML文件或在程序文件中本地显示? - r-beginners
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接