72208


python3.5を使っています。例えばmatplotlibのplot_surface()を使って球を描写するには次のようなコードを書けば描写できます。

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    from mpl_toolkits.mplot3d import axes3d
    
    r=1
    p = np.linspace(0, 2* np.pi, 10)
    t = np.linspace(0, np.pi, 10)
    p, t = np.meshgrid(p, t)
    
    x = r* np.sin(t)* np.cos(p)
    y = r* np.sin(t)* np.sin(p)
    z = r* np.cos(t)
    
    # plotting :-
    fig = plt.figure(figsize=(6,6))
    ax = fig.add_subplot( 111 , projection='3d')
    ax.set_xlim(-1,1)
    ax.set_ylim(-1,1)
    ax.set_zlim(-1,1)
    ax.plot_surface(x, y, z, linewidth = .5,edgecolor='k',cmap=plt.cm.coolwarm, antialiased=True)
    ax.scatter(x,y,z)
    
[/code]

上のコードを実行することで次のような球を描写することが出来ます。  
[![画像](https://i.stack.imgur.com/Fg2Ko.png)](https://i.stack.imgur.com/Fg2Ko.png)

ここで、極座標的なデータの点群のみが存在する際に同様にplot_surface()の様に3次元の表面を補完したいです。例えば次のようなx_list、y_list、z_listの点群がデータとして存在したとします。

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    from mpl_toolkits.mplot3d import axes3d
    
    
    
    r=1
    p = np.linspace(0, 2* np.pi, 10)
    t = np.linspace(0, np.pi, 10)
    p, t = np.meshgrid(p, t)
    
    x = r* np.sin(t)* np.cos(p)
    y = r* np.sin(t)* np.sin(p)
    z = r* np.cos(t)
    
    
    x_list=[]
    y_list=[]
    z_list=[]
    for i in range(0,len(p)):
        for j in range(0,len(t)):
            x_list.append(x[i][j])
            y_list.append(y[i][j])
            z_list.append(z[i][j])
    
    
    fig = plt.figure(figsize=(6,6))
    ax = fig.add_subplot( 111 , projection='3d')
    
    ax.scatter(x_list,y_list,z_list)
    
[/code]

[![画像2](https://i.stack.imgur.com/IElof.png)](https://i.stack.imgur.com/IElof.png)

ここで、x_list,y_list,z_listの情報のみがデータとして存在している状態で、その点群を最初の例の様に、表面を補完したような図に直すことは出来るのでしょうか？


CC BY-SA 4.0
2020-11-25T04:14:50.123
72190
2020-11-25T16:22:50.473
26529
question
python matplotlib
pythonでデータの点群のみから極座標でのplot_surfaceを行いたい


点群が構成する面に凹なところが無いのであれば、各点から最も近い点に辺を張り、辺で接続された点群から面を構成することで、立体の表面を構成することは可能だと思います。


CC BY-SA 4.0
2020-11-25T05:53:19.917
72193
2020-11-25T05:53:19.917
217
72190
answer


質問の意図を読み誤っているのかもしれませんが、`x_list` などを `numpy.reshape` で元の構造に戻せば良いかと思います。

[code]

                :
    fig = plt.figure(figsize=(6,6))
    ax = fig.add_subplot(111, projection='3d')
    
    ax.plot_surface(
      np.array(x_list).reshape(len(p), len(t)),
      np.array(y_list).reshape(len(p), len(t)),
      np.array(z_list).reshape(len(p), len(t)),
      linewidth = .5, edgecolor='k',
      cmap=plt.cm.coolwarm, antialiased=True)
    
    ax.scatter(x_list,y_list,z_list)
                :
    
[/code]


CC BY-SA 4.0
2020-11-25T16:22:50.473
72208
2020-11-25T16:22:50.473
72190
answer