2015-04-18 71 views
2

我正在尋找使用Python和matplotlib在單個繪圖中繪製二維概率分佈及其邊緣之一的2D概率分佈。我幾乎在那裏,但情節中的線總是繪製在表面的前面,而不是被正確地遮擋。我該如何解決?繪製線條和曲面以及正確的遮擋

import numpy as np 

import scipy.stats as stats 

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import axes3d 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

delta = 0.05 
f = 0.5 

X, Y = np.meshgrid(np.arange(-3.0, 3.0, delta), 
        np.arange(-3.0, 3.0, delta)) 
xy = np.hstack((X.flatten()[:, None], Y.flatten()[:, None])) 

p1 = stats.multivariate_normal.pdf(xy, mean=[1, -1], cov=(np.eye(2) * 0.28 * f)) 
p2 = stats.multivariate_normal.pdf(xy, mean=[-1, 1], cov=(np.eye(2) * 0.5 * f)) 

p = 0.3 * p1 + 0.7 * p2 
Z = p.reshape(len(X), len(X)) 

plt.plot(X[0, :], np.zeros(len(X)) + 3, np.sum(Z, 0) * 0.05) # , color='red') 

ax.plot_surface(X, Y, Z, alpha=1.0, cmap='jet', linewidth=0.1, rstride=2, cstride=2) 

ax.set_xlabel('Object colour') 
ax.set_ylabel('Illumination colour') 
ax.set_zlabel('Probability density') 
ax.set_zlim(min(cont_offset, np.min(Z)), max(np.max(Z), cont_offset)) 

plt.show() 
+1

什麼是mltools? – cge

+1

plt.plot有一個zorder參數,但我不確定這在3D軸中是否有意義。 – cphlewis

+0

mltools是我製作的一個小型庫,我重寫了使用scipy的代碼,以便它可以在沒有編輯的情況下運行。 zorder似乎不適用於我的情況。 – user1018464

回答

2

內置contour函數至少得到z-order的權利;如果你不想要完整的東西,你可以用計算出的Z作弊。要啓動,免去您的來電plt.plot與此:

from matplotlib import cm 
cset = ax.contour(X, Y, Z, zdir='y', offset=3, cmap='binary') 
cset = ax.contour(X, Y, Z, zdir='x', offset=-3, cmap='Blues') 

enter image description here

僞造了個Z的輪廓,一個辦法:

from matplotlib import cm 
Zys = np.zeros_like(Z) 
Zys[60,:] = Z.max(0) 
cset = ax.contour(X, Y, Zys, zdir='y', offset=3, cmap='binary') 
Zys = np.zeros_like(Z) 
Zys[:,60] = Z.max(1) 
cset = ax.contour(X, Y, Zys, zdir='x', offset=-3, cmap='Blues') 

enter image description here 更長遠的目標,某處contour代碼他們正在計算z​​序...

+0

太好了,非常感謝。雖然我必須通過傳遞一個不變的Z來作弊,但這種方法可行。 contour_plot = ax.contour(X,Y,np.tile(marginal,[len(marginal),1]),zdir ='y',offset = 3) – user1018464

+0

Ha,很高興它的工作!我只是在用一種不同的方式強制餵食「輪廓」。可惜它正在計算比需要更多的輪廓。 – cphlewis