Построение нескольких контурных графиков на кубе с использованием Mayavi - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь нанести контуры на каждую грань куба, используя Mayavi .Точнее, я хочу взять каждую грань куба индивидуально и нанести на нее контурный график таким же образом, как если бы вы использовали Matplotlib.

Картинка ниже может помочь вам понять, что я пытаюсь сделать.За исключением этого случая куб уплощен.Contour plot over the flattened cube

Вопрос - какую функцию Mayavi я должен использовать?и как я могу создать подходящий куб?

Я прошел через contour_surf (), surf () и mesh (), но у меня есть ощущение, что ни одна из этих функций не может помочь мне отобразить /построить куб, на котором я могу построить контуры над его гранями.

Или, может быть, более подходящим было бы использование другой библиотеки ?

Я попробовал использовать Matplotlib с приведенным ниже кодом.Рендеринг не так хорош, как я ожидаю, что он будет с Mayavi, при манипулировании трудно различить, какое лицо находится на переднем плане.

Прежде всего, я не знаю, как получить координаты мыши, когда я нажимаю на конкретную грань куба.На самом деле, в конечном итоге я хочу перетащить объект на произвольную грань куба и получить координаты (x, y) и значение контура z.

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
from itertools import permutations

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

# data to plot cube edges
a = np.linspace(0,1,10)
b = np.zeros_like(a)
c = np.zeros_like(a)
c.fill(1)

# draw wire cube to help visualization
for i in permutations((a,b,b),3):  

    ax.plot(i[0],i[1],i[2], 'k--', linewidth=2)

for i in permutations((a,c,c),3):  

    ax.plot(i[0],i[1],i[2], 'k--', linewidth=2)

for i in permutations((a,c,b),3):  

    ax.plot(i[0],i[1],i[2], 'k--', linewidth=2)

# Making the grid and data for contours
X,Y = np.mgrid[0:1:10j, 0:1:10j]
Z = np.random.randint(5, size=X.shape)

# Plotting contours, here the trick is to swap (X,Y,Z) out to prevent 
# projection
ax.contourf(X,Y,Z, zdir='z', offset=1, cmap=cm.coolwarm)
ax.contourf(Y,Z,X, zdir='y', offset=0, cmap=cm.coolwarm)
ax.contourf(Z,Y,X, zdir='x', offset=0, cmap=cm.coolwarm)
ax.contourf(Y,Z,X, zdir='y', offset=1, cmap=cm.coolwarm)
ax.contourf(Z,Y,X, zdir='x', offset=1, cmap=cm.coolwarm)

# Setting axis limits and labels
ax.set_xlabel('X')
ax.set_xlim(0, 1)
ax.set_ylabel('Y')
ax.set_ylim(0, 1)
ax.set_zlabel('Z')
ax.set_zlim(0, 1)
ax.set_axis_off()

# get a proper view 
ax.view_init(elev=-22., azim=-135)
plt.show()

Результат с использованием matplotlib

...