Mayavi: cenas no notebook Jupyter são intercaladas

Criado em 26 out. 2016  ·  10Comentários  ·  Fonte: enthought/mayavi

Quando eu ploto uma cena após a outra no meu notebook jupyter com backend x3d - isso acontece:
screen shot 2016-10-26 at 14 29 14

O que devo fazer para evitar isso? (Eu suponho que você veja a malha de Out[2] no centro da malha em Out[8])

PS Pode ser importante - estou executando meu servidor de notebook jupyter na máquina remota no VirtualGL.

Comentários muito úteis

Olá a todos,

desculpe por adicionar coisas a esta questão encerrada, mas achei que esta seria uma boa oportunidade para dar algum feedback ao projeto.
Acabei de testar a integração do notebook jupyter usando x3d e consegui que funcionasse depois de alguns contratempos.
E eu senti o mesmo que @ thoth291 : eu esperava que mayavi criasse uma nova figura para uma nova célula implicitamente. Acho que esperava isso porque esse é o padrão para matplotlib usando o back-end embutido %matplotlib.
No entanto, você também pode argumentar pelo caso oposto: ao usar o backend do notebook %matplotlib, é preciso criar figuras explicitamente (se não, a ação de desenho é executada com a figura aberta anteriormente, o que às vezes produz resultados surpreendentes para o usuário).

Então, para recapitular: diferentes back-ends do matplotlib se comportam de maneira diferente em relação à criação de novas figuras. Do ponto de vista do usuário, seria mais fácil se as figuras estivessem vinculadas às células. No entanto, se alguém seguir a sugestão do notebook %matplotlib, poderá seguir este fluxo de trabalho:

fig = mlab.figure() # create new figure
s = mlab.test_triangular_mesh() # draw something on it
fig # display figure

Isso realmente funciona, então talvez valha a pena reformatar o notebook de exemplo com essa maneira de trabalhar, bem como a seção de dicas e truques que documenta os notebooks jupyter (http://docs.enthought.com/mayavi/mayavi/tips. html).

De qualquer forma, gostaria de acrescentar que acho ótimo que esse back-end exista. Obrigado pelo trabalho duro @prabhuramachandran @GaelVaroquaux !

Atenciosamente,
Florian

Todos 10 comentários

você tentou criar uma nova figura na nova célula?

Eu fiz isso mlab.clf() no meio e ajudou - não há mais intercalação.
Obrigado @GaelVaroquaux !

É um bug ou é um recurso? Então, devo limpar a figura em todos os meus scripts agora?

@thoth291 -- Isso é o mesmo que você veria sem o notebook. mlab não limpará a tela automaticamente e você deve fazer isso sozinho. BTW, estou curioso sobre sua configuração com o VirtualGL. Qual hardware você está usando e como você configurou o VirtualGL em uma máquina remota? Isso também seria útil para outras pessoas e talvez possamos adicioná-lo à nossa documentação se você puder compartilhar os detalhes.

Estou fechando este problema por enquanto, pois isso não é um problema, mas como o mlab funciona.

Infelizmente não fui eu que fiz a configuração.
Tudo o que posso dizer é que estamos usando máquinas HPC Intel com 60 núcleos, muita RAM e boa GPU a bordo. Temos vários servidores vnc em execução lá. Nós usamos o tigervnc e quando iniciamos um servidor nós o configuramos com o backend VirtualGL. Enquanto você estiver no cliente vnc - você precisa usar um script personalizado para executar seus aplicativos para interceptar o OpenGL e substituí-lo pelo VirtualGL. No meu caso, esse script chamou vnc3d e eu o executo assim:

vnc3d jupyter notebook

Esta configuração funciona perfeitamente para nós e a única coisa que é irritante é que você precisa se lembrar de anexar este script vnc3d ao seu comando toda vez que lidar com OpenGL ...

@prabhuramachandran , acho que isso é contra intuitivo para usuários do Jupyter. Ou pelo menos deve ser documentado explicitamente que é necessário fazer isso ( mlab.clf() ) para garantir a renderização correta. Nenhum dos motores 3D (para Jupyter) estou ciente de ter esse tipo de problema.

@prabhuramachandran , acho que isso é contra intuitivo para usuários do Jupyter.

Eu tenho o mesmo sentimento.

@thoth291 -- obrigado pelas informações sobre a configuração do VirtualGL. Isso parece muito interessante e útil. No que diz respeito ao mlab.clf() , fico feliz em documentar isso, embora não tenha certeza de que seja um comportamento confuso. Isso é muito semelhante ao uso de comandos mlab e, em seguida, ao uso mlab.savefig . Você teria o mesmo efeito. Talvez o que seja confuso é que isso é atípico do ponto de vista do uso do notebook, onde os usuários fazem plt.plot() em uma célula e não precisam clf() antes da próxima célula. O que posso fazer é chamar automaticamente mlab.clf() após a cena ser convertida em uma célula de saída PNG ou X3D? Isso ajudaria?

Sim, essa é a parte confusa. Pode valer a pena colocar um novo argumento para a chamada init_notebook quando o usuário pode definir o que fazer. Posso imaginar que muitos usuários de mlab ficariam bem com figuras intercaladas (para que possam construir gradualmente uma cena) - mas o comportamento padrão deve ser ter figuras independentes para cada célula.

Olá a todos,

desculpe por adicionar coisas a esta questão encerrada, mas achei que esta seria uma boa oportunidade para dar algum feedback ao projeto.
Acabei de testar a integração do notebook jupyter usando x3d e consegui que funcionasse depois de alguns contratempos.
E eu senti o mesmo que @ thoth291 : eu esperava que mayavi criasse uma nova figura para uma nova célula implicitamente. Acho que esperava isso porque esse é o padrão para matplotlib usando o back-end embutido %matplotlib.
No entanto, você também pode argumentar pelo caso oposto: ao usar o backend do notebook %matplotlib, é preciso criar figuras explicitamente (se não, a ação de desenho é executada com a figura aberta anteriormente, o que às vezes produz resultados surpreendentes para o usuário).

Então, para recapitular: diferentes back-ends do matplotlib se comportam de maneira diferente em relação à criação de novas figuras. Do ponto de vista do usuário, seria mais fácil se as figuras estivessem vinculadas às células. No entanto, se alguém seguir a sugestão do notebook %matplotlib, poderá seguir este fluxo de trabalho:

fig = mlab.figure() # create new figure
s = mlab.test_triangular_mesh() # draw something on it
fig # display figure

Isso realmente funciona, então talvez valha a pena reformatar o notebook de exemplo com essa maneira de trabalhar, bem como a seção de dicas e truques que documenta os notebooks jupyter (http://docs.enthought.com/mayavi/mayavi/tips. html).

De qualquer forma, gostaria de acrescentar que acho ótimo que esse back-end exista. Obrigado pelo trabalho duro @prabhuramachandran @GaelVaroquaux !

Atenciosamente,
Florian

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

rambalachandran picture rambalachandran  ·  9Comentários

indranilsinharoy picture indranilsinharoy  ·  9Comentários

scottstanie picture scottstanie  ·  4Comentários

kitchoi picture kitchoi  ·  10Comentários

Kekushke picture Kekushke  ·  9Comentários