python-2.7 – 在python中使用matplotlib的3D曲面图

python-2.7 – 在python中使用matplotlib的3D曲面图,第1张

概述我有三个独立的1-D阵列,包含椭圆体表面的数据点.数据点是通过C代码生成的,并且这些点存储在.CSV文件中. 我想使用matplotlib中的plot_surface函数从这些数据点绘制3D表面.我开始绘制一个三维散点图作为一个健全性检查,以确保我所属的数据点属于一个椭球而不是一些随机的形状. 然后我在matplotlib中尝试了plot_surface()函数,并尝试了迄今为止在SO上讨论过的各 我有三个独立的1-D阵列,包含椭圆体表面的数据点.数据点是通过C代码生成的,并且这些点存储在.CSV文件中.

我想使用matplotlib中的plot_surface函数从这些数据点绘制3D表面.我开始绘制一个三维散点图作为一个健全性检查,以确保我所属的数据点属于一个椭球而不是一些随机的形状.

然后我在matplotlib中尝试了plot_surface()函数,并尝试了迄今为止在SO上讨论过的各种方法,你可以在最后给出的代码中看到它们.我将列出两个输出,因为我的低代表不允许我发布我的所有结果.

>帖子标题为“matplotlib中的表面图”,
这导致了输出:
 
这个方法在我的代码注释方法-4下实现.我也实现了类似的东西,但没有unique()函数,它再次给了我类似的输出.最后一部分是在我的代码中的方法-3下实现的.
>帖子标题为“在表面上绘制3元组数据点”,
这导致了输出:
 
该部分在代码中的方法-2下实现.

正如您所看到的,这些方法都没有真正起作用,虽然散点图确认数据点确实属于椭圆体,但表面图给出了错误的结果.

难道我做错了什么?如果没有,那么你可以建议一种替代方法来正确绘制我的案例的3D表面吗?我正在使用的数据可以在以下链接中找到:https://drive.google.com/file/d/0BwTffmdLhwB3b0JOMXdHYzFTSGc/view?usp=sharing

我使用的是python2.7, *** 作系统:ubuntu-14.04.我是python的新手,所以如果你能提供解释和解决方案,那将会很棒.非常感谢你.

