abh*_*hek 5 matplotlib python-2.7
我有三个单独的一维数组,其中包含椭圆表面的数据点。数据点通过C代码生成,并且这些点存储在.CSV文件中。
我想使用matplotlib中的plot_surface函数从这些数据点绘制3D曲面。我首先绘制3D散点图以进行完整性检查,以确保我的数据点属于椭圆体而不是某种随机形状。
然后,我尝试了matplotlib中的plot_surface()函数,并尝试了到目前为止在SO上讨论过的各种方法,您可以在最后给出的代码中看到它们。我将列出两个输出,因为我的低代表不允许我发布所有结果。
此方法在我的代码中的comment 方法-4下实现。我也实现了类似的东西,但是没有unique()函数,它又给了我类似的输出。最后一部分在我的代码的method-3下实现。
此部分在代码中的method-2下实现。如您所见,没有一种方法真正适用于我,尽管散点图确认数据点确实属于椭圆体,但表面图给出了错误的结果。
难道我做错了什么?如果不是,那么您能建议一种替代方法来为我的情况正确绘制3D表面吗?我正在使用的数据可以在以下链接中找到:https : //drive.google.com/file/d/0BwTffmdLhwB3b0JOMXdHYzFTSGc/view?usp=sharing
我正在使用python2.7,OS: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/O
import csv
from pprint import pprint
# Numerical
import numpy as np
import pandas as pd
from scipy.interpolate import griddata
import math
# 3D visualization special package
import mayavi
from mayavi import mlab
# System
import sys
import time
from tqdm import tqdm
print ""
print "---------------------------------------------------------------------------------"
print " NAOS "
print " "
print " Copyright (c) 2016, A. Agrawal (abhishek.agrawal@protonmail.com) "
print "---------------------------------------------------------------------------------"
print ""
# Start timer.
start_time = time.time( )
# Get plotting packages
import matplotlib
import matplotlib.colors
import matplotlib.axes
import matplotlib.lines as mlines
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
from matplotlib import rcParams
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d import axes3d
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import 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 ellipsoid
fig = 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 y
z = data['Z'].values
# print z
r = 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, y, z )
# ax.plot_wireframe( x, y, z )
# plt.show()
# **************** Method - 1 ******************************** #
# pts = mayavi.mlab.points3d( x, y, z, 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 ), z, ( x1, y1 ), method='cubic' )
# ax.plot_surface( xx, yy, zz, rstride=5, cstride=5, cmap=cm.jet, linewidth=0.1, antialiased=False )
# plt.show()
# **************** Method - 3 ******************************** #
x1 = np.linspace( x.min(), x.max() )
y1 = np.linspace( y.min(), y.max() )
xx, yy = np.meshgrid( x1, y1 )
zz = griddata( ( x, y ), z, ( xx, yy ), method='cubic' )
ax.plot_surface( xx, yy, zz, rstride=5, cstride=5, cmap=cm.jet, linewidth=0.1, 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, yy = np.meshgrid( x1, y1 )
# zz = griddata( ( x, y ), z, ( xx, yy ), method='cubic' )
# ax.plot_surface( xx, yy, zz, rstride=5, cstride=5, cmap=cm.jet, linewidth=0.1, antialiased=False )
# plt.show()
# **************** Method - 5 ******************************** #
# xx, yy = np.mgrid[ min(x):max(x):100j, min(y):max(y):100j ]
# zz = griddata( ( x, y ), z, ( xx, yy ), method='cubic' )
# ax.plot_surface( xx, yy, zz, rstride=5, cstride=5, cmap=cm.jet, linewidth=0.1, antialiased=False )
# plt.show()
# Stop timer
end_time = time.time( )
# Print elapsed time
print "Script time: " + str("{:,g}".format(end_time - start_time)) + "s"
print ""
print "------------------------------------------------------------------"
print " Exited successfully! "
print "------------------------------------------------------------------"
print ""
Run Code Online (Sandbox Code Playgroud)
我认为您正在寻找的是plot_trisurf可以处理非结构化一维数据向量的工具。下面的代码使用您的数据来绘制图表。数据的关键问题是每个 X/Y 点都有 3 个 z 值,plot_trisurf 无法自动处理这些值(尽管有办法解决这个问题,例如,请参阅有关绘制球体的问题)。我通过将复制的 X/Y 点拆分为单独的数据帧来解决这个问题。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd
fileDir = "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', 'y'], keep=False, inplace=False)
XMid = dataMid['x']
YMid = dataMid['y']
ZMid = dataMid['z']
dataBottom = data.drop_duplicates(subset=['x', 'y'], 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, cmap='viridis', alpha=0.5)
ax.plot_trisurf(XBottom, YBottom, ZBottom, cmap='viridis', alpha=0.5)
plt.show()
Run Code Online (Sandbox Code Playgroud)
如果你能告诉我更多关于你期望看到的情节,我可以尝试更具体。有关三角测量的更多信息,请参阅Matplotlib(如 matlab 的 trisurf) 。
| 归档时间: |
|
| 查看次数: |
1222 次 |
| 最近记录: |