dantinox.visualization
The visualization module uses a class-level registry. Charts are registered with @Visualizer.register and auto-discovered at import time. No configuration required to use built-in charts.
Visualizer
- class dantinox.visualization.visualizer.Visualizer(config: RenderConfig | None = None)[source]
Bases:
objectCentral chart registry and rendering orchestrator.
The Visualizer maintains a class-level registry of
Chartsubclasses. Built-in charts are registered automatically on import. User charts are registered with theregister()decorator.Quick-start:
from dantinox.visualization import Visualizer viz = Visualizer() viz.render(report, out_dir="plots") # all charts viz.render(report, charts=["pareto", "radar"])# specific charts
Adding a custom chart:
from dantinox.visualization import Visualizer from dantinox.visualization.base import Chart @Visualizer.register class MyChart(Chart): name = "my_chart" accepts = object def _render_mpl(self, data, config, fig, ax): ax.bar([1, 2], [3, 4]) viz = Visualizer() viz.render(data, charts=["my_chart"])
- classmethod register(chart_cls: type[Chart]) type[Chart][source]
Register a
Chartsubclass. Can be used as a decorator.
- render(data: Any, *, charts: list[str] | None = None, out_dir: str = 'plots', config: RenderConfig | None = None) dict[str, Path][source]
Render one or more charts and write them to out_dir.
- Parameters:
data – Any data understood by the registered charts (e.g.
SuiteReport,pandas.DataFrame, or a CSV path).charts – Names of charts to render. Renders all registered charts when omitted.
out_dir – Directory for output files (created if absent).
config – Override the instance-level
RenderConfig.
- Returns:
{chart_name: output_path}for every chart that succeeded.
Base types
- class dantinox.visualization.base.RenderConfig(backend: str = 'matplotlib', fmt: str = 'png', dpi: int = 150, width: float = 10.0, height: float = 6.0, style: str = 'publication')[source]
Bases:
objectControls how a
Chartrenders and saves its output.Attributes
backend : Plotting engine —
"matplotlib"(default) or"plotly". fmt : Output file format —"png"|"pdf"|"svg". dpi : Raster resolution (ignored for vector formats). width : Figure width in inches. height : Figure height in inches. style : Named style preset —"publication"|"dark"|"minimal".
- class dantinox.visualization.base.Chart[source]
Bases:
ABCAbstract base for all DantinoX visualization charts.
Implementing a new chart requires only two overrides:
class AccuracyChart(Chart): name = "accuracy" accepts = SuiteReport # or pd.DataFrame, list[dict], … def _render_mpl(self, data, config, fig, ax): ax.plot(data.epochs, data.accuracy) ax.set_title("Accuracy over epochs")
The chart is then automatically available through the
Visualizerregistry once imported:from dantinox.visualization import Visualizer Visualizer.register(AccuracyChart)
Built-in charts
- class dantinox.visualization.charts.training.TrainingCurveChart[source]
Bases:
ChartPlot training (and optional validation) loss over epochs or steps.
Accepts
pandas.DataFrameMust contain a numeric
losscolumn. Optionalval_lossandepoch/stepcolumns are used automatically when present.strPath to a CSV with the same schema.
Example:
from dantinox.visualization import Visualizer Visualizer().render(report, charts=["training_curve"], out_dir="plots")
- class dantinox.visualization.charts.throughput.ThroughputChart[source]
Bases:
ChartTokens/s vs sequence length — one line per attention type or model.
Accepts
SuiteReportorpandas.DataFrameA DataFrame must contain columns
tps_seq{L}for each sequence length and optionally atypecolumn for colour-coding.
- class dantinox.visualization.charts.throughput.ThroughputBatchChart[source]
Bases:
ChartTokens/s vs batch size — shows how well the model scales with parallelism.
Accepts
SuiteReportorpandas.DataFrameMust contain columns
tps_bs{B}for each batch size.
- class dantinox.visualization.charts.latency.LatencyChart[source]
Bases:
ChartThroughput (tok/s) vs latency (ms) scatter — the efficiency frontier.
Points above and to the left are Pareto-dominant. A dashed frontier curve is drawn automatically.
Accepts
SuiteReportorpandas.DataFrameMust contain
latency_mean_msandthroughput_tpscolumns. Optionaltypecolumn used for colour-coding.
- class dantinox.visualization.charts.pareto.ParetoChart(x_col: str = 'throughput_tps', y_col: str = 'perplexity', label_col: str = 'run', size_col: str | None = None)[source]
Bases:
ChartQuality vs efficiency Pareto chart.
Plots perplexity (y-axis, lower is better) against throughput or a model-size metric (x-axis, higher is better), revealing the Pareto frontier of quality-vs-efficiency trade-offs.
- Parameters:
x_col – Column name for the efficiency axis (default:
"throughput_tps").y_col – Column name for the quality axis (default:
"perplexity").label_col – Column used to annotate each point (default:
"run").size_col – Column used to size markers (e.g.
"n_params"). Optional.
Example:
ParetoChart(x_col="throughput_tps", y_col="perplexity")
- class dantinox.visualization.charts.radar.RadarChart(metrics: list[str] | None = None, model_col: str = 'run')[source]
Bases:
ChartSpider / radar chart for multi-task benchmark comparison.
Each spoke represents one benchmark metric; each series represents one model or configuration. Values are automatically normalised to [0, 1].
Accepts
SuiteReportorpandas.DataFrameDataFrame where each row is a model and each column is a metric. Specify which columns to show via
metricsconstructor argument.
- param metrics:
Column names to include as spokes. Defaults to all numeric columns.
- param model_col:
Column used to label series (default:
"run").
Example:
RadarChart(metrics=["perplexity", "throughput_tps", "prefill_mean_ms"])
Quick reference
import pandas as pd
from dantinox.visualization import Visualizer, RenderConfig
df = pd.read_csv("benchmark_results.csv")
# Render all registered default-constructible charts
Visualizer().render(df, out_dir="plots/")
# Specific charts with custom config
cfg = RenderConfig(backend="matplotlib", fmt="pdf", style="publication", dpi=300)
Visualizer().render(df, charts=["throughput", "pareto"], out_dir="paper_plots/", config=cfg)
# Radar chart (requires explicit instantiation — not auto-rendered)
from dantinox.visualization import RadarChart, Visualizer
radar = RadarChart(metrics=["peak_tps", "perplexity", "prefill_mean_ms"])
Visualizer(extra_charts=[radar]).render(df, charts=["radar"], out_dir="plots/")
Style presets
|
Use case |
|---|---|
|
LaTeX-compatible, high-DPI, serif fonts |
|
Presentations, dark-mode slides |
|
Lightweight, no gridlines |
Chart registry
from dantinox.visualization import Visualizer
# List all registered chart names
print(list(Visualizer._registry.keys()))
# ['training_curve', 'throughput', 'throughput_batch', 'latency', 'pareto', 'radar']