【问题标题】:How to plot 3D surfaces in Python如何在 Python 中绘制 3D 曲面
【发布时间】:2013-10-15 11:21:07
【问题描述】:

为了从以下数据生成 3D 表面,我应该在 herehere 的任何示例中更改/添加什么?

[100, 0, 'TF', 0]
[100, 0, 'DF', 0]
[100, 50, 'TF', 0]
[100, 50, 'DF', 0]
[100, 100, 'TF', 0]
[100, 100, 'DF', 0]
[100, 150, 'TF', 0.84496124031007758]
[100, 150, 'DF', 0.87209302325581395]
[100, 200, 'TF', 0.88139534883720927]
[100, 200, 'DF', 0.86201550387596892]
[100, 250, 'TF', 0.87441860465116272]
[100, 250, 'DF', 0.889922480620155]
[100, 300, 'TF', 0.87984496124031009]
[100, 300, 'DF', 0.89922480620155043]
[100, 350, 'TF', 0.92015503875968996]
[100, 350, 'DF', 0.90697674418604657]

注意:我确实根据上面提到的代码尝试了一些事情,但到目前为止我还没有设法让它工作。我没有在这里引用我的代码的原因是因为我会让我的问题变得比实际更复杂。

【问题讨论】:

  • 我将第一个示例中的相关行细化为ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.YlGnBu_r)。您需要从列表中提取 x、y 和 z 数据,并将该数据用作该函数的 X、Y 和 Z 参数。很确定这些可以是列表以及 numpy 数组。
  • plot_surface() 要求您的 X、Y 和 Z 数据在二维数组中定期网格化,例如您从 np.meshgrid() 获得的数据。您的数据是如何构造的并不完全清楚('TF''DF' 是什么?),但看起来它不是定期网格化的。您可以尝试plot_trisurf(),它将接受一维数组形式的不规则 X、Y、Z 数据 - see my answer here
  • 显然,第 3 列应该被删除(我不会进一步讨论)。我已经尝试过你提到的东西,但正如我所说,总是缺少一些东西。能否请您提供执行此操作的代码?
  • 您需要发布您的代码和您遇到的错误。没有多少人会有耐心去盲目地猜测你做错了什么。

标签: python matplotlib plot 3d geometry-surface


【解决方案1】:

因此,您的数据并不是真正的 3D,因为所有 x 值都相同,但这是我编辑您发布的示例的方式。出于某种原因,X 想要成为列表列表。也许其他人知道为什么。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib
import numpy as np
from matplotlib import cm
from matplotlib import pyplot as plt

#step = 0.04
#maxval = 1.0
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# create supporting points in polar coordinates
#r = np.linspace(0,1.25,50)
#p = np.linspace(0,2*np.pi,50)
#R,P = np.meshgrid(r,p)
# transform them to cartesian system
#X,Y = R*np.cos(P),R*np.sin(P)

X=[]
for i in range(0,16):
    X.append([])
    X[i].append(100)
print(X)

Y=[]
for i in range(0,8):
    Y.append(50*i)
    Y.append(50*i)
print(Y)

Z=[]
Z.append(0)
Z.append(0)
Z.append(0)
Z.append(0)
Z.append(0)
Z.append(0)
Z.append(0.84496124031007758)
Z.append(0.87209302325581395)
Z.append(0.88139534883720927)
Z.append(0.86201550387596892)
Z.append(0.87441860465116272)
Z.append(0.889922480620155)
Z.append(0.87984496124031009)
Z.append(0.89922480620155043)
Z.append(0.92015503875968996)
Z.append(0.90697674418604657)
print(Z)


#Z = ((R**2 - 1)**2)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.YlGnBu_r)
ax.set_zlim3d(0, 1)
ax.set_xlabel(r'xlabel')
ax.set_ylabel(r'ylabel')
ax.set_zlabel(r'zlabel')
plt.show()

【讨论】:

    【解决方案2】:

    对 x 数据稍作改动就会给你一个表面:

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib
    import numpy as np
    from matplotlib import cm
    from matplotlib import pyplot as plt
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    data = [[100, 0, 'TF', 0],
            [100, 0, 'DF', 0],
            [100, 50, 'TF', 0],
            [100, 50, 'DF', 0],
            [100, 100, 'TF', 0],
            [100, 100, 'DF', 0],
            [100, 150, 'TF', 0.84496124031007758],
            [100, 150, 'DF', 0.87209302325581395],
            [100, 200, 'TF', 0.88139534883720927],
            [100, 200, 'DF', 0.86201550387596892],
            [100, 250, 'TF', 0.87441860465116272],
            [100, 250, 'DF', 0.889922480620155],
            [100, 300, 'TF', 0.87984496124031009],
            [100, 300, 'DF', 0.89922480620155043],
            [100, 350, 'TF', 0.92015503875968996],
            [100, 350, 'DF', 0.90697674418604657]
            ]
    x = [item[0] for item in data]
    # change x here
    x = np.linspace(0, 100, num = 16)
    y = [item[1] for item in data]
    z = [item[3] for item in data]
    
    X, Y = np.meshgrid(x, y)
    _z, Z = np.meshgrid(x, z)
    
    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.YlGnBu_r)
    ax.set_zlim3d(0, 1)
    ax.set_xlabel(r'xlabel')
    ax.set_ylabel(r'ylabel')
    ax.set_zlabel(r'zlabel')
    plt.show()
    plt.close()
    

    【讨论】:

    • 您好,感谢您的回答,但我对 x 轴值的更改有些担心?为什么我必须这样做?显然,上面的数据集只是一个样本,因为真实的数据集要大得多。另外,我根本不想要用户中介!该脚本应针对任何数据集运行。那么,我应该如何改进脚本呢?
    • 正如@andy mcevoy 在他的回答中提到的那样,您所有的 x 轴值都是相同的,因此图表将是一条线 - 至少对于您发布的数据而言。我想我只是想说明 x 值需要变化才能使图形看起来像一个表面(3-d)。您可以将代码用于任何 3-d 数据集,但图表只会看起来像数据的样子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多