【问题标题】:Python - 2/3D scatter plot with surface plot from that dataPython - 带有来自该数据的曲面图的 2/3D 散点图
【发布时间】:2018-01-01 20:23:26
【问题描述】:

使用:[python] [numpy] [matplotlib] 所以我有一个 3D 数组来创建一个散点图,制作一个 n * n * n 立方体。这些点具有由颜色表示的不同电位值。

size = 11
z = y = x = size
potential = np.zeros((z, y, x))                                                
Positive = 10
Negative = -10

""" ------- Positive Polo --------- """                                        
polox = poloy = poloz = [1,2]
polos=[polox,poloy,poloz]
polop = [list(x) for x in np.stack(np.meshgrid(*polos)).T.reshape(-1,len(polos))] # Positive polos list

for coord in polop:
    potential[coord] = Positive

""" ------- Negative Polo --------- """                                        
polo2x = polo2y = polo2z = [size-3,size-2]
polos2=[polo2x,polo2y,polo2z]
polon = [list(x) for x in np.stack(np.meshgrid(*polos2)).T.reshape(-1,len(polos2))] # Negative polos list

for coord in polon:
    potential[coord] = Negative

我在开始时有 2 个值 -10 和 10 的 polo,其余点的计算方式如下:(周围点的平均值,没有对角线):

for z in range(1,size):
    for y in range(1,size):
        for x in range(1,size):
            if [z,y,x] in polop:
                potential[z,y,x] = Positive                                # If positive polo, keeps potential
            elif [z,y,x] in polon:
                potential[z,y,x] = Negative                                # If negative polo, keeps potential
            elif z!=size-1 and y!=size-1 and x!=size-1:                    # Sets the potential to the mean potential of neighbors
                potential[z][y][x] = (potential[z][y][x+1] + potential[z][y][x-1] + potential[z][y+1][x] + potential[z][y-1][x] + potential[z+1][y][x] + potential[z-1][y][x]) / 6

对于外部单元格:

for z in range(0,size):
        for y in range(0,size):
            for x in range(0,size):
                potential[z,y,0] = potential[z,y,2]
                potential[z,0,x] = potential[z,2,x]
                potential[0,y,x] = potential[2,y,x]
                if z == size-1:
                    potential[size-1,y,x] = potential[size-3,y,x]
                elif y == size-1:
                    potential[z,size-1,x] = potential[z,size-3,x]
                elif x == size-1:
                    potential[z,y,size-1] = potential[z,y,size-3]

我需要的是显示连接具有相同值区间“相同颜色”(例如从 0 到 2.5)的点的表面。

我知道有很多这样的问题,但是我无法适应我的代码,它要么不显示(例如this)要么不是同一个问题,要么不是python(作为this one),这就是我再次询问的原因。 它也可以显示为许多子图,每个子图都有一个表面。

注意:我的 3D 数组是这样的,如果我键入 print(potential[1,1,1]),它会显示该单元格的值,如下图所示,为 10。这就是我用于显示颜色。

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
z,y,x = potential.nonzero()
cube = ax.scatter(x, y, z, zdir='z', c=potential[z,y,x], cmap=plt.cm.rainbow)  # Plot the cube
cbar = fig.colorbar(cube, shrink=0.6, aspect=5)                                # Add a color bar which maps values to colors.

【问题讨论】:

    标签: python numpy matplotlib plot


    【解决方案1】:

    您最好创建一个Minimum, Complete and Verifiable Example 以便更轻松地获得帮助。

    我仍然不清楚你是如何计算你的潜力,也不清楚你是如何生成你的表面,所以我包含了一些琐碎的函数。

    下面的代码将生成一个彩色点的 3D 散点图和一个带有颜色平均值的表面。

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    
    def fn(x, y):
        """Custom fuction to determine the colour (potential?) of the point"""
        return (x + y) / 2  # use average as a placeholder
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    size = 11  # range 0 to 10
    # Make the 3D grid
    X, Y, Z = np.meshgrid(np.arange(0, size, 1),
                          np.arange(0, size, 1),
                          np.arange(0, size, 1))
    
    # calculate a colour for point(x,y,z)
    zs = np.array([fn(x, y) for x, y in zip(np.ravel(X), np.ravel(Y))])
    ZZ = zs.reshape(X.shape)  # this is used below
    
    # create the surface
    xx, yy = np.meshgrid(np.arange(0, size, 1), np.arange(0, size, 1))
    # Calcule the surface Z value, e.g. average of  the colours calculated above
    zzs = np.array([np.average(ZZ[x][y]) for x, y in zip(np.ravel(xx), np.ravel(yy))])
    zz= zzs.reshape(xx.shape)
    
    cube = ax.scatter(X, Y, Z, zdir='z', c=zs, cmap=plt.cm.rainbow)
    surf = ax.plot_surface(xx, yy, zz, cmap=plt.cm.rainbow) 
    cbar = fig.colorbar(cube, shrink=0.6, aspect=5) # Add a color bar
    
    plt.show()
    

    生成的图像将如下所示:

    编辑:使用您的附加代码,我可以复制您的多维数据集。

    然后使用下面的代码生成一个表面:

    xx, yy = np.meshgrid(np.arange(0, size, 1), np.arange(0, size, 1))
    #define potential range
    min_p = 1.0
    max_p = 4.0
    
    zz = np.zeros((size, size))
    for i in range(size):  # X
        for j in range(size):  # Y
            for k in range(size):  # Z
                p = potential[k,j,i]
                if min_p < p < max_p:
                    zz[j][i] = p # stop at the first element to meet the conditions
                    break # break to use the first value in range
    

    然后绘制这个表面:

    surf = ax.plot_surface(xx, yy, zz, cmap=plt.cm.rainbow) 
    

    注意:包含 vmin 和 vmax 关键字参数以保持相同的比例,我已将它们排除在外,因此表面偏差更加明显。我还将立方体上的 alpha 设置为 0.2,以便更容易看到表面。

    【讨论】:

    • 你是对的!对不起,我忘记了!我已经编辑了这个问题。我的疑问是如何使表面仅通过相同颜色的点。制作等势点的曲面。 @埃里克
    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2022-01-27
    • 2019-06-04
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多