hyperspy.api.plot.markers#
|
A set of Arrow markers based on the matplotlib.quiver.Quiver class. |
|
A set of Circle Markers. |
|
A set of Ellipse Markers |
A set of HorizontalLines markers |
|
|
A set of Line Segments Markers. |
|
A set of markers using Matplotlib collections. |
|
A set of Points Markers. |
|
A Collection of Rectangles Markers |
|
A Collection of Rectangles Markers |
|
A Collection of square markers. |
|
A set of text markers |
A set of Vertical Line Markers |
Markers that can be added to BaseSignal plots.
Examples
>>> import skimage
>>> im = hs.signals.Signal2D(skimage.data.camera())
>>> m = hs.plot.markers.Rectangles(
... offsets=[10, 15],
... widths=(5,),
... heights=(7,),
... angles=(0,),
... color="red",
... )
>>> im.add_marker(m)
- class hyperspy.api.plot.markers.Arrows(offsets, U, V, C=None, scale=1, angles='xy', scale_units='xy', **kwargs)#
Bases:
MarkersA set of Arrow markers based on the matplotlib.quiver.Quiver class.
Initialize the set of Arrows Markers.
- Parameters:
- offsetsarray_like
The positions [x, y] of the center of the marker. If the offsets are not provided, the marker will be placed at the current navigation position.
- Uarray_like
The change in x (horizontal) diraction for the arrows.
- Varray_like
The change in y (vertical) diraction for the arrows.
- Carray_like or
None - kwargs
dict Keyword arguments are passed to
matplotlib.quiver.Quiver.
- update()#
Update the markers on the plot.
- class hyperspy.api.plot.markers.Circles(offsets, sizes, offset_transform='data', units='x', facecolors='none', **kwargs)#
Bases:
MarkersA set of Circle Markers.
Create a set of Circle Markers.
- Parameters:
- offsetsarray_like
The positions [x, y] of the center of the marker. If the offsets are not provided, the marker will be placed at the current navigation position.
- sizes
numpy.ndarray The size of the circles in units defined by the argument units.
- facecolorsmatplotlib color or
listof color Set the facecolor(s) of the markers. It can be a color (all patches have same color), or a sequence of colors; if it is a sequence the patches will cycle through the sequence. If c is ‘none’, the patch will not be filled.
- units{
"points","inches","dots","width"”,"height","x","y","xy"} The units in which majors and minors are given;
"width"and"height"refer to the dimensions of the axes, while"x"and"y"refer to the offsets data units."xy"differs from all others in that the angle as plotted varies with the aspect ratio, and equals the specified angle only when the aspect ratio is unity. Hence it behaves the same as thematplotlib.patches.Ellipsewithaxes.transDataas its transform.- kwargs
dict Keyword arguments are passed to
matplotlib.collections.CircleCollection.
- class hyperspy.api.plot.markers.Ellipses(offsets, heights, widths, angles=0, offset_transform='data', units='xy', **kwargs)#
Bases:
MarkersA set of Ellipse Markers
Initialize the set of Ellipse Markers.
- Parameters:
- offsetsarray_like
The positions [x, y] of the center of the marker. If the offsets are not provided, the marker will be placed at the current navigation position.
- heights: array-like
The lengths of the second axes.
- widths: array-like
The lengths of the first axes (e.g., major axis lengths).
- anglesarray_like
- The angles of the first axes, degrees CCW from the x-axis.
- units{
"points","inches","dots","width"”,"height","x","y","xy"} The units in which majors and minors are given;
"width"and"height"refer to the dimensions of the axes, while"x"and"y"refer to the offsets data units."xy"differs from all others in that the angle as plotted varies with the aspect ratio, and equals the specified angle only when the aspect ratio is unity. Hence it behaves the same as thematplotlib.patches.Ellipsewithaxes.transDataas its transform.- kwargs:
Additional keyword arguments are passed to
matplotlib.collections.EllipseCollection.
- class hyperspy.api.plot.markers.HorizontalLines(offsets, **kwargs)#
Bases:
MarkersA set of HorizontalLines markers
Initialize a set of HorizontalLines markers.
- Parameters:
- offsetsarray_like
Positions of the markers
- kwargs
dict Keyword arguments passed to the underlying marker collection. Any argument that is array-like and has dtype=object is assumed to be an iterating argument and is treated as such.
Examples
>>> import hyperspy.api as hs >>> import matplotlib.pyplot as plt >>> import numpy as np
>>> # Create a Signal2D with 2 navigation dimensions >>> rng = np.random.default_rng(0) >>> data = rng.random((25, 25, 100)) * 100 >>> s = hs.signals.Signal1D(data) >>> offsets = np.array([10, 20, 40])
>>> m = hs.plot.markers.HorizontalLines( ... offsets=offsets, ... linewidth=4, ... colors=['r', 'g', 'b'], ... )
>>> s.plot() >>> s.add_marker(m)
- class hyperspy.api.plot.markers.Lines(segments, transform='data', **kwargs)#
Bases:
MarkersA set of Line Segments Markers.
Initialize the set of Segments Markers.
- Parameters:
- segments
numpy.ndarray Must be with shape [n, 2, 2] ragged array with shape (n, 2, 3) at every navigation position. Defines the lines[[[x1,y1],[x2,y2]], …] of the center of the ellipse.
- kwargs
dict Additional keyword arguments are passed to
matplotlib.collections.LineCollection.
- segments
Notes
Unlike markers using
offsetsargument, the positions of the segments are defined by thesegmentsargument and the tranform specifying the coordinate system of thesegmentsistransform.
- class hyperspy.api.plot.markers.Markers(collection, offset_transform='data', transform='display', shift=None, plot_on_signal=True, name='', ScalarMappable_array=None, **kwargs)#
Bases:
objectA set of markers using Matplotlib collections.
The markers are defined by a set of arugment required by the collections, typically,
offsets,vertsorsegmentswill define their positions.To define a non-static marker any argument that can be set with the
matplotlib.collections.Collection.set()method can be passed as an array with dtype=object of the constructor and the same size as the navigation axes of the a signal the markers will be added to.- Parameters:
- collection
matplotlib.collections.Collectionorstr A Matplotlib collection to be initialized.
- offset_transform, transform
str offset_transformdefine the transformation used for the offsets` value andtranformdefine the transformation for other arguments, typically to scale the size of thePath. It can be one of the following:"data": the offsets are defined in data coordinates and theax.transDatatransformation is used."relative": The offsets are defined in data coordinates in x and coordinates in y relative to the data plotted. Only for 1D figure."axes": the offsets are defined in axes coordinates and theax.transAxestransformation is used. (0, 0) is bottom left of the axes, and (1, 1) is top right of the axes."xaxis": The offsets are defined in data coordinates in x and axes coordinates in y direction; usematplotlib.axes.Axes.get_xaxis_transform()transformation."yaxis": The offsets are defined in data coordinates in y and axes coordinates in x direction; usematplotlib.axes.Axes.get_xaxis_transform()transformation.."display": the offsets are not transformed, i.e. are defined in the display coordinate system. (0, 0) is the bottom left of the window, and (width, height) is top right of the output in “display units”matplotlib.transforms.IdentityTransform.
- shift
Noneorfloat Only for
offset_transform="relative". This applied a systematic shift in the y component of theoffsetsvalues. The shift is defined in the matplotlib"axes"coordinate system. This provides a constant shift from the data for labelingSignal1D.- plot_on_signalbool
If True, plot on signal figure, otherwise on navigator.
- name
str The name of the markers.
- ScalarMappable_arrayArray-like
Set the array of the
matplotlib.cm.ScalarMappableof the matplotlib collection. TheScalarMappablearray will overwritefacecolorandedgecolor. Default is None.- **kwargs
dict Keyword arguments passed to the underlying marker collection. Any argument that is array-like and has
dtype=objectis assumed to be an iterating argument and is treated as such.
- collection
Examples
Add markers using a
matplotlib.collections.PatchCollectionwhich will display the specified subclass ofmatplotlib.patches.Patchat the position defined by the argumentoffsets.>>> from matplotlib.collections import PatchCollection >>> from matplotlib.patches import Circle
>>> m = hs.plot.markers.Markers( ... collection=PatchCollection, ... patches=[Circle((0, 0), 1)], ... offsets=np.random.rand(10,2)*10, ... ) >>> s = hs.signals.Signal2D(np.ones((10, 10, 10, 10))) >>> s.plot() >>> s.add_marker(m)
Adding star “iterating” markers using
matplotlib.collections.StarPolygonCollection>>> from matplotlib.collections import StarPolygonCollection >>> import numpy as np >>> rng = np.random.default_rng(0) >>> data = np.ones((25, 25, 100, 100)) >>> s = hs.signals.Signal2D(data) >>> offsets = np.empty(s.axes_manager.navigation_shape, dtype=object) >>> for ind in np.ndindex(offsets.shape): ... offsets[ind] = rng.random((10, 2)) * 100
Every other star has a size of 50/100
>>> m = hs.plot.markers.Markers( ... collection=StarPolygonCollection, ... offsets=offsets, ... numsides=5, ... color="orange", ... sizes=(50, 100), ... ) >>> s.plot() >>> s.add_marker(m)
- add_items(navigation_indices=None, **kwargs)#
Add items to the markers.
- Parameters:
Examples
Add a single item:
>>> offsets = np.array([[1, 1], [2, 2]]) >>> texts = np.array(["a", "b"]) >>> m = hs.plot.markers.Texts(offsets=offsets, texts=texts) >>> print(m) <Texts, length: 2> >>> m.add_items(offsets=np.array([[0, 1]]), texts=["c"]) >>> print(m) <Texts, length: 3>
Add a single item at a defined navigation position of variable length markers:
>>> offsets = np.empty(4, dtype=object) >>> texts = np.empty(4, dtype=object) >>> for i in range(len(offsets)): ... offsets[i] = np.array([[1, 1], [2, 2]]) ... texts[i] = ['a' * (i+1)] * 2 >>> m = hs.plot.markers.Texts(offsets=offsets, texts=texts) >>> m.add_items( ... offsets=np.array([[0, 1]]), texts=["new_text"], ... navigation_indices=(1, ) ... )
- close(render_figure=True)#
Remove and disconnect the marker.
- Parameters:
- render_figurebool, optional, default
True If True, the figure is rendered after removing the marker. If False, the figure is not rendered after removing the marker. This is useful when many markers are removed from a figure, since rendering the figure after removing each marker will slow things down.
- render_figurebool, optional, default
- classmethod from_signal(signal, key=None, signal_axes='metadata', **kwargs)#
Initialize a marker collection from a hyperspy Signal.
- Parameters:
- signal: :class:`~.api.signals.BaseSignal`
A value passed to the Collection as
{key:signal.data}- key: str or None
The key used to create a key value pair to create the subclass of
matplotlib.collections.Collection. IfNone(default) the key is set to"offsets".- signal_axes: str, tuple of :class:`~.axes.UniformDataAxis` or None
If
"metadata"look for signal_axes saved in metadata unders.metadata.Peaks.signal_axesand convert from pixel positions to real units before creating the collection. If atupleof signal axes, those axes will be used otherwise (None) no transformation will happen.
- get_current_kwargs(only_variable_length=False)#
Return the current keyword arguments for updating the collection.
- property offset_transform#
The tranform being used for the
offsetsvalues.
- plot(render_figure=True)#
Plot a marker which has been added to a signal.
- Parameters:
- render_figurebool, optional, default
True If True, will render the figure after adding the marker. If False, the marker will be added to the plot, but will the figure will not be rendered. This is useful when plotting many markers, since rendering the figure after adding each marker will slow things down.
- render_figurebool, optional, default
- plot_colorbar()#
Add a colorbar for the collection.
- Returns:
matplotlib.colorbar.ColorbarThe colorbar of the collection.
See also
Examples
>>> rng = np.random.default_rng(0) >>> s = hs.signals.Signal2D(np.ones((100, 100))) >>> # Define the size of the circles >>> sizes = rng.random((10, )) * 10 + 20 >>> # Define the position of the circles >>> offsets = rng.random((10, 2)) * 100 >>> m = hs.plot.markers.Circles( ... sizes=sizes, ... offsets=offsets, ... linewidth=2, ... ) >>> s.plot() >>> s.add_marker(m) >>> m.set_ScalarMappable_array(sizes.ravel() / 2) >>> cbar = m.plot_colorbar() >>> cbar.set_label('Circle radius')
- remove_items(indices, keys=None, navigation_indices=None)#
Remove items from the markers.
- Parameters:
- indices
slice,intornumpy.ndarray Indicate indices of sub-arrays to remove along the specified axis.
- keys
str,listofstrorNone Specify the key of the
Markers.kwargsto remove. IfNone, use all compatible keys. Default isNone.- navigation_indices
tuple Only for variable-lenght markers. If
None, remove for all navigation coordinates.
- indices
Examples
Remove a single item:
>>> offsets = np.array([[1, 1], [2, 2]]) >>> m = hs.plot.markers.Points(offsets=offsets) >>> print(m) <Points, length: 2> >>> m.remove_items(indices=(1, )) >>> print(len(m)) 1
Remove a single item at specific navigation position for variable length markers:
>>> offsets = np.empty(4, dtype=object) >>> texts = np.empty(4, dtype=object) >>> for i in range(len(offsets)): ... offsets[i] = np.array([[1, 1], [2, 2]]) ... texts[i] = ['a' * (i+1)] * 2 >>> m = hs.plot.markers.Texts(offsets=offsets, texts=texts) >>> m.remove_items(1, navigation_indices=(1, ))
Remove several items:
>>> offsets = np.stack([np.arange(0, 100, 10)]*2).T + np.array([5,]*2) >>> texts = np.array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'f', 'h', 'i']) >>> m = hs.plot.markers.Texts(offsets=offsets, texts=texts) >>> print(m) <Texts, length: 10> >>> m.remove_items(indices=[1, 2]) >>> print(m) <Texts, length: 8>
- set_ScalarMappable_array(array)#
Set the array of the
matplotlib.cm.ScalarMappableof the matplotlib collection. TheScalarMappablearray will overwritefacecolorandedgecolor.- Parameters:
- arrayarray_like
The value that are mapped to the colors.
See also
- property transform#
The tranform being used for the values other than
offsets, typicallysizes, etc.
- update()#
Update the markers on the plot.
- class hyperspy.api.plot.markers.Points(offsets, sizes=10, offset_transform='data', units='points', **kwargs)#
Bases:
MarkersA set of Points Markers.
Initialize the set of points Markers.
- Parameters:
- offsetsarray_like
The positions [x, y] of the center of the marker. If the offsets are not provided, the marker will be placed at the current navigation position.
- sizes
int,floator array_like, optional The size of the markers in display coordinate system.
- units{
"points","inches","dots","width"”,"height","x","y","xy"} The units in which majors and minors are given;
"width"and"height"refer to the dimensions of the axes, while"x"and"y"refer to the offsets data units."xy"differs from all others in that the angle as plotted varies with the aspect ratio, and equals the specified angle only when the aspect ratio is unity. Hence it behaves the same as thematplotlib.patches.Ellipsewithaxes.transDataas its transform.- kwargs
dict Keyword arguments are passed to
matplotlib.collections.CircleCollection
- class hyperspy.api.plot.markers.Polygons(verts, transform='data', **kwargs)#
Bases:
MarkersA Collection of Rectangles Markers
Initialize the set of Segments Markers.
- Parameters:
- verts
listofnumpy.ndarrayorlistoflist The verts define the vertices of the polygons. Note that this can be a ragged list and as such it is not automatically cast to a numpy array as that would result in an array of objects. In the form [[[x1,y1], [x2,y2], … [xn, yn]],[[x1,y1], [x2,y2], …[xm,ym]], …].
- **kwargs
dict Additional keyword arguments are passed to
matplotlib.collections.PolyCollection
- verts
Notes
Unlike markers using
offsetsargument, the positions of the polygon are defined by thevertsargument and the tranform specifying the coordinate system of thevertsistransform.Examples
>>> import hyperspy.api as hs >>> import numpy as np >>> # Create a Signal2D with 2 navigation dimensions >>> data = np.ones((25, 25, 100, 100)) >>> s = hs.signals.Signal2D(data) >>> poylgon1 = [[1, 1], [20, 20], [1, 20], [25, 5]] >>> poylgon2 = [[50, 60], [90, 40], [60, 40], [23, 60]] >>> verts = [poylgon1, poylgon2] >>> # Create the markers >>> m = hs.plot.markers.Polygons( ... verts=verts, ... linewidth=3, ... facecolors=('g',), ... ) >>> # Add the marker to the signal >>> s.plot() >>> s.add_marker(m)
- class hyperspy.api.plot.markers.Rectangles(offsets, widths, heights, angles=0, offset_transform='data', units='xy', **kwargs)#
Bases:
MarkersA Collection of Rectangles Markers
Initialize the set of Segments Markers.
- Parameters:
- offsetsarray_like
The positions [x, y] of the center of the marker. If the offsets are not provided, the marker will be placed at the current navigation position.
- heights: array-like
The lengths of the second axes.
- widths: array-like
The lengths of the first axes (e.g., major axis lengths).
- anglesarray_like
- The angles of the first axes, degrees CCW from the x-axis.
- units{
"points","inches","dots","width"”,"height","x","y","xy"} The units in which majors and minors are given;
"width"and"height"refer to the dimensions of the axes, while"x"and"y"refer to the offsets data units."xy"differs from all others in that the angle as plotted varies with the aspect ratio, and equals the specified angle only when the aspect ratio is unity. Hence it behaves the same as thematplotlib.patches.Ellipsewithaxes.transDataas its transform.- kwargs:
Additional keyword arguments are passed to
hyperspy.external.matplotlib.collections.RectangleCollection.
- class hyperspy.api.plot.markers.Squares(offsets, widths, angles=0, offset_transform='data', units='x', **kwargs)#
Bases:
MarkersA Collection of square markers.
Initialize the set of square Markers.
- Parameters:
- offsetsarray_like
The positions [x, y] of the center of the marker. If the offsets are not provided, the marker will be placed at the current navigation position.
- widths: array-like
The lengths of the first axes (e.g., major axis lengths).
- anglesarray_like
- The angles of the first axes, degrees CCW from the x-axis.
- units{
"points","inches","dots","width"”,"height","x","y","xy"} The units in which majors and minors are given;
"width"and"height"refer to the dimensions of the axes, while"x"and"y"refer to the offsets data units."xy"differs from all others in that the angle as plotted varies with the aspect ratio, and equals the specified angle only when the aspect ratio is unity. Hence it behaves the same as thematplotlib.patches.Ellipsewithaxes.transDataas its transform.- kwargs:
Additional keyword arguments are passed to
hyperspy.external.matplotlib.collections.SquareCollection.
- class hyperspy.api.plot.markers.Texts(offsets, offset_transform='data', transform='display', **kwargs)#
Bases:
MarkersA set of text markers
Initialize the set of Circle Markers.
- Parameters:
- offsetsarray_like
The positions [x, y] of the center of the marker. If the offsets are not provided, the marker will be placed at the current navigation position.
- sizesarray_like
The size of the text in points.
- facecolors(
listof) matplotlib color Set the facecolor(s) of the markers. It can be a color (all patches have same color), or a sequence of colors; if it is a sequence the patches will cycle through the sequence. If c is ‘none’, the patch will not be filled.
- kwargs
dict Keyword arguments are passed to
matplotlib.collections.CircleCollection.
- class hyperspy.api.plot.markers.VerticalLines(offsets, **kwargs)#
Bases:
MarkersA set of Vertical Line Markers
Initialize the set of Vertical Line Markers.
- Parameters:
- x: [n]
Positions of the markers
- kwargs: dict
Keyword arguments passed to the underlying marker collection. Any argument that is array-like and has dtype=object is assumed to be an iterating argument and is treated as such.
Examples
>>> import hyperspy.api as hs >>> import numpy as np >>> # Create a Signal2D with 2 navigation dimensions >>> rng = np.random.default_rng(0) >>> data = rng.random((25, 25, 100)) >>> s = hs.signals.Signal1D(data) >>> offsets = np.array([10, 20, 40]) >>> # Create the markers >>> m = hs.plot.markers.VerticalLines( ... offsets=offsets, ... linewidth=3, ... colors=['r', 'g', 'b'], ... ) >>> # Add the marker to the signal >>> s.plot() >>> s.add_marker(m)