странный 3d гистограмма для данных с использованием matplotlib - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь построить трехмерный график под данными, где высота соответствует вероятности вероятности соединения из функции вероятности. Идея состоит в том, чтобы визуализировать ковариацию. Мне пришлось пойти в 3D, потому что, вероятности варьируются для разных комбинаций выборки. Столбцы или прямоугольники накладываются друг на друга странным образом, и я не могу определить правильную трехмерную перспективу под разными углами. Если вы посмотрите на рисунок ниже, вы узнаете (окно внезапно растет друг над другом под несколькими углами из ниоткуда). Пожалуйста, помогите, как решить эту проблему. Также альфа не работает.

Вопросы:
1. Странный рендеринг 3-х коробок
2. Альфа тоже не работает

Проблемный вывод:
img

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...