Python 3.6, Anaconda (Python 3.x), Spyderの環境下で、3D描画に特化したライブラリMayaviを導入する方法。
Mayaviは旧バージョンであるPyQt4を要求し、これと整合性を保つため(?)にもPython2.7の仮想環境を構築するのが手っ取り早いようです。
conda create -n py27mayavi python=2.7 pyqt=4 mayavi vtk spyder
ここではmayaviに必要な最低限のライブラリのみ記載しています。その他、必要なライブラリも適宜追加してください。
##仮想環境構築に際するチャンネルの問題
その後Mayavi用のSpyderが起動しないトラブルに見舞われましたが、チャンネルをconda-forgeからAnacondaに変更することで何故か解決しました。以下に成功した仮想環境設定を書いておきます。
conda create -n maya27 python=2.7 anaconda spyder mayavi pyqt=4 qt=4 vtk=6 matplotlib=1 --override-channels --channel anaconda
最後の-override-channels --channel anaconda
がミソのようです[1]。
matplotlibのver=1はPyQtとの整合性を保つため(多分)、vtkのverは指定しなくていいかも。
この仮想環境にライブラリを追加するときも-override-channels --channel anaconda
を忘れずに(もはや優先チャンネルをconda-forgeからAnacondaに設定し直したほうが早いかも。。)。
また、基本的に「動けばいいや」というスタンスなので原因については調べておりません。どうぞご容赦ください。。
【ここまで追記 (2018.07.18)】
##軸の表示に関するトラブルの解決
軸の目盛りを設定しようとすると何故かエラーが発生、カーネルがお亡くなりになられます。これはどうもmayaviのver4.5.0以降のバグのようです[2]。解決策は以下の通り。
Step 1
"(Anacondaフォルダパス)/envs/(仮想環境名)/Lib/site-packages/mayavi" に移動
Step 2
"modules" フォルダ内 "axes.py" の173行目
self.configure_input_data(self.axes, src.outputs[0])
を
data = src.outputs[0] if not hasattr(src.outputs[0], 'output') else src.outputs[0].output
self.configure_input_data(self.axes, data)
へと変更。
Step 3
"tools" フォルダ内 "decorations.py" の372行目
axes.axes.ranges = axes.module_manager.source.outputs[0].bounds
を
src = axes.module_manager.source
data = src.outputs[0] if not hasattr(src.outputs[0], 'output') else src.outputs[0].output
axes.axes.ranges = data.bounds
へと変更。
ただ参考サイト[2]の最後のほうを訳しただけですが・・。当方の環境ではこのやり方で解決し、今のところ順調に動いております。設定はなかなか面倒ですが、やはりMayaviで描く3Dプロットは美しいですね。
【ここまで追記2 (2018.07.18)】
##【参考にしたサイト】
[1] https://conda.io/docs/commands/conda-create.html
[2] https://github.com/enthought/mayavi/issues/474