2016-03-29 33 views
0

matplotlib ve python kullanarak bir 3d dağılım grafiği oluşturmaya çalışıyorum. Sorun şu şekildedir: 3d arsadaki noktaların ofseti, bunların tam olarak nerede olduğunu anlamak imkansız hale getirmektedir. Bu grafikte enter image description hereMatplotlib kullanarak offset olmaksızın 3d dağılım grafiği

, bu noktaları tam köşeler denk olmadığını gözlemleyin: Burada

inşa edilmiş grafiktir. Yani, grafiğe göre, veri setinde yer almayan 0B ile 1B ve 4S arasında bir nokta olduğunu gösterir (aşağıdaki MWE koduna bakınız). Ofsetin ayarlanması için yapılması gereken bir şey var mı?

#!/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() 

cevap

1

Ben iki boyutlarına 3 boyutlu bilgi sunmak için çalışıyor olması dışında arsa yanlış bir şey, orada olduğunu sanmıyorum. Perspektifteki girişimi (3D'yi bu şekilde gösterir), ofsetin neden olduğu şeydir. Çoğunlukla 3D efektini atlayarak ya da alternatif olarak arsa üzerinde "kamera açısını" ayarlayarak, ofsetin azaltılması veya ortadan kaldırılması için herhangi bir kaymayı ortadan kaldırabilirsiniz. Kamera açısını axes1.view_init(elev=x, azim=y) kullanarak ayarlayın. Örneğin, verileri kullanarak, elev=10, azim=90 şuna benzer:

5``

Ve elev=-5, azim=0 şuna benzer: enter image description here

Bunu yardımcı olup olmadığını görmek için manzaralı etrafında oynayabilir. Bunlar, ofsetleri değiştirse de, bunlar sorunu tamamen ortadan kaldırmaz, çünkü bu parsellerin 3B doğası için temeldir.

+0

Bu çok mantıklı. Farklı görüntüleme açılarıyla koşmayı deneyeceğim ve sonra göreceğim. Teşekkürler. – tandem

+0

3B grafikleri yapıyorum, genellikle, çok çeşitli görünümler, örn. -90 ila 90 arası 2 o adımda. Bu gerçekten "3Dness" i ortaya çıkarır ve perspektifle ilişkili ofsetleri büyük ölçüde azaltır. Açıkçası bu, kağıt üzerinde yayın yapıyorsanız iyi olmaz, ancak web yayıncılığı ve bununla iyi çalışabilir, ör. onu bir gif'e dönüştürmek – iayork

+0

Ama, onu bir gif haline nasıl çevirirsiniz? bir örnek verebilir misin ? – tandem

İlgili konular