2016-03-29 50 views
0

私は、matplotlibとpythonを使って3d散布図を作成しようとしています。 問題は次のようになります。3Dプロット上の点のオフセットは、これらの要素が正確にどこにあるのか理解できなくなっています。これらの点は、まさに頂点と一致しないことがわかり、このグラフでenter image description herematplotlibを使用したオフセットのない3次元散布図

:ここ

が建設されたグラフです。つまり、グラフによれば、データセットに含まれていない0Bと1Bと4Sの間にポイントが存在することを示しています(下記のコードMWEを参照)。オフセットを設定するために必要なことはありますか?

#!/usr/bin/env python 
import matplotlib.pyplot as plt 
from matplotlib.font_manager import FontProperties 
from mpl_toolkits.mplot3d import Axes3D 
import string 
from matplotlib import cm 
import matplotlib 

def plot_state_transition(): 
    xTickMarks = ["-1B","0B", "1B", "2B", "3B"]#, "4B"]#, "1B3S", "2B2S"] 
    yTickMarks = ["-1S","0S", "1S", "2S", "3S", "4S"] 
    zTickMarks = ["0", "0.6", "0.65", "0.9", "1.15"] 
    matplotlib.rc('font', serif='Helvetica Neue') 
    matplotlib.rc('text', usetex='false') 
    matplotlib.rcParams.update({'font.size': 10}) 

    fig = plt.figure(figsize=(11.69,4.88)) # for landscape 
    axes1 = fig.add_subplot(111, projection='3d') 
    savename = "state-transition.png" 

    tup = [] 
    plt.grid(True,linestyle='-',color='0.75') 
    X_AXIS = ['2B', '2B', '1B', '2B', '2B', '2B', '1B', '2B'] 
    Y_AXIS = ['0S', '2S', '3S', '2S', '2S', '2S', '3S', '2S'] 
    Z_AXIS = ['0.6', '0.6', '0.6', '0.6', '0.6', '0.9', '0.9', '0.9'] 
    s = [12.900648500000001, 12.705360163934426, 13.021028032786887, 13.258014354838707, 14.418979838709676, 17.092295806451613, 15.625246451612906, 17.484319354838711] 

    x = [xTickMarks.index(i) for i in X_AXIS] 
    y = [yTickMarks.index(i) for i in Y_AXIS] 
    z = [zTickMarks.index(i) for i in Z_AXIS] 
    s = s 

    axes1.scatter(x, y, z, c='r', marker='o') 

    axes1.set_xlim((0, len(xTickMarks)-1)) 
    axes1.set_ylim((0, len(yTickMarks)-1)) 
    axes1.set_zlim((0, len(zTickMarks)-1)) 

    axes1.set_xticks(xrange(len(xTickMarks))) 
    axes1.set_yticks(xrange(len(yTickMarks))) 
    axes1.set_zticks(xrange(len(zTickMarks))) 

    axes1.set_xticklabels(xTickMarks) 
    axes1.set_yticklabels(yTickMarks) 
    axes1.set_zticklabels(zTickMarks) 

    axes1.set_ylabel('Small cores') 
    axes1.set_zlabel('Frequency') 
    axes1.set_xlabel('Big cores') 

    axes1.xaxis.grid(True) 
    figsize=(11.69,8.27) # for landscape 
    fig.savefig(savepath + savename, bbox_inches='tight', dpi=300, pad_inches=0.1) 
    plt.clf() 


def main(): 
    plot_state_transition() 

if __name__ == "__main__": 
    main() 

答えて

1

2次元の3次元情報を表示しようとしている点を除いて、プロットに何か問題はないとは思わない。遠近法での試み(これが3Dに見える理由)は、オフセットの原因です。オフセットを削除するには、3Dエフェクトをスキップするか、プロット上に「カメラアングル」を設定して、オフセットを減らすか削除します。 axes1.view_init(elev=x, azim=y)を使用してカメラアングルを設定します。

5``

そしてelev=-5, azim=0次のようになります:あなたはそれができますかどうかを確認するためのビューで遊ぶことができます enter image description here

たとえば、あなたのデータを使用して、elev=10, azim=90は次のようになります。これらはオフセットを変更しますが、これらはこれらのプロットの3D特性に本質的であるため、問題を完全に取り除くものではありません。

+0

これはかなり意味があります。私はさまざまな視野角で走ってみて、それから見てみましょう。ありがとう。 – tandem

+0

私が3Dプロットをしているとき、私はしばしばプロットをアニメーション化して、幅広いビューを表示します。 -90°から90°まで2°ずつシフトします。それは本当に「3Dness」を引き出し、パースペクティブなオフセットの問題を大幅に軽減します。明らかに紙に公開しているのであれば、それは良いことではありませんが、ウェブ出版などでうまくいくことができます。これをgifに変換する – iayork

+0

しかし、それをどのようにGIFに変換しますか?あなたは例を挙げることができますか? – tandem

関連する問題