pydrex.axes
PyDRex: Custom Matplotlib Axes subclasses.
1"""> PyDRex: Custom Matplotlib Axes subclasses.""" 2 3import matplotlib as mpl 4import matplotlib.axes as mplax 5import numpy as np 6from matplotlib.projections import register_projection 7 8from pydrex import geometry as _geo 9from pydrex import stats as _stats 10 11 12class PoleFigureAxes(mplax.Axes): 13 """Axes class designed for crystallographic pole figures. 14 15 Thin `matplotlib.axes.Axes` wrapper for crystallographic pole figures. 16 17 .. note:: 18 Projections are not performed automatically using default methods like 19 `scatter` or `plot`. To actually plot the pole figures, use `polefigure`. 20 21 """ 22 23 name = "pydrex.polefigure" 24 25 def _prep_polefig_axis(self, ref_axes="xz"): 26 """Set various options of a matplotlib `Axes` to prepare for a pole figure. 27 28 Use a two-letter string for `ref_axes`. 29 These letters will be used for the horizontal and vertical labels, respectively. 30 31 """ 32 self.set_axis_off() 33 self.set_aspect("equal") 34 _circle_points = np.linspace(0, np.pi * 2, 100) 35 self.plot( 36 np.cos(_circle_points), 37 np.sin(_circle_points), 38 linewidth=0.25, 39 color=mpl.rcParams["axes.edgecolor"], 40 ) 41 self.axhline(0, color=mpl.rcParams["grid.color"], alpha=0.5) 42 self.text( 43 1.0, 44 0.4, 45 ref_axes[0], 46 verticalalignment="center", 47 transform=self.transAxes, 48 fontsize="x-small", 49 ) 50 self.axvline(0, color=mpl.rcParams["grid.color"], alpha=0.5) 51 52 self.text( 53 0.6, 54 1.0, 55 ref_axes[1], 56 horizontalalignment="center", 57 transform=self.transAxes, 58 fontsize="x-small", 59 ) 60 61 def polefigure( 62 self, 63 data: np.ndarray, 64 density: bool = False, 65 ref_axes: str = "xz", 66 hkl=[1, 0, 0], 67 density_kwargs: dict | None = None, 68 **kwargs, 69 ): 70 """Plot pole figure of crystallographic texture. 71 72 - `data` — Nx3x3 array of orientation matrices 73 - `density` (optional) — plot contoured pole figures, False by default 74 - `ref_axes` (optional) — letters specifying the horizontal and vertical axes of 75 the pole figure, and respective labels 76 - `hkl` (optional) — crystallographic axis (one of the slip directions of 77 the mineral phase, e.g. [1, 0, 0], [0, 1, 0] or [0, 0, 1]) 78 - `density_kwargs` (optional) — keyword arguments to pass to 79 `pydrex.stats.point_density` if `density=True` 80 81 Any additional keyword arguments are passed to either `tripcolor` if 82 `density=True` or `scatter` if `density=False`. 83 84 """ 85 if density_kwargs is None: 86 density_kwargs = {} 87 88 self._prep_polefig_axis(ref_axes=ref_axes) 89 90 if density: 91 x, y, z = _stats.point_density( 92 *_geo.poles(data, hkl=hkl, ref_axes=ref_axes), **density_kwargs 93 ) 94 return self.tripcolor( 95 x.ravel(), 96 y.ravel(), 97 z.ravel(), 98 shading=kwargs.pop("shading", "gouraud"), 99 **kwargs, 100 ) 101 else: 102 return self.scatter( 103 *_geo.lambert_equal_area( 104 *_geo.poles(data, hkl=hkl, ref_axes=ref_axes), 105 ), 106 s=kwargs.pop("s", 1), 107 c=kwargs.pop("c", mpl.rcParams["axes.edgecolor"]), 108 marker=kwargs.pop("marker", "."), 109 alpha=kwargs.pop("alpha", 0.33), 110 zorder=kwargs.pop("zorder", 11), 111 **kwargs, 112 ) 113 114 115register_projection(PoleFigureAxes)
13class PoleFigureAxes(mplax.Axes): 14 """Axes class designed for crystallographic pole figures. 15 16 Thin `matplotlib.axes.Axes` wrapper for crystallographic pole figures. 17 18 .. note:: 19 Projections are not performed automatically using default methods like 20 `scatter` or `plot`. To actually plot the pole figures, use `polefigure`. 21 22 """ 23 24 name = "pydrex.polefigure" 25 26 def _prep_polefig_axis(self, ref_axes="xz"): 27 """Set various options of a matplotlib `Axes` to prepare for a pole figure. 28 29 Use a two-letter string for `ref_axes`. 30 These letters will be used for the horizontal and vertical labels, respectively. 31 32 """ 33 self.set_axis_off() 34 self.set_aspect("equal") 35 _circle_points = np.linspace(0, np.pi * 2, 100) 36 self.plot( 37 np.cos(_circle_points), 38 np.sin(_circle_points), 39 linewidth=0.25, 40 color=mpl.rcParams["axes.edgecolor"], 41 ) 42 self.axhline(0, color=mpl.rcParams["grid.color"], alpha=0.5) 43 self.text( 44 1.0, 45 0.4, 46 ref_axes[0], 47 verticalalignment="center", 48 transform=self.transAxes, 49 fontsize="x-small", 50 ) 51 self.axvline(0, color=mpl.rcParams["grid.color"], alpha=0.5) 52 53 self.text( 54 0.6, 55 1.0, 56 ref_axes[1], 57 horizontalalignment="center", 58 transform=self.transAxes, 59 fontsize="x-small", 60 ) 61 62 def polefigure( 63 self, 64 data: np.ndarray, 65 density: bool = False, 66 ref_axes: str = "xz", 67 hkl=[1, 0, 0], 68 density_kwargs: dict | None = None, 69 **kwargs, 70 ): 71 """Plot pole figure of crystallographic texture. 72 73 - `data` — Nx3x3 array of orientation matrices 74 - `density` (optional) — plot contoured pole figures, False by default 75 - `ref_axes` (optional) — letters specifying the horizontal and vertical axes of 76 the pole figure, and respective labels 77 - `hkl` (optional) — crystallographic axis (one of the slip directions of 78 the mineral phase, e.g. [1, 0, 0], [0, 1, 0] or [0, 0, 1]) 79 - `density_kwargs` (optional) — keyword arguments to pass to 80 `pydrex.stats.point_density` if `density=True` 81 82 Any additional keyword arguments are passed to either `tripcolor` if 83 `density=True` or `scatter` if `density=False`. 84 85 """ 86 if density_kwargs is None: 87 density_kwargs = {} 88 89 self._prep_polefig_axis(ref_axes=ref_axes) 90 91 if density: 92 x, y, z = _stats.point_density( 93 *_geo.poles(data, hkl=hkl, ref_axes=ref_axes), **density_kwargs 94 ) 95 return self.tripcolor( 96 x.ravel(), 97 y.ravel(), 98 z.ravel(), 99 shading=kwargs.pop("shading", "gouraud"), 100 **kwargs, 101 ) 102 else: 103 return self.scatter( 104 *_geo.lambert_equal_area( 105 *_geo.poles(data, hkl=hkl, ref_axes=ref_axes), 106 ), 107 s=kwargs.pop("s", 1), 108 c=kwargs.pop("c", mpl.rcParams["axes.edgecolor"]), 109 marker=kwargs.pop("marker", "."), 110 alpha=kwargs.pop("alpha", 0.33), 111 zorder=kwargs.pop("zorder", 11), 112 **kwargs, 113 )
Axes class designed for crystallographic pole figures.
Thin matplotlib.axes.Axes
wrapper for crystallographic pole figures.
Projections are not performed automatically using default methods like
scatter
or plot
. To actually plot the pole figures, use polefigure
.
62 def polefigure( 63 self, 64 data: np.ndarray, 65 density: bool = False, 66 ref_axes: str = "xz", 67 hkl=[1, 0, 0], 68 density_kwargs: dict | None = None, 69 **kwargs, 70 ): 71 """Plot pole figure of crystallographic texture. 72 73 - `data` — Nx3x3 array of orientation matrices 74 - `density` (optional) — plot contoured pole figures, False by default 75 - `ref_axes` (optional) — letters specifying the horizontal and vertical axes of 76 the pole figure, and respective labels 77 - `hkl` (optional) — crystallographic axis (one of the slip directions of 78 the mineral phase, e.g. [1, 0, 0], [0, 1, 0] or [0, 0, 1]) 79 - `density_kwargs` (optional) — keyword arguments to pass to 80 `pydrex.stats.point_density` if `density=True` 81 82 Any additional keyword arguments are passed to either `tripcolor` if 83 `density=True` or `scatter` if `density=False`. 84 85 """ 86 if density_kwargs is None: 87 density_kwargs = {} 88 89 self._prep_polefig_axis(ref_axes=ref_axes) 90 91 if density: 92 x, y, z = _stats.point_density( 93 *_geo.poles(data, hkl=hkl, ref_axes=ref_axes), **density_kwargs 94 ) 95 return self.tripcolor( 96 x.ravel(), 97 y.ravel(), 98 z.ravel(), 99 shading=kwargs.pop("shading", "gouraud"), 100 **kwargs, 101 ) 102 else: 103 return self.scatter( 104 *_geo.lambert_equal_area( 105 *_geo.poles(data, hkl=hkl, ref_axes=ref_axes), 106 ), 107 s=kwargs.pop("s", 1), 108 c=kwargs.pop("c", mpl.rcParams["axes.edgecolor"]), 109 marker=kwargs.pop("marker", "."), 110 alpha=kwargs.pop("alpha", 0.33), 111 zorder=kwargs.pop("zorder", 11), 112 **kwargs, 113 )
Plot pole figure of crystallographic texture.
data
— Nx3x3 array of orientation matricesdensity
(optional) — plot contoured pole figures, False by defaultref_axes
(optional) — letters specifying the horizontal and vertical axes of the pole figure, and respective labelshkl
(optional) — crystallographic axis (one of the slip directions of the mineral phase, e.g. [1, 0, 0], [0, 1, 0] or [0, 0, 1])density_kwargs
(optional) — keyword arguments to pass topydrex.stats.point_density
ifdensity=True
Any additional keyword arguments are passed to either tripcolor
if
density=True
or scatter
if density=False
.
148 cls.set = lambda self, **kwargs: Artist.set(self, **kwargs)
Set multiple properties at once.
Supported properties are
Properties:
adjustable: {'box', 'datalim'}
agg_filter: a filter function, which takes a (m, n, 3) float array and a dpi value, and returns a (m, n, 3) array and two offsets from the bottom left corner of the image
alpha: scalar or None
anchor: (float, float) or {'C', 'SW', 'S', 'SE', 'E', 'NE', ...}
animated: bool
aspect: {'auto', 'equal'} or float
autoscale_on: bool
autoscalex_on: unknown
autoscaley_on: unknown
axes_locator: Callable[[Axes, Renderer], Bbox]
axisbelow: bool or 'line'
box_aspect: float or None
clip_box: ~matplotlib.transforms.BboxBase
or None
clip_on: bool
clip_path: Patch or (Path, Transform) or None
facecolor or fc: :mpltype:color
figure: ~matplotlib.figure.Figure
forward_navigation_events: bool or "auto"
frame_on: bool
gid: str
in_layout: bool
label: object
mouseover: bool
navigate: bool
navigate_mode: unknown
path_effects: list of .AbstractPathEffect
picker: None or bool or float or callable
position: [left, bottom, width, height] or ~matplotlib.transforms.Bbox
prop_cycle: ~cycler.Cycler
rasterization_zorder: float or None
rasterized: bool
sketch_params: (scale: float, length: float, randomness: float)
snap: bool or None
subplotspec: unknown
title: str
transform: ~matplotlib.transforms.Transform
url: str
visible: bool
xbound: (lower: float, upper: float)
xlabel: str
xlim: (left: float, right: float)
xmargin: float greater than -0.5
xscale: unknown
xticklabels: unknown
xticks: unknown
ybound: (lower: float, upper: float)
ylabel: str
ylim: (bottom: float, top: float)
ymargin: float greater than -0.5
yscale: unknown
yticklabels: unknown
yticks: unknown
zorder: float
Inherited Members
- matplotlib.axes._base._AxesBase
- _AxesBase
- axes
- spines
- fmt_xdata
- fmt_ydata
- get_subplotspec
- set_subplotspec
- get_gridspec
- get_window_extent
- set_figure
- viewLim
- get_xaxis_transform
- get_xaxis_text1_transform
- get_xaxis_text2_transform
- get_yaxis_transform
- get_yaxis_text1_transform
- get_yaxis_text2_transform
- get_position
- set_position
- reset_position
- set_axes_locator
- get_axes_locator
- clear
- cla
- ArtistList
- artists
- collections
- images
- lines
- patches
- tables
- texts
- get_facecolor
- set_facecolor
- set_prop_cycle
- get_aspect
- set_aspect
- get_adjustable
- set_adjustable
- get_box_aspect
- set_box_aspect
- get_anchor
- set_anchor
- get_data_ratio
- apply_aspect
- axis
- get_legend
- get_images
- get_lines
- get_xaxis
- get_yaxis
- get_xgridlines
- get_xticklines
- get_ygridlines
- get_yticklines
- has_data
- add_artist
- add_child_axes
- add_collection
- add_image
- add_line
- add_patch
- add_table
- add_container
- relim
- update_datalim
- in_axes
- get_autoscalex_on
- get_autoscaley_on
- set_autoscalex_on
- set_autoscaley_on
- get_autoscale_on
- set_autoscale_on
- use_sticky_edges
- get_xmargin
- get_ymargin
- set_xmargin
- set_ymargin
- margins
- set_rasterization_zorder
- get_rasterization_zorder
- autoscale
- autoscale_view
- draw
- draw_artist
- redraw_in_frame
- get_frame_on
- set_frame_on
- get_axisbelow
- set_axisbelow
- grid
- ticklabel_format
- locator_params
- tick_params
- set_axis_off
- set_axis_on
- get_xlabel
- set_xlabel
- invert_xaxis
- xaxis_inverted
- get_xbound
- set_xbound
- get_xlim
- set_xlim
- get_xscale
- set_xscale
- get_xticks
- set_xticks
- get_xmajorticklabels
- get_xminorticklabels
- get_xticklabels
- set_xticklabels
- get_ylabel
- set_ylabel
- invert_yaxis
- yaxis_inverted
- get_ybound
- set_ybound
- get_ylim
- set_ylim
- get_yscale
- set_yscale
- get_yticks
- set_yticks
- get_ymajorticklabels
- get_yminorticklabels
- get_yticklabels
- set_yticklabels
- xaxis_date
- yaxis_date
- format_xdata
- format_ydata
- format_coord
- minorticks_on
- minorticks_off
- can_zoom
- can_pan
- start_pan
- end_pan
- drag_pan
- get_children
- contains
- contains_point
- get_default_bbox_extra_artists
- get_tightbbox
- twinx
- twiny
- label_outer
- get_fc
- set_fc
- matplotlib.axes._axes.Axes
- get_title
- set_title
- get_legend_handles_labels
- legend
- inset_axes
- indicate_inset
- indicate_inset_zoom
- secondary_xaxis
- secondary_yaxis
- text
- annotate
- axhline
- axvline
- axline
- axhspan
- axvspan
- hlines
- vlines
- eventplot
- plot
- plot_date
- loglog
- semilogx
- semilogy
- acorr
- xcorr
- step
- bar
- barh
- bar_label
- broken_barh
- stem
- pie
- errorbar
- boxplot
- bxp
- scatter
- hexbin
- arrow
- quiverkey
- quiver
- barbs
- fill
- fill_between
- fill_betweenx
- imshow
- pcolor
- pcolormesh
- pcolorfast
- contour
- contourf
- clabel
- hist
- stairs
- hist2d
- ecdf
- psd
- csd
- magnitude_spectrum
- angle_spectrum
- phase_spectrum
- cohere
- specgram
- spy
- matshow
- violinplot
- violin
- table
- stackplot
- streamplot
- tricontour
- tricontourf
- tripcolor
- triplot
- matplotlib.artist.Artist
- zorder
- stale_callback
- figure
- clipbox
- remove
- have_units
- convert_xunits
- convert_yunits
- stale
- add_callback
- remove_callback
- pchanged
- is_transform_set
- set_transform
- get_transform
- pickable
- pick
- set_picker
- get_picker
- get_url
- set_url
- get_gid
- set_gid
- get_snap
- set_snap
- get_sketch_params
- set_sketch_params
- set_path_effects
- get_path_effects
- get_figure
- set_clip_box
- set_clip_path
- get_alpha
- get_visible
- get_animated
- get_in_layout
- get_clip_on
- get_clip_box
- get_clip_path
- get_transformed_clip_path_and_affine
- set_clip_on
- get_rasterized
- set_rasterized
- get_agg_filter
- set_agg_filter
- set_alpha
- set_visible
- set_animated
- set_in_layout
- get_label
- set_label
- get_zorder
- set_zorder
- sticky_edges
- update_from
- properties
- update
- findobj
- get_cursor_data
- format_cursor_data
- get_mouseover
- set_mouseover
- mouseover