Source code for gempy_viewer.API._plot_3d_API

import matplotlib.pyplot as plt
import numpy as np

from gempy.core.data import GeoModel
from gempy_viewer.core.data_to_show import DataToShow
from gempy_viewer.core.scalar_data_type import ScalarDataType, TopographyDataType
from gempy_viewer.modules.plot_2d.plot_2d_utils import get_geo_model_cmap
from gempy_viewer.modules.plot_3d.vista import GemPyToVista

try:
    import pyvista as pv
    from gempy_viewer.modules.plot_3d._vista import Vista as Vista

    PYVISTA_IMPORT = True
except ImportError:
    PYVISTA_IMPORT = False

try:
    import mplstereonet

    mplstereonet_import = True
except ImportError:
    mplstereonet_import = False


[docs] def plot_3d( model: GeoModel, plotter_type='basic', active_scalar_field: str = None, ve=None, topography_scalar_type: TopographyDataType = TopographyDataType.GEOMAP, kwargs_pyvista_bounds=None, kwargs_plot_structured_grid=None, kwargs_plot_topography=None, kwargs_plot_data=None, kwargs_plotter=None, kwargs_plot_surfaces=None, image=False, show=True, **kwargs ) -> GemPyToVista: """Plot 3-D geomodel.""" from gempy_viewer.modules.plot_3d.drawer_input_3d import plot_data from gempy_viewer.modules.plot_3d.drawer_structured_grid_3d import plot_structured_grid from gempy_viewer.modules.plot_3d.drawer_surfaces_3d import plot_surfaces from gempy_viewer.modules.plot_3d.drawer_topography_3d import plot_topography_3d from gempy_viewer.modules.plot_3d.plot_3d_utils import set_scalar_bar # * Grab from kwargs all the show arguments and create the proper class. This is for backwards compatibility can_show_results = model.solutions is not None # and model.solutions.lith_block.shape[0] != 0 data_to_show = DataToShow( n_axis=1, show_data=kwargs.get('show_data', True), _show_results=kwargs.get('show_results', can_show_results), show_surfaces=kwargs.get('show_surfaces', True), show_lith=kwargs.get('show_lith', True), show_scalar=kwargs.get('show_scalar', False), show_boundaries=kwargs.get('show_boundaries', True), show_topography=kwargs.get('show_topography', True), show_section_traces=kwargs.get('show_section_traces', True), show_values=kwargs.get('show_values', False), show_block=kwargs.get('show_block', False) ) kwargs_plot_topography = kwargs_plot_topography or {} kwargs_plot_structured_grid = kwargs_plot_structured_grid or {} kwargs_plot_data = kwargs_plot_data or {} kwargs_plotter = kwargs_plotter or {} kwargs_plot_surfaces = kwargs_plot_surfaces or {} kwargs_pyvista_bounds = kwargs_pyvista_bounds or {} if image is True: show = True kwargs_plotter['off_screen'] = True plotter_type = 'basic' if model.solutions is None: data_to_show.show_results = False solutions_raw_arrays = None else: solutions_raw_arrays = model.solutions.raw_arrays extent: np.ndarray = model.grid.regular_grid.extent gempy_vista = GemPyToVista( extent=extent, plotter_type=plotter_type, pyvista_bounds_kwargs=kwargs_pyvista_bounds, **kwargs_plotter ) if data_to_show.show_topography[0] is True and model.grid.topography is not None: plot_topography_3d( gempy_vista=gempy_vista, topography=model.grid.topography, solution=solutions_raw_arrays, topography_scalar_type=topography_scalar_type, elements_colors=model.structural_frame.elements_colors[::-1], contours=kwargs_plot_topography.get('contours', True), **kwargs_plot_topography ) if data_to_show.show_boundaries[0] is True and len(solutions_raw_arrays.vertices) != 0: plot_surfaces( gempy_vista=gempy_vista, structural_elements_with_solution=model.structural_frame.structural_elements, **kwargs_plot_surfaces ) if data_to_show.show_data[0] is True: arrow_size = kwargs_plot_data.get('arrow_size', 10) min_axes = np.min(np.diff(extent)[[0, 2, 4]]) plot_data( gempy_vista=gempy_vista, model=model, arrows_factor=arrow_size / (100 / min_axes), **kwargs_plot_data ) if data_to_show.show_lith[0] is True: plot_structured_grid( gempy_vista=gempy_vista, regular_grid=model.grid.regular_grid, scalar_data_type=ScalarDataType.LITHOLOGY, active_scalar_field="lith", solution=solutions_raw_arrays, cmap=get_geo_model_cmap(model.structural_frame.elements_colors_volumes), **kwargs_plot_structured_grid ) if data_to_show.show_scalar[0] is True: plot_structured_grid( gempy_vista=gempy_vista, regular_grid=model.grid.regular_grid, scalar_data_type=ScalarDataType.SCALAR_FIELD, active_scalar_field=active_scalar_field, solution=solutions_raw_arrays, cmap='viridis', **kwargs_plot_structured_grid ) if True: set_scalar_bar( gempy_vista=gempy_vista, elements_names = model.structural_frame.elements_names, surfaces_ids=model.structural_frame.elements_ids - 1 ) if ve is not None: gempy_vista.p.set_scale(zscale=ve) fig_path: str = kwargs.get('fig_path', None) if fig_path is not None: gempy_vista.p.show(screenshot=fig_path) if image is True: gempy_vista.p.show(screenshot=True) img = gempy_vista.p.last_image plt.imshow(img) plt.axis('off') plt.show(block=False) gempy_vista.p.close() show= False if show is True: gempy_vista.p.show() return gempy_vista