2017-06-14 20 views
0

Matplotlibを使用して3D散布図にプロットした(x、y.z)座標の2つのセットがあります。さて、私は、得られた各四辺形を平面に接続したいと思います。 3D空間に2Dポリゴンを描画する方法を、Plotting 3D Polygons in python-matplotlibから見てきました。隣接する点を3D散布図の線で結合するPython

どのようにするか分からないのは、私のセットのポイントを4ポイントグループにグループ化してポリゴンを描くことです。たとえ私が各点をその隣人と直線で結ぶことができたとしても、私は満足しています。

私のポイントセットは平面分布に非常に近いものです。それは単なる座標のセットであり、その下に制約はありません。 enter image description here

マイコード:あなたがplot_surfaceplot_wireframeプロットを使用することができます代わりに、個々のポリゴンの

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

def plot_figure(data): 
    fig = plt.figure() 
    ax = fig.gca(projection='3d') 

    ax.scatter(data[:, 0], data[:, 1], data[:, 2], 
      c='r', s=20, linewidths=None) 

    ax.axis('equal') 
    ax.axis('tight') 

    plt.show() 


data = [[ 1900., 800., 442.82], [ 1900., 900., 463.04], [ 1900.,1000., 
473.06], [ 1900.,1100., 485.07], 
[ 1900.,1200., 498.63], [ 1900.,1300., 513.83], [ 1900.,1400., 536.1 ], [ 
1900.,1500., 551.29], 
[ 1900.,1600., 566.5 ], [ 1900.,1700., 581.65], [ 1900.,1800., 603.91], [ 
2000., 800., 453.5 ], 
[ 2000., 900., 473.75], [ 2000.,1000., 487.14], [ 2000.,1100., 499.48], [ 
2000.,1200., 513.39], 
[ 2000.,1300., 528.92], [ 2000.,1400., 551.85], [ 2000.,1500., 567.35], [ 
2000.,1600., 582.9 ], 
[ 2000.,1700., 598.4 ], [ 2000.,1800., 621.32], [ 2100., 800., 464.23], [ 
2100., 900., 485.34], 
[ 2100.,1000., 502.87], [ 2100.,1100., 515.71], [ 2100.,1200., 530.13], [ 
2100.,1300., 546.14], 
[ 2100.,1400., 570.05], [ 2100.,1500., 586.1 ], [ 2100.,1600., 602.15], [ 
2100.,1700., 618.15], 
[ 2100.,1800., 642.09], [ 2200., 800., 474.94], [ 2200., 900., 498.72], [ 
2200.,1000., 516.91], 
[ 2200.,1100., 530.09], [ 2200.,1200., 544.83], [ 2200.,1300., 561.2 ], [ 
2200.,1400., 585.8 ], 
[ 2200.,1500., 602.17], [ 2200.,1600., 618.55], [ 2200.,1700., 634.89], [ 
2200.,1800., 659.46], 
[ 2300., 800., 487.69], [ 2300., 900., 513.43], [ 2300.,1000., 532.64], [ 
2300.,1100., 546.32], 
[ 2300.,1200., 561.57], [ 2300.,1300., 578.43], [ 2300.,1400., 604.03], [ 
2300.,1500., 620.89], 
[ 2300.,1600., 637.76], [ 2300.,1700., 654.62], [ 2300.,1800., 680.23], [ 
2400., 800., 500.75], 
[ 2400., 900., 526.83], [ 2400.,1000., 546.69], [ 2400.,1100., 560.71], [ 
2400.,1200., 576.3 ], 
[ 2400.,1300., 593.52], [ 2400.,1400., 619.78], [ 2400.,1500., 636.98], [ 
2400.,1600., 654.2 ], 
[ 2400.,1700., 671.38], [ 2400.,1800., 697.66], [ 2500., 800., 516.1 ], [ 
2500., 900., 542.71], 
[ 2500.,1000., 563.6 ], [ 2500.,1100., 578.12], [ 2500.,1200., 594.18], [ 
2500.,1300., 611.89], 
[ 2500.,1400., 639.17], [ 2500.,1500., 656.87], [ 2500.,1600., 674.58], [ 
2500.,1700., 692.26], 
[ 2500.,1800., 719.53], [ 2600., 800., 530.05], [ 2600., 900., 556.98], [ 
2600.,1000., 578.51], 
[ 2600.,1100., 593.37], [ 2600.,1200., 609.77], [ 2600.,1300., 627.81], [ 
2600.,1400., 655.76], 
[ 2600.,1500., 673.82], [ 2600.,1600., 691.86], [ 2600.,1700., 709.87], [ 
2600.,1800., 737.83]] 
data = np.asarray(data) 

plot_figure (data) 
+0

で既に四角形のグリッドを持っている場合は、直接 'plot_surface'を使用する場合があります。あなたがそのようなグリッドからポイントを持っているなら、 'plot_surface'がそれらを理解できるように、最初にそれらを正しい形状に持っていきたいかもしれません。助けが必要な場合は、質問を更新し、実際のコードを表示することをお勧めします。いずれの場合でも、個々のポリゴンを描画するよりも簡単です。 – ImportanceOfBeingErnest

+0

私の座標セットはグリッドを形成しません。彼らは飛行機に非常に近いように見えても、飛行機に横たわっていません。 – Argentina

+0

プロットから見ると、そのように見えます。いずれにしても、回答が必要な場合は、データとコードを入力してプロットを表示してください。 – ImportanceOfBeingErnest

答えて

1

。これを使用できるようにするには、グリッドを構成するためにデータを変更する必要があります。この場合、データは既に有効な順序であるため、これは簡単です。

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

#data = data from the question 
data = np.asarray(data) 

a,b = len(np.unique(data[:,0])), len(np.unique(data[:,1])) 

X = data[:,0].reshape(a,b).T 
Y = data[:,1].reshape(a,b).T 
Z = data[:,2].reshape(a,b).T 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

ax.plot_surface(X,Y,Z) 

ax.axis('equal') 
ax.axis('tight') 

plt.show() 

enter image description here

または

ax.plot_wireframe(X,Y,Z) 

enter image description here

+0

最初のケースでは、グリッド線(四角形の各境界線)をマークすることは可能ですか? – Argentina

+0

edgecolorの 'ax.plot_surface(X、Y、Z、edgecolor =" limegreen ")'を設定することができます。 – ImportanceOfBeingErnest

関連する問題