Plotting Tools#
The pyathena.plt_tools module provides matplotlib utilities for
visualizing simulation data.
Colormaps#
- pyathena.plt_tools.cmap_shift.cmap_shift(cmap, start=0.0, midpoint=0.5, stop=1.0, name='shiftedcmap')[source]#
Function to offset the center of a colormap. Useful for data with a negative min and positive max and you want the middle of the colormap’s dynamic range to be at zero.
- Parameters
cmap (matplotlib colormap) – Colormap to be modified
start (float) – Offset from lowest point in the colormap’s range. Should be between 0.0 and midpoint. Default value is 0.0 (no lower ofset).
midpoint (float) – New center of the colormap. Should be between 0.0 and 1.0. In general, this should be 1 - vmax/(vmax + abs(vmin)). For example, if the data ranges from -15.0 to +5.0 and you want the center of the colormap at 0.0, midpoint should be set to 1 - 5/(5 + 15)) or 0.75. Default value is 0.5 (no shift).
stop (float) – Offset from highets point in the colormap’s range. Should be between midpoint and 1.0. Default value is 1.0 (no upper ofset).
- Returns
cmap_new – New colormap
- Return type
matplotlib colormap
Annotations#
- class pyathena.plt_tools.line_annotation.LineAnnotation(text, line, x, xytext=(0, 5), textcoords='offset points', **kwargs)[source]#
A sloped annotation to line at position x with text Optionally an arrow pointing from the text to the graph at x can be drawn. Usage —– fig, ax = plt.subplots() x = np.linspace(0, 2*pi) line, = ax.plot(x, sin(x)) ax.add_artist(LineAnnotation(“text”, line, 1.5))
Annotate the point at x of the graph line with text text.
By default, the text is displayed with the same rotation as the slope of the graph at a relative position xytext above it (perpendicularly above).
An arrow pointing from the text to the annotated point xy can be added by defining arrowprops.
- Parameters
text (str) – The text of the annotation.
line (Line2D) – Matplotlib line object to annotate
x (float) – The point x to annotate. y is calculated from the points on the line.
xytext ((float, float), default: (0, 5)) – The position (x, y) relative to the point x on the line to place the text at. The coordinate system is determined by textcoords.
**kwargs – Additional keyword arguments are passed on to Annotation.
See also
None,None- get_rotation()[source]#
Determines angle of the slope of the neighbours in display coordinate system
- set(*, agg_filter=<UNSET>, alpha=<UNSET>, animated=<UNSET>, anncoords=<UNSET>, annotation_clip=<UNSET>, antialiased=<UNSET>, backgroundcolor=<UNSET>, bbox=<UNSET>, clip_box=<UNSET>, clip_on=<UNSET>, clip_path=<UNSET>, color=<UNSET>, fontfamily=<UNSET>, fontfeatures=<UNSET>, fontproperties=<UNSET>, fontsize=<UNSET>, fontstretch=<UNSET>, fontstyle=<UNSET>, fontvariant=<UNSET>, fontweight=<UNSET>, gid=<UNSET>, horizontalalignment=<UNSET>, in_layout=<UNSET>, label=<UNSET>, language=<UNSET>, linespacing=<UNSET>, math_fontfamily=<UNSET>, mouseover=<UNSET>, multialignment=<UNSET>, parse_math=<UNSET>, path_effects=<UNSET>, picker=<UNSET>, position=<UNSET>, rasterized=<UNSET>, rotation=<UNSET>, rotation_mode=<UNSET>, sketch_params=<UNSET>, snap=<UNSET>, text=<UNSET>, transform=<UNSET>, transform_rotates_text=<UNSET>, url=<UNSET>, usetex=<UNSET>, verticalalignment=<UNSET>, visible=<UNSET>, wrap=<UNSET>, x=<UNSET>, y=<UNSET>, zorder=<UNSET>)#
Set multiple properties at once.
a.set(a=A, b=B, c=C)
is equivalent to
a.set_a(A) a.set_b(B) a.set_c(C)
In addition to the full property names, aliases are also supported, e.g.
set(lw=2)is equivalent toset(linewidth=2), but it is an error to pass both simultaneously.The order of the individual setter calls matches the order of parameters in
set(). However, most properties do not depend on each other so that order is rarely relevant.Supported properties are
- Properties:
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: float or None animated: bool anncoords: unknown annotation_clip: bool or None antialiased: bool backgroundcolor: :mpltype:`color` bbox: dict with properties for .FancyBboxPatch or None clip_box: ~matplotlib.transforms.BboxBase or None clip_on: bool clip_path: Patch or (Path, Transform) or None color or c: :mpltype:`color` figure: ~matplotlib.figure.Figure or ~matplotlib.figure.SubFigure fontfamily or family or fontname: {FONTNAME, ‘serif’, ‘sans-serif’, ‘cursive’, ‘fantasy’, ‘monospace’} fontfeatures: list of str, or tuple of str, or None fontproperties or font or font_properties: .font_manager.FontProperties or str or pathlib.Path fontsize or size: float or {‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’} fontstretch or stretch: {a numeric value in range 0-1000, ‘ultra-condensed’, ‘extra-condensed’, ‘condensed’, ‘semi-condensed’, ‘normal’, ‘semi-expanded’, ‘expanded’, ‘extra-expanded’, ‘ultra-expanded’} fontstyle or style: {‘normal’, ‘italic’, ‘oblique’} fontvariant or variant: {‘normal’, ‘small-caps’} fontweight or weight: {a numeric value in range 0-1000, ‘ultralight’, ‘light’, ‘normal’, ‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, ‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’} gid: str horizontalalignment or ha: {‘left’, ‘center’, ‘right’} in_layout: bool label: object language: str or None linespacing: ‘normal’ or float, default: ‘normal’ math_fontfamily: str mouseover: bool multialignment or ma: {‘left’, ‘right’, ‘center’} parse_math: bool path_effects: list of .AbstractPathEffect picker: None or bool or float or callable position: (float, float) rasterized: bool rotation: float or {‘vertical’, ‘horizontal’} rotation_mode: {None, ‘default’, ‘anchor’, ‘xtick’, ‘ytick’} sketch_params: (scale: float, length: float, randomness: float) snap: bool or None text: object transform: ~matplotlib.transforms.Transform transform_rotates_text: bool url: str usetex: bool, default: :rc:`text.usetex` verticalalignment or va: {‘baseline’, ‘bottom’, ‘center’, ‘center_baseline’, ‘top’} visible: bool wrap: bool x: float y: float zorder: float
Plots#
- pyathena.plt_tools.plt_joint_pdf.plt_joint_pdf(x, y, hexbin_args={}, bins=30, weights=None, gs=None)[source]#
Plot a 2D joint PDF with marginalized 1D histograms.
Creates a figure with a central hexbin 2D histogram and marginal histograms along the x and y axes.
- Parameters
x (array-like) – Data for the x-axis.
y (array-like) – Data for the y-axis.
hexbin_args (dict, optional) – Arguments passed to
matplotlib.axes.Axes.hexbin(). Must include anextentkey ([xmin, xmax, ymin, ymax]in log10 for log scales) for the marginal histograms to align correctly. Default setsmincnt=1,xscale='log',yscale='log'.bins (int, optional) – Number of bins for the marginal histograms. Default is 30.
weights (array-like, optional) – Weights applied to both the hexbin and marginal histograms. Default is
None.gs (matplotlib.gridspec.GridSpec, optional) – Existing GridSpec to draw into. If
None, a new figure is created.
- Returns
ax (matplotlib.axes.Axes) – Central 2D hexbin axes.
axx (matplotlib.axes.Axes) – Top marginal histogram axes (x-axis projection).
axy (matplotlib.axes.Axes) – Right marginal histogram axes (y-axis projection).
- pyathena.plt_tools.plt_starpar.scatter_sp(sp, ax, dim, cmap=<matplotlib.colors.LinearSegmentedColormap object>, norm_factor=4.0, kind='prj', dist_max=50.0, marker='o', edgecolors=None, linewidths=None, alpha=1.0, kpc=False, runaway=False, agemax=20.0, agemax_sn=40.0, plt_old=False, u=None)[source]#
Function to scatter plot star particles. (From pyathena classic)
- Parameters
sp (DataFrame) – Star particle data
ax (Axes) – matplotlib axes
dim ('x' or 'y' or 'z' (or 0, 1, 2)) – Line-of-sight direction
norm_factor (float) – Symbol size normalization (bigger for smaller norm_factor)
kind ('prj' or 'slc') – Slice or projection.
cmap (matplotlib colormap) –
dist_max (float) – maximum perpendicular distance from the slice plane (slice only)
- pyathena.plt_tools.plt_starpar.legend_sp(ax, norm_factor, mass=[100.0, 1000.0], location='top', fontsize='medium', facecolors='k', linewidths=1.0, bbox_to_anchor=None, ext=None)[source]#
Add legend for sink particle mass.
- Parameters
ax (matplotlib axes) –
norm_factor (float) – Normalization factor for symbol size.
mass (sequence of float) – Sink particle masses in solar mass.
location (str) – “top” or “right”
Style#
- pyathena.plt_tools.set_plt.set_plt_default()[source]#
Apply default matplotlib rcParams for pyathena plots.
Sets figure size (8x6), DPI 200, font size 15, thick tick marks, and constrained layout.
- pyathena.plt_tools.set_plt.set_plt_fancy()[source]#
Apply a publication-quality matplotlib style.
Sets ticks inward on all sides, white background, thick lines, and a custom 10-color cycle.
- pyathena.plt_tools.set_plt.toggle_xticks(axes, visible=False)[source]#
Toggle x-axis tick label visibility on one or more axes.
- Parameters
axes (matplotlib.axes.Axes or array-like of Axes) – Axes to modify.
visible (bool, optional) – Whether to show tick labels. Default is
False(hidden).
Movies#
- pyathena.plt_tools.make_movie.make_movie(fname_glob, fname_out, fps_in=15, fps_out=15)[source]#
Create an mp4 movie from image files matching a glob pattern.
Requires
ffmpegto be installed and available onPATH. Output is encoded as H.264 with yuv420p pixel format for broad compatibility.- Parameters
fname_glob (str) – Glob pattern matching the input image files (e.g.
'frame.????.png').fname_out (str) – Path of the output
.mp4file. Overwritten if it already exists.fps_in (int, optional) – Frame rate of the input image sequence. Default is 15.
fps_out (int, optional) – Frame rate of the output video. Default is 15.
- Returns
Trueif ffmpeg completed successfully,Falseotherwise.- Return type
bool
Examples
>>> make_movie('a.????.png', 'a.mp4', fps_in=1, fps_out=24)