2016-08-01 277 views
1

我在(x,y)平面和(x,y,z)平面中有一个随机漫步器和一个-log(双变量高斯)。这两个数据集基本上是独立的。Python,Matplotlib:在3D图中绘制垂直线,当数据是独立的时

我想抽样,比如5(x,y)对的随机游走者,在z轴上画垂直线,当它“符合”双变量高斯时终止垂直线。

这是我到目前为止的代码:

import matplotlib as mpl 
import matplotlib.pyplot as plt 
import random 
import numpy as np 
import seaborn as sns 
import scipy 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.mlab import bivariate_normal 

%matplotlib inline 

    # Data for random walk 

def randomwalk(): 

    mpl.rcParams['legend.fontsize'] = 10 

    xyz = [] 
    cur = [0, 0] 

    for _ in range(40): 
     axis = random.randrange(0, 2) 
     cur[axis] += random.choice([-1, 1]) 
     xyz.append(cur[:]) 

    # Get density 

    x, y = zip(*xyz) 
    data = np.vstack([x,y]) 
    kde = scipy.stats.gaussian_kde(data) 
    density = kde(data) 


    # Data for bivariate gaussian 

    a = np.linspace(-7.5, 7.5, 40) 
    b = a 
    X,Y = np.meshgrid(a, b) 
    Z = bivariate_normal(X, Y) 
    surprise_Z = -np.log(Z) 

    # Get random points from walker and plot up z-axis to the gaussian 

    M = data[:,np.random.choice(20,5)].T 

    # Plot figure 

    fig = plt.figure(figsize=(10, 7)) 

    ax = fig.gca(projection='3d') 
    ax.plot(x, y, 'grey', label='Random walk') # Walker 
    ax.scatter(x[-1], y[-1], c='k', marker='o') # End point 

    ax.legend() 

    surf = ax.plot_surface(X, Y, surprise_Z, rstride=1, cstride=1, 
     cmap = plt.cm.gist_heat_r, alpha=0.1, linewidth=0.1) 

    #fig.colorbar(surf, shrink=0.5, aspect=7, cmap=plt.cm.gray_r) 

    for i in range(5): 
     ax.plot([M[i,0], M[i,0]],[M[i,1], M[i,1]], [0,10],'k--',alpha=0.8, linewidth=0.5) 

    ax.set_zlim(0, 50) 
    ax.set_xlim(-10, 10) 
    ax.set_ylim(-10, 10) 

将会产生

enter image description here

正如你可以看到我用的是如何当他们终止垂直线挣扎的唯一的事情满足适当的Z值。任何想法都欢迎!

回答

1

您目前只能通过使用[0,10]作为z坐标让这些线条达到10的高度。您可以将循环更改为以下:

for i in range(5): 
    x = [M[i,0], M[i,0]] 
    y = [M[i,1], M[i,1]] 
    z = [0,-np.log(bivariate_normal(M[i,0],M[i,1]))] 
    ax.plot(x,y,z,'k--',alpha=0.8, linewidth=0.5) 

这需要x和y的每一个点,你遍历坐标并计算覆高斯的高度,这一点,并密谋在那里。下面是改变强调有关问题的线线型一个情节:

enter image description here

+0

这是令人沮丧的简单。我发誓我尝试了类似的东西。但是,谢谢! – TMorville