#python #matplotlib #coordinate-transformation #mplot3d
#python #matplotlib #преобразование координат #mplot3d
Вопрос:
Я строю данные из 3D-изображений, где эталонная система координат ориентирована нетрадиционно. В частности, для пациента, лежащего на спине (лицом вверх), направление X указывает налево от пациента, Y указывает на пол и Z указывает в направлении их головы. Это все еще правосторонняя система координат. Если я использую ax.view_init() для установки точки зрения, которая приближается к этой ориентации, я обнаруживаю, что интерактивные манипуляции работают ужасно. Пока что мое решение состоит в том, чтобы передать мои точки данных через матрицу вращения, чтобы отобразить ее в эту ориентацию в мировом пространстве и отобразить результат. Я мог бы также вызвать ax.plot(-z, x, -y) для достижения того же результата. Это функционально, но приводит к запутыванию кода, и я обнаружил, что он подвержен ошибкам.
Есть ли способ встроить мою матрицу преобразования в цепочку обработки mplot3d, чтобы это происходило автоматически? Документация все еще немного неполная для преобразований, которые она выполняет, и я не смог определить, с чего начать, хотя я думаю, что это возможно.
Чтобы быть немного более конкретным, вот код, который обычно отображается слева и в ориентации, которую я бы предпочел справа:
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(8,4))
ax1 = fig.add_subplot(121, projection='3d')
ax2 = fig.add_subplot(122, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
pts = np.vstack((X.flatten(), Y.flatten(), Z.flatten(), np.ones_like(X.flatten())))
xf = np.array([
[0., 0.,-1., 0.],
[1., 0., 0., 0.],
[0.,-1., 0., 0.],
[0., 0., 0., 1.]
])
pts = xf @ pts
xt = pts[0].reshape((X.shape))
yt = pts[1].reshape((Y.shape))
zt = pts[2].reshape((Z.shape))
ax1.plot_surface(X, Y, Z, rstride=10, cstride=10)
ax2.plot_surface(xt, yt, zt, rstride=10, cstride=10)
for ax in (ax1, ax2):
for ff in (ax.set_xlim, ax.set_ylim, ax.set_zlim):
ff(-50, 50)