Finished (:D) fig_invariance_log_hp.pdf.

Added movable label string to time_bar().
This commit is contained in:
j-hartling
2026-03-23 15:38:49 +01:00
parent a276883454
commit dc4443aa17
18 changed files with 389 additions and 247 deletions

View File

@@ -16,41 +16,56 @@ def hide_axis(ax, side='bottom'):
which='both', **params)
return None
def get_trans_artist(artist):
artist_type = type(artist).__name__
if artist_type == 'Axes':
return artist.transAxes
elif artist_type == 'Figure':
return artist.transFigure
elif artist_type == 'Subfigure':
return artist.transSubfigure
elif hasattr(artist, 'bbox'):
return BboxTransformTo(artist.bbox)
renderer = artist.get_figure(root=True).canvas.get_renderer()
if hasattr(artist, 'get_window_extent'):
return BboxTransformTo(artist.get_window_extent(renderer))
elif hasattr(artist, 'get_tightbbox'):
return BboxTransformTo(artist.get_tightbbox(renderer))
raise ValueError('Artist does not have a bounding box to use as transform.')
def title_subplot(artist, title, x=0.5, y=1.0, xref=None, yref=None, ref=None,
ha='center', va='bottom', fontsize=16, fontweight='normal', **kwargs):
trans_artist = BboxTransformTo(artist.bbox)
trans_artist = get_trans_artist(artist)
if xref is not None or yref is not None:
transform = BboxTransformTo(ref.bbox) + trans_artist.inverted()
transform = get_trans_artist(ref) + trans_artist.inverted()
if xref is not None:
x = transform.transform((xref, 0))[0]
if yref is not None:
y = transform.transform((0, yref))[1]
artist.text(x, y, title, transform=trans_artist, ha=ha, va=va,
fontsize=fontsize, fontweight=fontweight, **kwargs)
return None
return artist.text(x, y, title, transform=trans_artist, ha=ha, va=va,
fontsize=fontsize, fontweight=fontweight, **kwargs)
def letter_subplot(artist, label, x=None, y=None, xref=None, yref=None, ref=None,
ha='left', va='bottom', fontsize=16, fontweight='bold', **kwargs):
trans_artist = BboxTransformTo(artist.bbox)
trans_artist = get_trans_artist(artist)
if x is None or y is None:
transform = BboxTransformTo(ref.bbox) + trans_artist.inverted()
transform = get_trans_artist(ref) + trans_artist.inverted()
if x is None:
x = transform.transform([xref, 0])[0]
if y is None:
y = transform.transform([0, yref])[1]
artist.text(x, y, label, transform=trans_artist, ha=ha, va=va,
fontsize=fontsize, fontweight=fontweight, **kwargs)
return None
return artist.text(x, y, label, transform=trans_artist, ha=ha, va=va,
fontsize=fontsize, fontweight=fontweight, **kwargs)
def letter_subplots(artists, labels=None, x=None, y=None, xref=None, yref=None, ref=None,
ha='left', va='bottom', fontsize=16, fontweight='bold', **kwargs):
if labels is None:
labels = string.ascii_lowercase
handles = []
for artist, label in zip(artists, labels):
letter_subplot(artist, label, x, y, xref, yref, ref=ref, ha=ha, va=va,
fontsize=fontsize, fontweight=fontweight, **kwargs)
return None
handles.append(letter_subplot(artist, label, x, y, xref, yref, ref,
ha=ha, va=va, fontsize=fontsize, fontweight=fontweight, **kwargs))
return handles
def xlimits(time, ax=None, minval=None, maxval=None, pad=0.05):
limits = [minval, maxval]
@@ -83,34 +98,32 @@ def ylimits(signal, ax=None, minval=None, maxval=None, pad=0.05):
return limits
def xlabel(ax, label, x=None, y=-0.1, fontsize=20, transform=None, **kwargs):
ax.set_xlabel(label, fontsize=fontsize, **kwargs)
if x is None:
x = 0.5
if transform is not None:
x = (ax.transAxes + transform.inverted()).transform((x, 0))[0]
ax.xaxis.set_label_coords(x, y, transform=transform)
return None
return ax.set_xlabel(label, fontsize=fontsize, **kwargs)
def ylabel(ax, label, x=-0.2, y=None, fontsize=20, transform=None, **kwargs):
ax.set_ylabel(label, fontsize=fontsize, **kwargs)
if y is None:
y = 0.5
if transform is not None:
y = (ax.transAxes + transform.inverted()).transform((0, y))[1]
ax.yaxis.set_label_coords(x, y, transform=transform)
return None
return ax.set_ylabel(label, fontsize=fontsize, **kwargs)
def super_xlabel(label, fig, left_ax, right_ax, y=0.005,
left_fig=None, right_fig=None, **kwargs):
left_x = left_ax.get_position().x0
right_x = right_ax.get_position().x1
if left_fig is not None or right_fig is not None:
trans_fig = BboxTransformTo(fig.bbox)
trans_fig = get_trans_artist(fig)
if left_fig is not None:
transform = BboxTransformTo(left_fig.bbox) + trans_fig.inverted()
transform = get_trans_artist(left_fig) + trans_fig.inverted()
left_x = transform.transform((left_x, 0))[0]
if right_fig is not None:
transform = BboxTransformTo(right_fig.bbox) + trans_fig.inverted()
transform = get_trans_artist(right_fig) + trans_fig.inverted()
right_x = transform.transform((right_x, 0))[0]
return fig.supxlabel(label, x=(left_x + right_x) / 2, y=y, **kwargs)
@@ -119,12 +132,12 @@ def super_ylabel(label, fig, low_ax, high_ax, x=0.005,
low_y = high_ax.get_position().y0
high_y = low_ax.get_position().y1
if low_fig is not None or high_fig is not None:
trans_fig = BboxTransformTo(fig.bbox)
trans_fig = get_trans_artist(fig)
if low_fig is not None:
transform = BboxTransformTo(low_fig.bbox) + trans_fig.inverted()
transform = get_trans_artist(low_fig) + trans_fig.inverted()
low_y = transform.transform((0, low_y))[1]
if high_fig is not None:
transform = BboxTransformTo(high_fig.bbox) + trans_fig.inverted()
transform = get_trans_artist(high_fig) + trans_fig.inverted()
high_y = transform.transform((0, high_y))[1]
return fig.supylabel(label, x=x, y=(low_y + high_y) / 2, **kwargs)
@@ -161,9 +174,8 @@ def indicate_zoom(fig, high_ax, low_ax, zoom_abs, **kwargs):
transform = low_ax.transData + fig.transFigure.inverted()
x0 = transform.transform((zoom_abs[0], 0))[0]
x1 = transform.transform((zoom_abs[1], 0))[0]
fig.add_artist(plt.Rectangle((x0, y0), x1 - x0, y1 - y0,
transform=fig.transFigure, **kwargs))
return None
return fig.add_artist(plt.Rectangle((x0, y0), x1 - x0, y1 - y0,
transform=fig.transFigure, **kwargs))
def assign_colors(handles, types, colors):
for handle, type_id in zip(handles, types):
@@ -187,22 +199,30 @@ def strip_zeros(num, right_digits=5):
return f'{left}.{right}'
return left
def time_bar(ax, dur, y0=0.9, y1=0.95, xshift=0.5, parent=None, **kwargs):
def time_bar(ax, dur, y0=0.9, y1=0.95, xshift=0.5, parent=None,
text_pos=None, text_str=None, text_kwargs={}, **kwargs):
if parent is None:
parent = ax
trans_parent = BboxTransformTo(parent.bbox)
kwargs['transform'] = trans_parent
trans_parent = get_trans_artist(parent)
transform = ax.transData + trans_parent.inverted()
t0 = ax.get_xlim()[0]
x0 = transform.transform((t0, 0))[0]
x1 = transform.transform((t0 + dur, 0))[0]
dur = x1 - x0
x0 = (1 - dur) * xshift
parent.add_artist(plt.Rectangle((x0, y0), dur, y1 - y0, **kwargs))
return None
rect = parent.add_artist(plt.Rectangle((x0, y0), dur, y1 - y0,
transform=trans_parent, **kwargs))
if text_pos is not None:
trans_bar = get_trans_artist(rect)
text_pos = (trans_bar + trans_parent.inverted()).transform(text_pos)
if text_str is None:
text_str = f'{dur:.2f} s'
t = parent.text(*text_pos, text_str, transform=trans_parent, **text_kwargs)
return rect, t
return rect
def zoom_inset(ax, inset, handle, x0=None, x1=None, y0=None, y1=None, ref='x',
transform = None,
transform=None,
low_left=False, up_left=False, low_right=False, up_right=False,
props=['c', 'lw', 'ls', 'zorder', 'alpha'], **kwargs):
if not kwargs: