gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:41:37 25 4
gpt4 key购买 nike

我有三个单独的一维数组,其中包含椭球表面的数据点。数据点是通过 C 代码生成的,并且这些点存储在 .CSV 文件中。

我想使用 matplotlib 中的 plot_surface 函数从这些数据点绘制 3D 表面。我开始绘制 3D 散点图作为完整性检查,以确保我拥有的数据点属于椭圆体而不是一些随机形状。

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

  • 标题为“matplotlib 中的曲面图”的帖子,
    这导致输出:
    surface plot using unique data points for meshgrid
    这个方法在我的代码中的注释下实现了方法 4 .我也实现了类似的东西,但没有 unique() 函数,它再次给了我类似的输出。最后一部分在下实现方法 3 在我的代码中。
  • 标题为“在表面上绘制 3 元组数据点”的帖子,
    这导致输出:
    surface plot using grid interpolation over linearly spaced X and Y data points
    这部分在下实现方法 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 ""

    最佳答案

    我认为您正在寻找的是 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()

    all plotted

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

    关于python-2.7 - 在python中使用matplotlib的3D曲面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39240327/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com