使用matplotlib给定数据的怪异3d条形图

时间:2018-11-04 09:50:32

标签: python matplotlib 3d covariance probability-density

我正在尝试3D绘制下面的数据,高度是概率质量函数中的指定联合概率。这个想法是可视化协方差。我必须使用3D,因为不同样本组合的概率不同。条形图或框形图以怪异的方式彼此重叠,我无法从不同角度推断出正确的3d透视图。如果您在下面的gif中查看,您会知道(盒子突然在彼此之间以几个角度相互错开)。请帮助解决此问题。而且Alpha无法正常工作。

问题:
1.奇怪的3d框渲染
2. Alpha也不起作用

问题输出:
img

MWE(jupyter):

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from itertools import product
from mpl_toolkits.mplot3d import Axes3D


X , Y = [100,250], [0,100,200]
xb, yb = 175, 125

import pandas as pd
matrix = np.array([
        [0.20, 0.10, 0.20],
        [0.05, 0.15, 0.30]
        ])
df = pd.DataFrame(matrix, columns=Y)
df.index = [100, 250]

top = 1
fig = plt.figure(figsize=(15,5))

ax1 = fig.add_subplot(121)

for xy in product(X,Y):
    x,y = xy[0], xy[1]
    z = df.loc[x,y]
    d1, d2 = xb - x, yb - y
    color = 'green' if d1*d2 > 0 else 'red'
    ax1.add_patch(patches.Rectangle((x, y), d1, d2, alpha=z, facecolor=color))
    ax1.scatter(x,y,color='black')


ax1.axvline(x=Xb, ls=':', color='blue')
ax1.axhline(y=Yb, ls=':', color='blue')
ax1.set_xticks(X)
ax1.set_yticks(Y)
ax1.set_xlim([min(X)-50,max(X)+50])
ax1.set_ylim([min(Y)-50,max(Y)+50])



ax2 = fig.add_subplot(122, projection='3d')
ax2.view_init(elev=30., azim=-50)
for xy in product(X,Y):    
    x ,y = xy[0], xy[1]
    z = df.loc[x,y]
#     print(x, y, z)
    width = x - 175
    depth = y - 125
    pro = width*depth
    top = z
    bottom = np.zeros_like(top)
    if pro > 0: #positive
        color='#B9F6CA'
    else:
        color='#EF9A9A'
    ax2.bar3d(x, y, bottom,  -width, -depth, top, color=color)
    ax2.scatter(x, y, z, color='blue')

def rotate(angle):
    ax2.view_init(azim=angle)    

from matplotlib import animation
ani = animation.FuncAnimation(fig, rotate, frames=np.arange(0,362,2),interval=100)    
from IPython.display import HTML
plt.close()
HTML(ani.to_jshtml())

相关数学问题:
enter image description here

0 个答案:

没有答案