Source code for spectral.utils.formatting
"""Formatting utilities for plot labels and parameters."""
from __future__ import annotations
from typing import Any
import pandas as pd
[docs]
def format_dt_latex(dt: float | str) -> str:
"""Format a timestep value as LaTeX scientific notation.
Parameters
----------
dt : float or str
Timestep value to format. If str and equals '?', returns '?'
Returns
-------
str
LaTeX-formatted string in the form 'mantissa \\times 10^{exponent}'
"""
if dt == "?":
return "?"
dt_str = f"{float(dt):.2e}"
mantissa, exp = dt_str.split("e")
exp_int = int(exp)
return rf"{mantissa} \times 10^{{{exp_int}}}"
[docs]
def extract_metadata(
df: pd.DataFrame,
cols: list[str] | None = None,
row_idx: int = 0,
) -> dict[str, Any]:
"""Extract metadata from a DataFrame.
Assumes metadata columns have constant values across rows.
Parameters
----------
df : pd.DataFrame
DataFrame containing metadata
cols : list of str, optional
List of column names to extract. If None, extracts all columns.
row_idx : int, default 0
Row index to extract from (typically 0 for constant columns)
Returns
-------
dict
Dictionary mapping column names to values
"""
if cols is None:
cols = df.columns.tolist()
return {col: df[col].iloc[row_idx] for col in cols if col in df.columns}
[docs]
def format_parameter_range(
values: list | tuple,
name: str,
latex: bool = True,
) -> str:
"""Format a parameter range for display.
Parameters
----------
values : list or tuple
Parameter values (should be sorted)
name : str
Parameter name (e.g., 'N', 'L', 'dt')
latex : bool, default True
Whether to use LaTeX formatting
Returns
-------
str
Formatted string'
"""
if len(values) == 0:
return f"{name} = ?"
if len(values) == 1:
val = values[0]
if latex:
return rf"${name} = {val}$"
return f"{name} = {val}"
min_val, max_val = min(values), max(values)
# Format based on type
if isinstance(min_val, int) and isinstance(max_val, int):
range_str = f"[{min_val}, {max_val}]"
else:
range_str = f"[{min_val:.1f}, {max_val:.1f}]"
if latex:
return rf"${name} \in {range_str}$"
return f"{name} ∈ {range_str}"
[docs]
def build_parameter_string(
params: dict[str, Any],
separator: str = ", ",
latex: bool = True,
) -> str:
"""Build a parameter string from a dictionary.
Parameters
----------
params : dict
Dictionary of parameter names and values
separator : str, default ', '
Separator between parameters
latex : bool, default True
Whether to use LaTeX formatting (wraps each param in $ $)
Returns
-------
str
Formatted parameter string
"""
parts = []
for name, value in params.items():
if isinstance(value, (list, tuple)):
parts.append(format_parameter_range(value, name, latex=latex))
else:
# Handle special formatting for dt
if "dt" in name.lower() or "Delta t" in name:
value_str = format_dt_latex(value)
if latex:
parts.append(rf"${name} = {value_str}$")
else:
parts.append(f"{name} = {value_str}")
else:
if latex:
parts.append(rf"${name} = {value}$")
else:
parts.append(f"{name} = {value}")
return separator.join(parts)