1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
|
"""PyVista's famous ``plot()`` helper method.
This method is placed at the top-level to allow us to easily bind
the method to all of the core datatypes before importing the
``pyvista.plotting`` module and libGL dependent VTK modules.
This is necessary for future versions of PyVista that will fully
decouple the ``core`` and ``plotting`` APIs.
"""
from __future__ import annotations
from pathlib import Path
import numpy as np
import pyvista
from pyvista._deprecate_positional_args import _deprecate_positional_args
@_deprecate_positional_args(allowed=['var_item'])
def plot( # noqa: PLR0917
var_item,
off_screen=None,
full_screen=None,
screenshot=None,
interactive=True, # noqa: FBT002
cpos=None,
window_size=None,
show_bounds=False, # noqa: FBT002
show_axes=None,
notebook=None,
background=None,
text='',
return_img=False, # noqa: FBT002
eye_dome_lighting=False, # noqa: FBT002
volume=False, # noqa: FBT002
parallel_projection=False, # noqa: FBT002
jupyter_backend=None,
return_viewer=False, # noqa: FBT002
return_cpos=False, # noqa: FBT002
jupyter_kwargs=None,
theme=None,
anti_aliasing=None,
zoom=None,
border=False, # noqa: FBT002
border_color='k',
border_width=2.0,
ssao=False, # noqa: FBT002
**kwargs,
):
"""Plot a PyVista, numpy, or vtk object.
Parameters
----------
var_item : pyvista.DataSet
See :func:`Plotter.add_mesh <pyvista.Plotter.add_mesh>` for all
supported types.
off_screen : bool, optional
Plots off screen when ``True``. Helpful for saving
screenshots without a window popping up. Defaults to the
global setting ``pyvista.OFF_SCREEN``.
full_screen : bool, default: :attr:`pyvista.plotting.themes.Theme.full_screen`
Opens window in full screen. When enabled, ignores
``window_size``.
screenshot : str or bool, optional
Saves screenshot to file when enabled. See:
:func:`Plotter.screenshot() <pyvista.Plotter.screenshot>`.
Default ``False``.
When ``True``, takes screenshot and returns ``numpy`` array of
image.
interactive : bool, default: :attr:`pyvista.plotting.themes.Theme.interactive`
Allows user to pan and move figure.
cpos : list, optional
List of camera position, focal point, and view up.
window_size : sequence, default: :attr:`pyvista.plotting.themes.Theme.window_size`
Window size in pixels.
show_bounds : bool, default: False
Shows mesh bounds when ``True``.
show_axes : bool, default: :attr:`pyvista.plotting.themes._AxesConfig.show`
Shows a vtk axes widget.
notebook : bool, default: :attr:`pyvista.plotting.themes.Theme.notebook`
When ``True``, the resulting plot is placed inline a jupyter
notebook. Assumes a jupyter console is active.
background : ColorLike, default: :attr:`pyvista.plotting.themes.Theme.background`
Color of the background.
text : str, optional
Adds text at the bottom of the plot.
return_img : bool, default: False
Returns numpy array of the last image rendered.
eye_dome_lighting : bool, optional
Enables eye dome lighting.
volume : bool, default: False
Use the :func:`Plotter.add_volume()
<pyvista.Plotter.add_volume>` method for volume rendering.
parallel_projection : bool, default: False
Enable parallel projection.
jupyter_backend : str, default: :attr:`pyvista.plotting.themes.Theme.jupyter_backend`
Jupyter notebook plotting backend to use. One of the
following:
* ``'none'`` : Do not display in the notebook.
* ``'static'`` : Display a static figure.
* ``'trame'`` : Display using ``trame``.
This can also be set globally with
:func:`pyvista.set_jupyter_backend`.
return_viewer : bool, default: False
Return the jupyterlab viewer, scene, or display object
when plotting with jupyter notebook.
return_cpos : bool, default: False
Return the last camera position from the render window
when enabled. Defaults to value in theme settings.
jupyter_kwargs : dict, optional
Keyword arguments for the Jupyter notebook plotting backend.
See :ref:`customize_trame_toolbar_example` for an example
using this keyword.
theme : pyvista.plotting.themes.Theme, optional
Plot-specific theme.
anti_aliasing : str | bool, default: :attr:`pyvista.plotting.themes.Theme.anti_aliasing`
Enable or disable anti-aliasing. If ``True``, uses ``"msaa"``. If False,
disables anti_aliasing. If a string, should be either ``"fxaa"`` or
``"ssaa"``.
zoom : float, str, optional
Camera zoom. Either ``'tight'`` or a float. A value greater than 1
is a zoom-in, a value less than 1 is a zoom-out. Must be greater
than 0.
border : bool, default: False
Draw a border around each render window.
border_color : ColorLike, default: "k"
Either a string, rgb list, or hex color string. For example:
* ``color='white'``
* ``color='w'``
* ``color=[1.0, 1.0, 1.0]``
* ``color='#FFFFFF'``
border_width : float, default: 2.0
Width of the border in pixels when enabled.
ssao : bool, optional
Enable surface space ambient occlusion (SSAO). See
:func:`Plotter.enable_ssao` for more details.
**kwargs : dict, optional
See :func:`pyvista.Plotter.add_mesh` for additional options.
Returns
-------
cpos : list
List of camera position, focal point, and view up.
Returned only when ``return_cpos=True`` or set in the
default global or plot theme. Not returned when in a
jupyter notebook and ``return_viewer=True``.
image : np.ndarray
Numpy array of the last image when either ``return_img=True``
or ``screenshot=True`` is set. Not returned when in a
jupyter notebook with ``return_viewer=True``. Optionally
contains alpha values. Sized:
* [Window height x Window width x 3] if the theme sets
``transparent_background=False``.
* [Window height x Window width x 4] if the theme sets
``transparent_background=True``.
widget : ipywidgets.Widget
IPython widget when ``return_viewer=True``.
Examples
--------
Plot a simple sphere while showing its edges.
>>> import pyvista as pv
>>> mesh = pv.Sphere()
>>> mesh.plot(show_edges=True)
Plot a volume mesh. Color by distance from the center of the
ImageData. Note ``volume=True`` is passed.
>>> import numpy as np
>>> grid = pv.ImageData(dimensions=(32, 32, 32), spacing=(0.5, 0.5, 0.5))
>>> grid['data'] = np.linalg.norm(grid.center - grid.points, axis=1)
>>> grid['data'] = np.abs(grid['data'] - grid['data'].max()) ** 3
>>> grid.plot(volume=True)
"""
if jupyter_kwargs is None:
jupyter_kwargs = {}
# undocumented kwarg used within pytest to run a function before closing
before_close_callback = kwargs.pop('before_close_callback', None)
# pop from kwargs here to avoid including them in add_mesh or add_volume
eye_dome_lighting = kwargs.pop('edl', eye_dome_lighting)
show_grid = kwargs.pop('show_grid', False)
auto_close = kwargs.get('auto_close')
pl = pyvista.Plotter(
window_size=window_size,
off_screen=off_screen,
notebook=notebook,
theme=theme,
border=border,
border_color=border_color,
border_width=border_width,
)
if show_axes is None:
show_axes = pl.theme.axes.show
if show_axes:
if pl.theme.axes.box:
pl.add_box_axes()
else:
pl.add_axes()
if anti_aliasing:
if anti_aliasing is True:
pl.enable_anti_aliasing('msaa', multi_samples=pyvista.global_theme.multi_samples)
else:
pl.enable_anti_aliasing(anti_aliasing)
elif anti_aliasing is False:
pl.disable_anti_aliasing()
try:
pl.set_background(background)
except (ValueError, TypeError):
if isinstance(background, (str, Path)):
path = Path(background)
if path.is_file():
pl.add_background_image(path)
else:
msg = f'Background must be color-like or a file path. Got {background} instead.'
raise TypeError(msg)
if isinstance(var_item, list):
if len(var_item) == 2: # might be arrows
isarr_0 = isinstance(var_item[0], np.ndarray)
isarr_1 = isinstance(var_item[1], np.ndarray)
if isarr_0 and isarr_1:
pl.add_arrows(var_item[0], var_item[1])
else:
for item in var_item:
if volume or (isinstance(item, np.ndarray) and item.ndim == 3):
pl.add_volume(item, **kwargs)
else:
pl.add_mesh(item, **kwargs)
else:
for item in var_item:
if volume or (isinstance(item, np.ndarray) and item.ndim == 3):
pl.add_volume(item, **kwargs)
else:
pl.add_mesh(item, **kwargs)
elif volume or (isinstance(var_item, np.ndarray) and var_item.ndim == 3):
pl.add_volume(var_item, **kwargs)
elif isinstance(var_item, pyvista.MultiBlock):
pl.add_composite(var_item, **kwargs)
else:
pl.add_mesh(var_item, **kwargs)
if text:
pl.add_text(text)
if show_grid:
pl.show_grid()
elif show_bounds:
pl.show_bounds()
if cpos is None:
cpos = pl.get_default_cam_pos()
pl.camera_position = cpos
pl.camera_set = False
else:
pl.camera_position = cpos
if eye_dome_lighting:
pl.enable_eye_dome_lighting()
if parallel_projection:
pl.enable_parallel_projection()
if ssao:
pl.enable_ssao()
if zoom is not None:
pl.camera.zoom(zoom)
return pl.show(
auto_close=auto_close,
interactive=interactive,
full_screen=full_screen,
screenshot=screenshot,
return_img=return_img,
jupyter_backend=jupyter_backend,
before_close_callback=before_close_callback,
jupyter_kwargs=jupyter_kwargs,
return_viewer=return_viewer,
return_cpos=return_cpos,
)
|