tmo*_*tmo 2 python 3d plot matplotlib
我在(x,y)平面上有一个随机游走者,在(x,y,z)平面上有一个-log(双变量高斯).这两个数据集基本上是独立的.
我想对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)
Run Code Online (Sandbox Code Playgroud)
哪个产生
正如您所看到的那样,我唯一要努力的是如何在满足适当的Z值时终止垂直线.欢迎任何想法!
您目前只使用[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)
Run Code Online (Sandbox Code Playgroud)
这将为您循环的每个点获取x和y坐标,并计算该点上覆高斯的高度并绘制到那里.这是一个改变线条样式的图,以强调与问题相关的线条:
| 归档时间: |
|
| 查看次数: |
2317 次 |
| 最近记录: |