'''copyright (c) 2016 Abhishek Agrawal (abhishek.agrawal@protonmail.com)distributed under the MIT license.See accompanying file liCENSE.md or copy at http://opensource.org/licenses/MIT'''# Set up modules and packages# I/Oimport csvfrom pprint import pprint# Numericalimport numpy as npimport pandas as pdfrom scipy.interpolate import grIDdataimport math# 3D visualization special packageimport mayavifrom mayavi import mlab# Systemimport sysimport timefrom tqdm import tqdmprint ""print "---------------------------------------------------------------------------------"print "                                 NAOS                                            "print "                                                                                 "print "         copyright (c) 2016,A. Agrawal (abhishek.agrawal@protonmail.com)        "print "---------------------------------------------------------------------------------"print ""# Start timer.start_time = time.time( )# Get plotting packagesimport matplotlibimport matplotlib.colorsimport matplotlib.axesimport matplotlib.lines as mlinesimport matplotlib.patches as mpatchesimport matplotlib.pyplot as pltimport matplotlib.mlab as mlabfrom matplotlib import rcParamsfrom matplotlib import cmfrom mpl_toolkits.mplot3d import Axes3Dfrom mpl_toolkits.mplot3d import axes3dfrom matplotlib.ticker import linearLocator,FormatStrFormatterimport matplotlib.tri as tri# Operations# Read data in csv file. data returned as a panda serIEs.data = pd.read_csv( '../data/ellipsoIDSurfacePoints.csv' )# Plot 3D surface of the ellipsoIDfig = plt.figure()ax = fig.gca( projection = '3d' )ax.set_xlabel('x [km]')ax.set_ylabel('y [km]')ax.set_zlabel('z [km]')ax.ticklabel_format(style='sci',axis='both',scilimits=(0,0))x = data['X'].values# print x[1:100]y = data['Y'].values# print yz = data['Z'].values# print zr = np.sqrt( x**2 + y**2 + z**2 )# **************** trisurf,scatter and wireframe ************ ## triang = tri.Triangulation( x,y )# ax.plot_trisurf( x,y,z,triangles=triang.triangles,cmap=cm.jet,linewidth=0.1 )# ax.scatter( x,z )# ax.plot_wireframe( x,z )# plt.show()# **************** Method - 1 ******************************** ## pts = mayavi.mlab.points3d( x,z )# mesh = mayavi.mlab.pipeline.delaunay2d( pts )# pts.remove( )# surf = mayavi.mlab.pipeline.surface( mesh )# mayavi.mlab.show( )# **************** Method - 2 ******************************** ## x1 = np.linspace( x.min(),x.max() )# y1 = np.linspace( y.min(),y.max() )# xx,yy = np.meshgrID( x1,y1 )# zz = grIDdata( ( x,y ),( x1,y1 ),method='cubic' )# ax.plot_surface( xx,yy,zz,rstrIDe=5,cstrIDe=5,linewidth=0.1,antialiased=False )# plt.show()# **************** Method - 3 ******************************** #x1 = np.linspace( x.min(),x.max() )y1 = np.linspace( y.min(),y.max() )xx,y1 )zz = grIDdata( ( x,( xx,yy ),method='cubic' )ax.plot_surface( xx,antialiased=False )plt.show()# **************** Method - 4 ******************************** ## x1 = np.linspace( x.min(),x.max(),len( data['X'].unique() ) )# y1 = np.linspace( y.min(),y.max(),len( data['Y'].unique() ) )# xx,antialiased=False )# plt.show()# **************** Method - 5 ******************************** ## xx,yy = np.mgrID[ min(x):max(x):100j,min(y):max(y):100j ]# zz = grIDdata( ( x,antialiased=False )# plt.show()# Stop timerend_time = time.time( )# Print elapsed timeprint "Script time: " + str("{:,g}".format(end_time - start_time)) + "s"print ""print "------------------------------------------------------------------"print "                         Exited successfully!                     "print "------------------------------------------------------------------"print ""
解决方法 我认为你正在寻找的是plot_trisurf,它可以处理非结构化的1D数据向量.下面的代码使用您的数据来制作图表.数据的关键问题是每个X / Y点都有3个z值,plot_trisurf无法自动处理(尽管有一些方法可以解决这个问题,例如有关绘制球体的问题).我通过将复制的X / Y点拆分为单独的数据帧来处理这个问题.

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dimport pandas as pdfileDir = "data.csv"data = pd.read_csv(fileDir,engine = 'c',float_precision = 'round_trip',dtype=np.float64)datatop = data.drop_duplicates(subset=['x','y'],keep='first',inplace=False)Xtop = datatop['x']Ytop = datatop['y']Ztop = datatop['z']dataMID = data.drop_duplicates(subset=['x',keep=False,inplace=False)XMID = dataMID['x']YMID = dataMID['y']ZMID = dataMID['z']dataBottom = data.drop_duplicates(subset=['x',keep='last',inplace=False)XBottom = dataBottom['x']YBottom = dataBottom['y']ZBottom = dataBottom['z']fig = plt.figure(figsize=(11.5,8.5))ax = fig.add_subplot(111,projection='3d')ax.plot_trisurf(Xtop,Ytop,Ztop,cmap='viridis',Alpha=0.5)ax.plot_trisurf(XMID,YMID,ZMID,Alpha=0.5)ax.plot_trisurf(XBottom,YBottom,ZBottom,Alpha=0.5)plt.show()

如果你能告诉我更多关于你希望看到的情节,我可以尝试更具体.有关三角测量的更多信息,请参见Matplotlib like matlab’s trisurf.

总结

以上是内存溢出为你收集整理的python-2.7 – 在python中使用matplotlib的3D曲面图全部内容,希望文章能够帮你解决python-2.7 – 在python中使用matplotlib的3D曲面图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1197702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存