2016-05-27 6 views
0

2D平面では、(x,y)座標で定義されたnxn点のセットがあります。各点について、3Dサーフェスとしてプロットしたい特定の量が存在します。どのようにして、各点にプロットの関連する値が割り当てられるのですか?私は混乱したプロットを取得しているので、私は尋ねる。Python:点の値から一貫した3Dプロットを作成する

私は自分自身をよりよく説明します。私は:

  1. 平面における10x10=100点に対する位置の辞書:

dict1={0:(0, 0), 1:(0, 1), 2:(0, 2), ..., 99:(9,9)}

  • うとしている値の辞書関連する

    dict2=OrderedDict([(0, 369670), (1, 370622), (2, 267034), ..., (99, 217500)])

    :言ったポイントでdict1dict2
  • マージ、各値が正しいポイントに関連付けられている場合、各点はその座標に基づいて標識されている:
  • merged_dict={dict1[k]: v for k, v in dict2.items()}

    merged_dict={(0,0):369670, (0,1):370622, (0,2):267034, ..., (9,9): 217500}

    目的の3Dプロットは、ポイント座標がXで、YとZがmerged_dictから来ています。これは私の試みです:

    #3D plot 
    import numpy as np 
    from mpl_toolkits.mplot3d import Axes3D 
    from matplotlib import cm 
    
    fig = plt.figure() 
    ax = fig.gca(projection='3d') 
    inds=[(0, 0), (0, 1), (0, 2), ..., (9,9)] #The coordinates of each point -> len(inds)=100 
    
    X=[] 
    for k in range(len(inds)): 
        X.append(int(inds[k][0])) 
    Y=X 
    
    X, Y = np.meshgrid(X, Y) 
    
    merged_dict = {dict1[k]: v for k, v in dict2.items()} 
    
    Z = merged_dict.values() 
    
    surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.winter, linewidth=0, antialiased=True) 
    
    ax.set_zlim(0, 900000) 
    
    ax.zaxis.set_major_locator(LinearLocator(10)) 
    ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) 
    
    plt.show() 
    

    私が手プロットが間違っているで、それはめちゃくちゃ表面を備えていること。意図する結果は、点(4,4)、(5,4)、(4,5)、(5,5)に対応して800,000以上のピークを有する対称的なベル形の表面である。代わりに、結果はZ値が関連するX、Y座標と正しく関連付けられていないと考えるようになります。 これを修正するには? enter image description here

    EDIT

    これらは、関連する実際のデータです:

    In[1]: merged_dict 
    Out[1]: 
    {(0, 0): 369670, 
    (0, 1): 370622, 
    (0, 2): 267034, 
    (0, 3): 169500, 
    (0, 4): 116014, 
    (0, 5): 116014, 
    (0, 6): 169500, 
    (0, 7): 267034, 
    (0, 8): 370622, 
    (0, 9): 369670, 
    (1, 0): 370622, 
    (1, 1): 491950, 
    (1, 2): 456750, 
    (1, 3): 370180, 
    (1, 4): 308118, 
    (1, 5): 308118, 
    (1, 6): 370180, 
    (1, 7): 456750, 
    (1, 8): 491950, 
    (1, 9): 370622, 
    (2, 0): 267034, 
    (2, 1): 456750, 
    (2, 2): 542718, 
    (2, 3): 554980, 
    (2, 4): 543588, 
    (2, 5): 543588, 
    (2, 6): 554980, 
    (2, 7): 542718, 
    (2, 8): 456750, 
    (2, 9): 267034, 
    (3, 0): 169500, 
    (3, 1): 370180, 
    (3, 2): 554980, 
    (3, 3): 689848, 
    (3, 4): 759272, 
    (3, 5): 759272, 
    (3, 6): 689848, 
    (3, 7): 554980, 
    (3, 8): 370180, 
    (3, 9): 169500, 
    (4, 0): 116014, 
    (4, 1): 308118, 
    (4, 2): 543588, 
    (4, 3): 759272, 
    (4, 4): 888268, 
    (4, 5): 888268, 
    (4, 6): 759272, 
    (4, 7): 543588, 
    (4, 8): 308118, 
    (4, 9): 116014, 
    (5, 0): 116014, 
    (5, 1): 308118, 
    (5, 2): 543588, 
    (5, 3): 759272, 
    (5, 4): 888268, 
    (5, 5): 888268, 
    (5, 6): 759272, 
    (5, 7): 543588, 
    (5, 8): 308118, 
    (5, 9): 116014, 
    (6, 0): 169500, 
    (6, 1): 370180, 
    (6, 2): 554980, 
    (6, 3): 689848, 
    (6, 4): 759272, 
    (6, 5): 759272, 
    (6, 6): 689848, 
    (6, 7): 554980, 
    (6, 8): 370180, 
    (6, 9): 169500, 
    (7, 0): 267034, 
    (7, 1): 456750, 
    (7, 2): 542718, 
    (7, 3): 554980, 
    (7, 4): 543588, 
    (7, 5): 543588, 
    (7, 6): 554980, 
    (7, 7): 542718, 
    (7, 8): 456750, 
    (7, 9): 267034, 
    (8, 0): 370622, 
    (8, 1): 491950, 
    (8, 2): 456750, 
    (8, 3): 370180, 
    (8, 4): 308118, 
    (8, 5): 308118, 
    (8, 6): 370180, 
    (8, 7): 456750, 
    (8, 8): 491950, 
    (8, 9): 370622, 
    (9, 0): 369670, 
    (9, 1): 370622, 
    (9, 2): 267034, 
    (9, 3): 169500, 
    (9, 4): 116014, 
    (9, 5): 116014, 
    (9, 6): 169500, 
    (9, 7): 267034, 
    (9, 8): 370622, 
    (9, 9): 369670} 
    

    答えて

    3

    私はラインY=Xで問題を推測します。 X, Yはリストです。 Y=Xと書くと、YXへの参照です。コピーする必要があります。

    Y = [] 
    numpy.copy(Y,X) 
    

    この亜種をテストし、何が起こったのかを書き留めてください。それ以外の場合、merged_dictのデータを投稿して、実際の値のプロットをテストします。

    UPDATE:数字で

    見て、それが正しいのですか? 配列Zは2次元配列でなければなりませんが、コードでは1dリストです。

    import matplotlib.pyplot as plt 
    import numpy as np 
    from mpl_toolkits.mplot3d import Axes3D 
    from matplotlib import cm 
    
    fig = plt.figure() 
    ax = fig.gca(projection='3d') 
    
    X = np.arange(0,10,1) 
    Y = np.arange(0,10,1) 
    X, Y = np.meshgrid(X, Y) 
    merged_dict = {(0, 0): 369670, 
    (0, 1): 370622, 
    (0, 2): 267034, 
    ... 
    (9, 8): 370622, 
    (9, 9): 369670} 
    
    Z = np.array(merged_dict.values()).reshape(10,10) 
    surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.winter, linewidth=0, antialiased=True) 
    ax.set_zlim(0, 900000) 
    
    plt.show() 
    

    enter image description here

    UPDATE 2:

    問題は、辞書にあなたのためにデータストアを発生しますが、辞書は、インデックスによって並べ替えられていません。配列Zに値をロードするには:結果

    Z = np.zeros((10,10)) 
    
    for key in merged_dict: 
        i = key[0] 
        j = key[1] 
        Z[i][j] = int(merged_dict[key]) 
    

    、あなたが得る:

    enter image description here

    +0

    を残念ながら、これは出力が変化しませんでした。実際のデータの編集を確認してください。 – FaCoffee

    +0

    OK、実際の値のプロットをテストするmerged_dictのデータを投稿します。 – Serenity

    +0

    努力してくれてありがとうございますが、それは正しい表面ではありません。それは中心に鐘型のピークを持つべきであり、コーナーで感覚的に減少するはずです。私は 'Z = np.array'行について興味があります:' reshape'が呼び出されたとき、それは実際に点のx、y座標と対応するZ値の間の接続を保持していますか?私はそうではないと思うし、それが結果が正しい理由ではない。思考? – FaCoffee

    関連する問題