【发布时间】:2018-10-05 18:45:50
【问题描述】:
我有三个单独的一维数组,其中包含椭圆体表面的数据点。数据点是通过 C 代码生成的,这些点存储在 .CSV 文件中。
我想使用 matplotlib 中的 plot_surface 函数从这些数据点绘制一个 3D 曲面。我开始绘制一个 3D 散点图作为完整性检查,以确保我拥有的数据点属于椭圆体而不是某个随机形状。
然后我尝试了 matplotlib 中的 plot_surface() 函数,并尝试了迄今为止在 SO 上讨论过的各种方法,您可以在最后给出的代码中看到它们。我将列出其中两个输出,因为我的低代表不允许我发布所有结果。
- 标题为“matplotlib 中的曲面图”的帖子, 这导致了输出: 此方法在我的代码中实现,位于注释 method-4 下。我也实现了类似的东西,但没有 unique() 函数,它再次给了我类似的输出。最后一部分是在我的代码中的method-3下实现的。
- 标题为“在表面上绘制 3 元组数据点”的帖子, 这导致了输出: 这部分在代码中的method-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/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 ""
【问题讨论】:
-
请添加您的导入语句和示例数据!否则没有人可以帮助你......看看是什么让minimal reproducible example!谢谢!
-
@jkalden:我添加了完整的代码以及数据文件的链接。
-
标签: python-2.7 matplotlib