はじめに#
ここでは,PyVistaの背景や歴史について簡単に説明します.
Tip
このチュートリアルのセクションは,PyVista ドキュメントの Getting Started の章から採用されています.
PyVistaは VTK - The Visualization Toolkit の上に構築された多くの視覚化ライブラリの一つです.PyVistaの主な目的は,VTKの上の抽象化レイヤとして,VTKの便利さと機能を "Python的に" 提供することです.
沿革#
PyVistaは,VTKの低レベルの機能を "包む" 再利用可能な高位の抽象化レイヤーを作りたいという思いから生まれました.
元々は2016年に @akaszynski によって femorph のサブライブラリとして作成されました.
2017年に akaszynski/vtki としてGitHubに最初に投稿されました.
@banesullivan が2018年にプロジェクトに参加し,機能,特徴の拡張,例を用いたドキュメントの改善を行っています.
2019年, PyVista をPyPIで初公開.
2024年10月現在,GitHubに150人以上のコントリビューターと ~2.4k Stars がいます.
GitHubにある他の libraries, examples, and repositories で少なくとも2.8k以上使用されています.
プロジェクト内のプレゼンスを大きく向上させ,継続的なサポートを実現しました
PyVistaエコシステムが大幅に拡張されました
PyVistaの開発者についてもっと知るには, contributors page とアクティブな list of authors ご覧ください.
Contrib rocks で作られました.
PyVistaは誰のためのものですか?#
Pythonを使って3Dデータを可視化したい人.
PyVistaの活用事例をご紹介します.
PyVistaで実現したこと,これから実現したいことを自由に書いてください.
簡単な例#
サーフェスメッシュの読み込みとプロット#
VTKは強力です,本当に強力です!VTKでは何でもできるのですが,PyVistaはそれをより簡単にするために, numpy
や Matplotlib
風の構文を使っています.例えば,単純なサーフェスメッシュをプロットすることができればいいのです.
サーフェスデータセットの読み込みとプロット
|
PyVistaの使用 |
---|---|
import vtk
reader = vtk.vtkSTLReader()
reader.SetFileName("bunny.stl")
mapper = vtk.vtkPolyDataMapper()
output_port = reader.GetOutputPort()
mapper.SetInputConnection(output_port)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
ren.AddActor(actor)
iren.Initialize()
renWin.Render()
iren.Start()
del iren, renWin
|
from pyvista import examples
mesh = examples.download_bunny()
mesh.plot(cpos='xy')
|
色を使った簡単な点群の構築#
これらの例は,PyVistaとVTKの両方を使用して, numpy
を使った点群の構築と可視化を行う方法を示しています.ここでは,NumPyの配列を直接操作することがいかに簡単であるかを示しています.
この例は,この SO Answer から引用したものです.
import vtk
from numpy import random
class VtkPointCloud:
def __init__(self, zMin=-10.0, zMax=10.0, maxNumPoints=1e6):
self.maxNumPoints = maxNumPoints
self.vtkPolyData = vtk.vtkPolyData()
self.clearPoints()
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputData(self.vtkPolyData)
mapper.SetColorModeToDefault()
mapper.SetScalarRange(zMin, zMax)
mapper.SetScalarVisibility(1)
self.vtkActor = vtk.vtkActor()
self.vtkActor.SetMapper(mapper)
def addPoint(self, point):
if self.vtkPoints.GetNumberOfPoints() < self.maxNumPoints:
pointId = self.vtkPoints.InsertNextPoint(point[:])
self.vtkDepth.InsertNextValue(point[2])
self.vtkCells.InsertNextCell(1)
self.vtkCells.InsertCellPoint(pointId)
else:
r = random.randint(0, self.maxNumPoints)
self.vtkPoints.SetPoint(r, point[:])
self.vtkCells.Modified()
self.vtkPoints.Modified()
self.vtkDepth.Modified()
def clearPoints(self):
self.vtkPoints = vtk.vtkPoints()
self.vtkCells = vtk.vtkCellArray()
self.vtkDepth = vtk.vtkDoubleArray()
self.vtkDepth.SetName('DepthArray')
self.vtkPolyData.SetPoints(self.vtkPoints)
self.vtkPolyData.SetVerts(self.vtkCells)
self.vtkPolyData.GetPointData().SetScalars(self.vtkDepth)
self.vtkPolyData.GetPointData().SetActiveScalars('DepthArray')
pointCloud = VtkPointCloud()
for k in range(1000):
point = 20*(random.rand(3)-0.5)
pointCloud.addPoint(point)
pointCloud.addPoint([0,0,0])
pointCloud.addPoint([0,0,0])
pointCloud.addPoint([0,0,0])
pointCloud.addPoint([0,0,0])
# Renderer
renderer = vtk.vtkRenderer()
renderer.AddActor(pointCloud.vtkActor)
renderer.SetBackground(.2, .3, .4)
renderer.ResetCamera()
# Render Window
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
# Interactor
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
# Begin Interaction
renderWindow.Render()
renderWindowInteractor.Start()
import pyvista as pv
import numpy as np
points = np.random.random((1000, 3))
pc = pv.PolyData(points)
pc.plot(scalars=points[:, 2], point_size=5.0, cmap='jet')
他のライブラリとの比較#
データビジュアライゼーションに興味があるのであれば,ぜひいろいろなライブラリを試してみてください.
そのいくつかをご紹介します.
Visualization Toolkit (VTK) は,科学的データを操作・表示するためのオープンソースソフトウェアです.3Dレンダリングのための最先端のツール,3Dインタラクションのためのウィジェット群,そして広範な2Dプロット機能が付属しています.
ParaView は,オープンソースのマルチプラットフォーム・データ分析・可視化アプリケーションです.ParaViewのユーザーは,定性的および定量的な手法を使ってデータを分析するための可視化を迅速に構築することができます.データの探索は,3Dでインタラクティブに行うことも,ParaViewのバッチ処理機能を使ってプログラムで行うこともできます.
vedo は,VTKとnumpyをベースにした,3Dオブジェクトや点群の科学的解析のためのPythonライブラリです.
Mayavi は,2次元および3次元の科学的データを可視化するための汎用クロスプラットフォームツールです.
演習#
はじめに にアクセスして,PyVistaをインストールします.
PyVistaをインストールしたら,以下のサンプルを開いて,PyVistaの "Hello World "を実行できるかどうか試してみてください.ページの一番下までスクロールして, *.py
(スクリプト) または *.ipynb
(ノートブック) ファイル形式のいずれかをクリックすると,サンプルをダウンロードすることができます.