Source code for uchrom.pl.trace_stats
"""Plotting helpers for population-level trace statistics."""
from __future__ import annotations
from typing import Optional, Sequence
import numpy as np
import matplotlib.pyplot as plt
[docs]
def plot_distance_matrix(
matrix: np.ndarray,
bin_ids: Optional[Sequence] = None,
title: Optional[str] = None,
cmap: str = "viridis_r",
ax=None,
):
"""Heatmap of a (n_bins, n_bins) population-mean distance matrix."""
if ax is None:
fig, ax = plt.subplots(figsize=(6, 5))
else:
fig = ax.figure
im = ax.imshow(matrix, cmap=cmap, aspect="equal", origin="lower")
ax.set_xlabel("Bin index")
ax.set_ylabel("Bin index")
if title:
ax.set_title(title)
fig.colorbar(im, ax=ax, label="Distance")
fig.tight_layout()
return fig
[docs]
def plot_rg_histogram(
rg_series,
bins: int = 30,
title: Optional[str] = None,
ax=None,
):
"""Histogram of per-trace radii of gyration."""
if ax is None:
fig, ax = plt.subplots(figsize=(5.5, 3.5))
else:
fig = ax.figure
values = np.asarray(rg_series).astype(float)
values = values[~np.isnan(values)]
ax.hist(values, bins=bins, edgecolor="black", alpha=0.8)
ax.set_xlabel("Radius of gyration")
ax.set_ylabel("Number of traces")
if title:
ax.set_title(title)
med = float(np.median(values)) if values.size else float("nan")
ax.axvline(med, color="red", linestyle="--", label=f"median = {med:.1f}")
ax.legend()
fig.tight_layout()
return fig
__all__ = [
"plot_distance_matrix",
"plot_contact_map",
"plot_rg_histogram",
]