Я пытаюсь нанести контуры на каждую грань куба, используя Mayavi .Точнее, я хочу взять каждую грань куба индивидуально и нанести на нее контурный график таким же образом, как если бы вы использовали Matplotlib.
Картинка ниже может помочь вам понять, что я пытаюсь сделать.За исключением этого случая куб уплощен.
Вопрос - какую функцию 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