Я пытаюсь построить трехмерный график под данными, где высота соответствует вероятности вероятности соединения из функции вероятности. Идея состоит в том, чтобы визуализировать ковариацию. Мне пришлось пойти в 3D, потому что, вероятности варьируются для разных комбинаций выборки. Столбцы или прямоугольники накладываются друг на друга странным образом, и я не могу определить правильную трехмерную перспективу под разными углами. Если вы посмотрите на рисунок ниже, вы узнаете (окно внезапно растет друг над другом под несколькими углами из ниоткуда). Пожалуйста, помогите, как решить эту проблему. Также альфа не работает.
Вопросы:
1. Странный рендеринг 3-х коробок
2. Альфа тоже не работает
Проблемный вывод:
![img](https://u.cubeupload.com/testy/animation.gif)
MWE (юпитер):
%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](https://i.stack.imgur.com/oLDRg.png)