2015-12-05 1 views
1

Je voudrais tracer une distribution de vraisemblance, fondamentalement une matrice NxT, où chaque ligne représente une distribution sur une variable dans chaque pas de temps t (t = 0 ... T), donc je pouvais visualiser la trajectoire qu'une estimation de vraisemblance maximale donnerait.Tracé d'une série de graphiques 2D projetés en 3D d'une manière perspective

j'imagine que plusieurs parcelles 2D, l'une en face de l'autre - quelque chose comme ceci:

please ignore the axis labels

jusqu'à présent basé sur this J'ai essayé:

def TrajectoryPlot(P): 
    P=P[0:4] 
    fig = plt.figure() 
    ax = fig.gca(projection='3d') 
    def cc(arg): 
     return colorConverter.to_rgba(arg, alpha=0.6) 
    xs = np.arange(0, len(P[0])) 
    verts = [] 
    zs = [0.0, 1.0, 2.0, 3.0, 4.0] 
    for i in range(len(P)): 
     print(i) 
     verts.append(list(zip(xs, P[i])))  
    poly = PolyCollection(verts, facecolors=[cc('r'), cc('g'), cc('b'), 
              cc('y')]) 
    poly.set_alpha(0.7) 
    ax.add_collection3d(poly, zs=zs, zdir='y') 
    ax.set_xlabel('X') 
    ax.set_ylabel('Likelihood') 
    ax.set_zlabel('Time') 
    plt.show() 

Mais cela ne pas encore travaillé

+0

Avez-vous regardé dans la [galerie matplotlib] (http: // matplotlib .org/gallery.html)? Plus précisément, une combinaison de [this] (http://matplotlib.org/examples/mplot3d/2dcollections3d_demo.html) et [this] (http://matplotlib.org/examples/mplot3d/polys3d_demo.html) répondrait à vos besoins . –

+0

Honnêtement, je ne suis pas trop habile dans matplotlib, donc ceux-ci sont complètement incompréhensible pour moi. pour autant que je puisse voir, il n'y a pas de moyen simple de le faire. – ben0it8

+0

Qu'avez-vous essayé jusqu'à présent? Si j'étais vous, je commencerais par faire un seul tracé sur des axes 2D normaux correspondant à une «rangée» dans votre matrice. Je suis prêt à vous aider si vous êtes coincé sur quelque chose de spécifique, mais SO n'est pas un service d'écriture de code. Je ne pourrais pas vous donner un exemple complet même si je le voulais, puisque vous n'avez pas clairement expliqué votre structure de données ou ce que l'intrigue est censée représenter. Si matplotlib est vraiment «incompréhensible» pour vous, alors vous devriez peut-être commencer par [un des tutoriels] (http://matplotlib.org/resources/index.html#tutorials). –

Répondre

2

La fill_between routine retourne également un objet PolyCollection, de sorte que vous pouvez utiliser fill_between et ajouter que l'utilisation add_collection3d:

import matplotlib.pylab as pl 
from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 

x = np.linspace(1,5,100) 
y1 = np.ones(x.size) 
y2 = np.ones(x.size)*2 
y3 = np.ones(x.size)*3 
z = np.sin(x/2) 

pl.figure() 
ax = pl.subplot(projection='3d') 
ax.plot(x, y1, z, color='r') 
ax.plot(x, y2, z, color='g') 
ax.plot(x, y3, z, color='b') 

ax.add_collection3d(pl.fill_between(x, 0.95*z, 1.05*z, color='r', alpha=0.3), zs=1, zdir='y') 
ax.add_collection3d(pl.fill_between(x, 0.90*z, 1.10*z, color='g', alpha=0.3), zs=2, zdir='y') 
ax.add_collection3d(pl.fill_between(x, 0.85*z, 1.15*z, color='b', alpha=0.3), zs=3, zdir='y') 

ax.set_xlabel('Day') 
ax.set_zlabel('Resistance (%)') 

enter image description here