点群のプロット#

この例では,PyVistaを使って 'points''points_gaussian' の両方のスタイルを使い,点群のプロットを行う方法を紹介します.

import numpy as np

import pyvista as pv
from pyvista import examples

プロット方法の比較#

まず,サンプル点群を numpy.random.random() を使って作ってみましょう.

rng = np.random.default_rng()
points = rng.random((1000, 3))
points
array([[0.45377525, 0.01775554, 0.22869735],
       [0.10523968, 0.01461884, 0.67736007],
       [0.88950476, 0.76873665, 0.75596669],
       ...,
       [0.5647613 , 0.4255551 , 0.41130294],
       [0.77749602, 0.58222036, 0.25276406],
       [0.51919222, 0.81718494, 0.22537   ]])

基本プロット#

この点群は,便利な pyvista.plot() 関数を使って簡単にプロットすることができます.

pv.plot(points)
point clouds

スカラーを使ったプロット#

それではつまらないので,色をつけてみましょう.点をプロットするには,単一のスカラーを使うこともできます.例えば,z座標.

また,楽しみに,点を球体でレンダリングしてみましょう.

pv.plot(
    points,
    scalars=points[:, 2],
    render_points_as_spheres=True,
    point_size=20,
    show_scalar_bar=False,
)
point clouds

RGBAを使ったプロット#

また,RGBA配列を使用して点群に色を付けることもできます.これは (0, 1) で正規化されていますが,0-255 の numpy.uint8 配列を使用することも可能です.

rgba = points - points.min(axis=0)
rgba /= rgba.max(axis=0)
pv.plot(points, scalars=rgba, render_points_as_spheres=True, point_size=20, cpos='xy', rgba=True)
point clouds

点群プロットスタイル#

PyVista は 'points_gaussian' スタイルをサポートしており,点を個々のソフトスプライトとしてレンダリングします.また, render_points_as_spheres=True (デフォルト) を使用すると,レンダリングパフォーマンスを犠牲にして,よりソフトな点を作成することが可能になります.

再び基本的なプロットを示しますが,スタイルは 'points_gaussian' にしてあります.

pv.plot(points, style='points_gaussian', opacity=0.5, point_size=15)
point clouds

ここに,4つのオプションの組み合わせを並べたプロッタを示しますので,これらの点をプロットするときに利用できるさまざまなオプションを自分で確認することができます.PyVista は賢明なデフォルトを実現しようとしていますが,もしこれがあなたのニーズにとって不十分だと感じたら,遠慮なくいろいろなオプションで遊んで,あなたに合うものを見つけてください.

pl = pv.Plotter(shape=(2, 2))

# Standard points
actor = pl.add_points(
    points,
    style='points',
    emissive=False,
    scalars=rgba,
    rgba=True,
    point_size=10,
    ambient=0.7,
)
pl.add_text('"points" not as spheres', color='w')

# Gaussian points
pl.subplot(0, 1)
actor = pl.add_points(
    points,
    render_points_as_spheres=False,
    style='points_gaussian',
    emissive=False,
    scalars=rgba,
    rgba=True,
    opacity=0.99,
    point_size=10,
    ambient=1.0,
)
pl.add_text('"points_gaussian" not as spheres\nemissive=False', color='w')

# Gaussian points with emissive=True
pl.subplot(1, 0)
actor = pl.add_points(
    points,
    render_points_as_spheres=False,
    style='points_gaussian',
    emissive=True,
    scalars=rgba,
    rgba=True,
    point_size=10,
)
pl.add_text('"points_gaussian" not as spheres\nemissive=True', color='w')

# With render_points_as_spheres=True
pl.subplot(1, 1)
actor = pl.add_points(
    points,
    style='points_gaussian',
    render_points_as_spheres=True,
    scalars=rgba,
    rgba=True,
    point_size=10,
)
pl.add_text('"points_gaussian" as spheres', color='w')

pl.background_color = 'k'
pl.link_views()
pl.camera_position = 'xy'
pl.camera.zoom(1.2)
pl.show()
point clouds

点群の軌道#

点群の周囲を周回するプロットを生成します.点群の中心からの距離に応じて色付けします.

cloud = examples.download_cloud_dark_matter()
scalars = np.linalg.norm(cloud.points - cloud.center, axis=1)

pl = pv.Plotter(off_screen=True)
pl.add_mesh(
    cloud,
    style='points_gaussian',
    color='#fff7c2',
    scalars=scalars,
    opacity=0.25,
    point_size=4.0,
    show_scalar_bar=False,
)
pl.background_color = 'k'
pl.show(auto_close=False)
path = pl.generate_orbital_path(n_points=36, shift=cloud.length, factor=3.0)
pl.open_gif("orbit_cloud.gif")
pl.orbit_on_path(path, write_frames=True)
pl.close()
point clouds

Total running time of the script: (0 minutes 11.697 seconds)

Sphinx-Galleryによるギャラリー