2014-11-07 3 views
2

Я рисую некоторые данные в виде 3D-участка с использованием Matplotlib. Код, который я использую, очень похож на этот 3D surface plot example. Он генерирует график, показанный ниже:Как получить вертикальную ось Z в трехмерном графическом изображении Matplotlib?

enter image description here

Проблема с этим сюжетом является то, что Z-ось не по вертикали. Как сделать вертикальную ось Z?

Я изучил различные доступные API и нашел view_init. Установив низкую высоту (elev=1) сюжета с помощью view_init, можно получить Z-оси, чтобы быть вертикальным, как показано ниже:

enter image description here

Тем не менее, проблема здесь состоит в том, что при низкой высоте Y- метки метки оси, все они перезаписаны и не могут быть просмотрены правильно. Поэтому мне нужно, чтобы график находился на высокой высоте и с углом поворота плоскости X-Y, как показано на рисунке 1. Как достичь вертикальной оси Z для этого графика?

Я не знаю Matlab, но я знаю, что Matplotlib получен из API Matlab. Итак, я рассмотрел примеры поверхностного графика в документации Matlab и обнаружил, что ось Z в своих примерах кажется вертикальной. Один рисунок для иллюстрации с большой высоте показано ниже:

enter image description here

Update 1: На основании предложения Bentoy13, я установить view_init(elev=30, azim=-37.5) и получил результат ниже. Это лучше, но не по вертикали:

enter image description here

Для сравнения, Z-оси в Matlab сюжет совершенно вертикальной. Кроме того, как видно из этого угла, я не могу использовать этот azim=-37.5, поскольку некоторая информация скрыта. Любое другое решение? :-)

+1

Похоже, что перфективная проекция/проблема ortographc proyection –

ответ

2

В примерах, приведенных в документации Matlab, поверхностные участки часто рассматриваются в специальном положении, которое задается с помощью команды view:

view(3) 

Команда view устанавливает точку зрения осей. Согласно документу, view(3) устанавливает по умолчанию трехмерного виду в азимутальном с = -37,5 и высоте = 30.

РЕДАКТИРОВАТЬ

Проблемы с вертикальной Z-ось не то, что ось расположены вертикально , но это проблема перспективы. По умолчанию Matlab отображает 3D-поверхности с ортогональной проекцией, но matplotlib, похоже, рисует с перспективной проекцией. К сожалению Matplotlib не предоставляет API для установки этого ...

EDIT 2

Оказывается, что следующий патч очень полезно рисовать 3D в орфографической проекции:

import numpy 
from mpl_toolkits.mplot3d import proj3d 
def orthogonal_proj(zfront, zback): 
    a = (zfront+zback)/(zfront-zback) 
    b = -2*(zfront*zback)/(zfront-zback) 
    return numpy.array([[1,0,0,0], 
         [0,1,0,0], 
         [0,0,a,b], 
         [0,0,0,zback]]) 
proj3d.persp_transformation = orthogonal_proj 

I не берем кредит на этот патч, вы можете найти его here.

+0

Спасибо! Я пробовал эти настройки, и ось Z лучше, она почти вертикальная. Я обновил вопрос с новой цифрой. Любой способ сделать его совершенно вертикальным, как в фигуре Матлаба? Кроме того, я не могу использовать этот азим для этих данных :-) –

+0

@Ashwin см. Мое редактирование. Я нашел фрагмент кода, чтобы перейти к орфографической проекции [здесь] (https://github.com/matplotlib/matplotlib/issues/537), но я не знаком с matplotlib, поэтому я не знаю, как вы можете использовать это когда вы нарисовали свой поверхностный сюжет. – Bentoy13

+0

Bentoy13: Это сработало! Можете ли вы передать этот фрагмент кода в качестве ответа, чтобы я мог его принять? :-) –

Смежные вопросы