Chart classes and data models¶
This page documents the primary chart constructors and the structured data models used by the clean API.
Bar and comparison charts¶
ASCII horizontal bar chart for performance comparisons.
- class textcharts.bar_chart.BarData(label, value, group=None, error=None, is_best=False, is_worst=False)[source]¶
Bases:
objectData for a single bar.
- Parameters:
label (str)
value (float)
group (str | None)
error (float | None)
is_best (bool)
is_worst (bool)
- label: str¶
- value: float¶
- group: str | None = None¶
- error: float | None = None¶
- is_best: bool = False¶
- is_worst: bool = False¶
- class textcharts.bar_chart.BarChart(data, title=None, metric_label='Value', sort_by='value', options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseHorizontal bar chart rendered in ASCII/Unicode.
Example output:
` Performance Comparison (ms) ──────────────────────────────────────── DuckDB ████████████████████████ 240.5 Polars ████████████████████ 200.1 Pandas ████████████████████████████████ 320.8 `- Parameters:
data (Sequence[BarData])
title (str | None)
metric_label (str)
sort_by (str)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- textcharts.bar_chart.from_data(data, title=None, metric_label='Value', sort_by='value', options=None, subject=None)[source]¶
Create BarChart from objects with label/value attributes.
- Parameters:
data (Sequence)
title (str | None)
metric_label (str)
sort_by (str)
options (ChartOptions | None)
subject (str | None)
- Return type:
ASCII paired comparison bar chart for side-by-side run comparison.
- class textcharts.comparison_bar.ComparisonBarData(label, baseline_value, comparison_value, baseline_name='Baseline', comparison_name='Comparison')[source]¶
Bases:
objectData for a single query comparison between two runs.
- Parameters:
label (str)
baseline_value (float)
comparison_value (float)
baseline_name (str)
comparison_name (str)
- label: str¶
- baseline_value: float¶
- comparison_value: float¶
- baseline_name: str = 'Baseline'¶
- comparison_name: str = 'Comparison'¶
- class textcharts.comparison_bar.ComparisonBar(data, title=None, metric_label='Value', options=None, subtitle=None, subject=None, lower_is_better=True)[source]¶
Bases:
ChartBasePaired comparison bar chart showing side-by-side bars per query.
- Parameters:
data (Sequence[ComparisonBarData])
title (str | None)
metric_label (str)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
lower_is_better (bool)
- STABLE_THRESHOLD_PCT = 2.0¶
- textcharts.comparison_bar.from_data(data, title=None, metric_label='Value', options=None, subject=None)[source]¶
Create ComparisonBar from comparison data.
Accepts ComparisonBarData objects or dicts with compatible keys.
- Parameters:
data (Sequence)
title (str | None)
metric_label (str)
options (ChartOptions | None)
subject (str | None)
- Return type:
ASCII diverging bar chart for regression/improvement distribution.
- class textcharts.diverging_bar.DivergingBarData(label, pct_change)[source]¶
Bases:
objectData for a single item in a diverging bar chart.
- Parameters:
label (str)
pct_change (float)
- label: str¶
- pct_change: float¶
- class textcharts.diverging_bar.DivergingBar(data, title=None, clip_pct=200.0, options=None, subtitle=None, subject=None, lower_is_better=True)[source]¶
Bases:
ChartBaseDiverging bar chart showing percentage changes centered on zero.
- Parameters:
data (Sequence[DivergingBarData])
title (str | None)
clip_pct (float)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
lower_is_better (bool)
- DEFAULT_CLIP_PCT = 200.0¶
- textcharts.diverging_bar.from_data(data, title=None, options=None, subject=None)[source]¶
Create DivergingBar from regression data.
Accepts DivergingBarData objects or dicts with compatible keys.
- Parameters:
data (Sequence)
title (str | None)
options (ChartOptions | None)
subject (str | None)
- Return type:
ASCII stacked bar chart for benchmark phase time decomposition.
- class textcharts.stacked_bar.StackedBarSegment(phase_name, value, color=None)[source]¶
Bases:
objectA single segment within a stacked bar.
- Parameters:
phase_name (str)
value (float)
color (str | None)
- phase_name: str¶
- value: float¶
- color: str | None = None¶
- class textcharts.stacked_bar.StackedBarData(label, segments=<factory>, total=None)[source]¶
Bases:
objectStacked bar data for a single platform.
- Parameters:
label (str)
segments (list[StackedBarSegment])
total (float | None)
- label: str¶
- segments: list[StackedBarSegment]¶
- total: float | None = None¶
- class textcharts.stacked_bar.StackedBar(data, title=None, options=None, subtitle=None, metric_label='', value_formatter=None, subject=None)[source]¶
Bases:
ChartBaseStacked horizontal bar chart showing phase-level time decomposition.
Each bar represents a platform and the segments show time spent in each benchmark phase. Each phase uses a distinct fill character and color.
Example output:
` Phase Breakdown by Platform ────────────────────────────────────────────────────── DuckDB ░░▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██████ 12.4s Polars ░░░▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓████████████ 15.2s SQLite ░░░░▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓████████████████ 28.7s ────────────────────────────────────────────────────── ░ DataGen ▒ Load ▓ Power █ Throughput `- Parameters:
data (Sequence[StackedBarData])
title (str | None)
options (ChartOptions | None)
subtitle (str | None)
metric_label (str)
value_formatter (Callable[[float], str] | None)
subject (str | None)
- textcharts.stacked_bar.from_data(data, title=None, options=None, subject=None)[source]¶
Create StackedBar from phase breakdown data.
- Parameters:
data (Sequence[StackedBarData]) – Sequence of StackedBarData instances.
title (str | None) – Optional chart title.
options (ChartOptions | None) – Chart rendering options.
subject (str | None) – Domain noun phrase prepended to default title.
- Returns:
Configured StackedBar instance.
- Return type:
Distribution charts¶
ASCII vertical bar histogram for frequency distribution visualization.
- class textcharts.histogram.HistogramBar(label, value, platform=None, error=None, is_best=False, is_worst=False)[source]¶
Bases:
objectData for a single histogram bar.
- Parameters:
label (str)
value (float)
platform (str | None)
error (float | None)
is_best (bool)
is_worst (bool)
- label: str¶
- value: float¶
- platform: str | None = None¶
- error: float | None = None¶
- is_best: bool = False¶
- is_worst: bool = False¶
- class textcharts.histogram.Histogram(data, title=None, y_label='Value', sort_by='label', max_per_chart=33, show_mean_line=True, options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseVertical bar histogram for frequency distribution visualization.
- Parameters:
data (Sequence[HistogramBar])
title (str | None)
y_label (str)
sort_by (str)
max_per_chart (int)
show_mean_line (bool)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- DEFAULT_MAX_BARS = 33¶
- textcharts.histogram.from_data(data, title=None, y_label='Value', sort_by='label', max_per_chart=33, show_mean_line=True, options=None, subject=None)[source]¶
Create Histogram from objects with label/value attributes.
- Parameters:
data (Sequence)
title (str | None)
y_label (str)
sort_by (str)
max_per_chart (int)
show_mean_line (bool)
options (ChartOptions | None)
subject (str | None)
- Return type:
ASCII box plot for distribution visualization.
- class textcharts.box_plot.BoxPlotStats(min_val, q1, median, q3, max_val, mean, std, outliers)[source]¶
Bases:
objectComputed statistics for a box plot.
- Parameters:
min_val (float)
q1 (float)
median (float)
q3 (float)
max_val (float)
mean (float)
std (float)
outliers (list[float])
- min_val: float¶
- q1: float¶
- median: float¶
- q3: float¶
- max_val: float¶
- mean: float¶
- std: float¶
- outliers: list[float]¶
- textcharts.box_plot.compute_quartiles(values)[source]¶
Compute box plot statistics from a sequence of values.
- Parameters:
values (Sequence[float])
- Return type:
- class textcharts.box_plot.BoxPlotSeries(name, values)[source]¶
Bases:
objectData series for box plot.
- Parameters:
name (str)
values (Sequence[float])
- name: str¶
- values: Sequence[float]¶
- class textcharts.box_plot.BoxPlot(series, title=None, y_label='Value', show_stats=True, show_mean=True, options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseASCII box plot for showing distributions.
- Parameters:
series (Sequence[BoxPlotSeries])
title (str | None)
y_label (str)
show_stats (bool)
show_mean (bool)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- BOX_TOP = '┬'¶
- BOX_BOTTOM = '┴'¶
- BOX_LEFT = '├'¶
- BOX_RIGHT = '┤'¶
- WHISKER_H = '─'¶
- WHISKER_V_TOP = '╷'¶
- WHISKER_V_BOTTOM = '╵'¶
- MEDIAN_LINE = '│'¶
- OUTLIER = 'o'¶
- textcharts.box_plot.from_series(series, title=None, y_label='Value', show_stats=True, show_mean=True, options=None, subject=None)[source]¶
Create BoxPlot from objects with name/values attributes.
- Parameters:
series (Sequence)
title (str | None)
y_label (str)
show_stats (bool)
show_mean (bool)
options (ChartOptions | None)
subject (str | None)
- Return type:
ASCII percentile ladder chart for tail-latency visualization.
- class textcharts.percentile_ladder.PercentileData(name, p50, p90, p95, p99)[source]¶
Bases:
objectPercentile latency data for a single platform.
- Parameters:
name (str)
p50 (float)
p90 (float)
p95 (float)
p99 (float)
- name: str¶
- p50: float¶
- p90: float¶
- p95: float¶
- p99: float¶
- textcharts.percentile_ladder.compute_percentile(values, p)[source]¶
Compute the p-th percentile using linear interpolation.
- Parameters:
values (Sequence[float]) – Sequence of numeric values (will be sorted internally).
p (float) – Percentile in range [0, 100].
- Returns:
Interpolated percentile value.
- Return type:
float
- class textcharts.percentile_ladder.PercentileLadder(data, title=None, metric_label='', options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseASCII percentile ladder chart showing P50/P90/P95/P99 latency bands.
Each platform gets a single row with layered horizontal bar segments where each percentile extends further right, creating a “ladder” appearance.
Example output:
` Percentile Latency by Platform (ms) ──────────────────────────────────────────────────────── DuckDB ░░░░░░░░░▒▒▒▒▒▓▓██ 12 | 45 | 78 | 120 Polars ░░░░░░░░░░▒▒▒▒▒▒▓▓▓▓██████ 15 | 52 | 95 | 310 ──────────────────────────────────────────────────────── ░ P50 ▒ P90 ▓ P95 █ P99 `- Parameters:
data (Sequence[PercentileData])
title (str | None)
metric_label (str)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- BAND_COLORS = ('#1b9e77', '#e6ab02', '#d95f02', '#e7298a')¶
- textcharts.percentile_ladder.from_series(platform_queries, title=None, metric_label='ms', options=None, subject=None)[source]¶
Create PercentileLadder from raw query timing data.
- Parameters:
platform_queries (Sequence[tuple[str, Sequence[float]]]) – Sequence of (platform_name, query_times) tuples.
title (str | None) – Optional chart title.
metric_label (str) – Unit label for values.
options (ChartOptions | None) – Chart rendering options.
subject (str | None)
- Returns:
Configured PercentileLadder instance.
- Return type:
ASCII CDF (Cumulative Distribution Function) chart for latency distribution.
- class textcharts.cdf_chart.CDFSeriesData(name, values)[source]¶
Bases:
objectCDF series data for a single platform.
- Parameters:
name (str)
values (list[float])
- name: str¶
- values: list[float]¶
- class textcharts.cdf_chart.CDFChart(data, title=None, x_label='Value', y_label='Cumulative Share', height=15, options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseCDF chart showing cumulative distribution of query latency.
- Parameters:
data (Sequence[CDFSeriesData])
title (str | None)
x_label (str)
y_label (str)
height (int)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- PLOT_HEIGHT = 15¶
- textcharts.cdf_chart.from_series(platform_queries, title=None, x_label='Value', y_label='Cumulative Share', options=None, subject=None)[source]¶
Create CDFChart from raw query timing data.
- Parameters:
platform_queries (Sequence[tuple[str, Sequence[float]]]) – Sequence of (platform_name, query_times) tuples.
title (str | None) – Optional chart title.
options (ChartOptions | None) – Chart rendering options.
x_label (str)
y_label (str)
subject (str | None)
- Returns:
Configured CDFChart instance.
- Return type:
Trend and relationship charts¶
ASCII line chart for time series visualization.
- class textcharts.line_chart.LinePoint(series, x, y, label=None)[source]¶
Bases:
objectData point for line chart.
- Parameters:
series (str)
x (float | str)
y (float)
label (str | None)
- series: str¶
- x: float | str¶
- y: float¶
- label: str | None = None¶
- class textcharts.line_chart.LineChart(points, title=None, x_label='X', y_label='Y', show_trend=False, options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseASCII line chart for time series and trend visualization.
- Parameters:
points (Sequence[LinePoint])
title (str | None)
x_label (str)
y_label (str)
show_trend (bool)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- MARKERS = ['*', '+', 'o', 'x', '^', 'v', '#', '@']¶
- textcharts.line_chart.from_points(points, title=None, x_label='Run', y_label='Y', show_trend=False, options=None, subject=None)[source]¶
Create LineChart from objects with series/x/y attributes.
- Parameters:
points (Sequence)
title (str | None)
x_label (str)
y_label (str)
show_trend (bool)
options (ChartOptions | None)
subject (str | None)
- Return type:
ASCII scatter plot for two-dimensional data.
- class textcharts.scatter_plot.ScatterPoint(name, x, y, is_pareto=False)[source]¶
Bases:
objectData point for scatter plot.
- Parameters:
name (str)
x (float)
y (float)
is_pareto (bool)
- name: str¶
- x: float¶
- y: float¶
- is_pareto: bool = False¶
- class textcharts.scatter_plot.ScatterPlot(points, title=None, x_label='X', y_label='Y', show_pareto=True, options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseASCII scatter plot for two-dimensional data visualization.
- Parameters:
points (Sequence[ScatterPoint])
title (str | None)
x_label (str)
y_label (str)
show_pareto (bool)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- MARKERS = ('*', '+', 'o', 'x', '^', 'v', '#', '@')¶
- MARKER_FRONTIER = '─'¶
- textcharts.scatter_plot.from_points(points, title=None, x_label='X', y_label='Y', show_pareto=True, options=None, subject=None)[source]¶
Create ScatterPlot from objects with name/x/y attributes.
- Parameters:
points (Sequence)
title (str | None)
x_label (str)
y_label (str)
show_pareto (bool)
options (ChartOptions | None)
subject (str | None)
- Return type:
ASCII normalized speedup chart showing relative performance vs a baseline.
- class textcharts.normalized_speedup.SpeedupData(name, ratio, is_baseline=False)[source]¶
Bases:
objectNormalized speedup data for a single platform.
- Parameters:
name (str)
ratio (float)
is_baseline (bool)
- name: str¶
- ratio: float¶
- is_baseline: bool = False¶
- class textcharts.normalized_speedup.NormalizedSpeedup(data, title=None, baseline_name=None, options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseNormalized speedup chart showing platform performance relative to a baseline.
- Parameters:
data (Sequence[SpeedupData])
title (str | None)
baseline_name (str | None)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- textcharts.normalized_speedup.from_ratios(platform_times, baseline=None, title=None, options=None, subject=None)[source]¶
Create NormalizedSpeedup from platform timing data.
- Parameters:
platform_times (Sequence[tuple[str, float]]) – Sequence of (platform_name, total_time_ms) tuples.
baseline (str | None) – Name of baseline platform, or “slowest”/”fastest” for auto-selection.
title (str | None) – Optional chart title.
options (ChartOptions | None) – Chart rendering options.
subject (str | None)
- Returns:
Configured NormalizedSpeedup instance.
- Return type:
Tabular and matrix charts¶
ASCII heatmap for query x platform comparison.
- class textcharts.heatmap.Heatmap(matrix, row_labels, col_labels, title=None, value_label='', x_label='Columns', show_values=True, color_scheme='diverging', options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseASCII heatmap showing query execution times across platforms.
- Parameters:
matrix (Sequence[Sequence[float | None]])
row_labels (Sequence[str])
col_labels (Sequence[str])
title (str | None)
value_label (str)
x_label (str)
show_values (bool)
color_scheme (str)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- COLOR_SCALE_SEQUENTIAL = ['#1b9e77', '#66a61e', '#e6ab02', '#d95f02', '#e7298a']¶
- COLOR_SCALE_DIVERGING = ['#2166ac', '#67a9cf', '#f7f7f7', '#ef8a62', '#b2182b']¶
- BG_SCALE_SEQUENTIAL = ['#1b9e77', '#66a61e', '#e6ab02', '#d95f02', '#e7298a']¶
- FG_ON_BG_SEQUENTIAL = ['#000000', '#000000', '#000000', '#000000', '#ffffff']¶
- BG_SCALE_DIVERGING = ['#4393c3', '#92c5de', '#d1e5f0', '#fdb863', '#d6604d']¶
- FG_ON_BG = ['#000000', '#000000', '#000000', '#000000', '#ffffff']¶
- textcharts.heatmap.from_matrix(matrix, queries, platforms, title=None, value_label='', x_label='Platform', show_values=True, color_scheme='diverging', options=None, subject=None)[source]¶
Create Heatmap from matrix data (compatible with QueryHeatmap).
- Parameters:
matrix (Sequence[Sequence[float]])
queries (Sequence[str])
platforms (Sequence[str])
title (str | None)
value_label (str)
x_label (str)
show_values (bool)
color_scheme (str)
options (ChartOptions | None)
subject (str | None)
- Return type:
ASCII rank table chart for competitive ranking.
- class textcharts.rank_table.RankTableData(items, groups, values)[source]¶
Bases:
objectData for a rank table chart.
- Parameters:
items (list[str])
groups (list[str])
values (dict[tuple[str, str], float])
- items: list[str]¶
- groups: list[str]¶
- values: dict[tuple[str, str], float]¶
- class textcharts.rank_table.RankTable(data, title=None, options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseRank table showing per-item competitive rankings across groups.
Each cell shows the ordinal rank (1st, 2nd, 3rd…) of each platform for each query, with aggregate win/loss tallies and geometric mean rank.
Example output:
` Query Rankings (1st = fastest) ────────────────────────────────────── Query DuckDB Polars SQLite Pandas Q1 1st 2nd 3rd 4th Q2 2nd 1st 3rd 4th ────────────────────────────────────── 1st wins 15 5 2 0 GeoRank 1.2 1.8 2.8 3.9 `- Parameters:
data (RankTableData)
title (str | None)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- textcharts.rank_table.from_matrix(matrix, items, groups, title=None, options=None, subject=None)[source]¶
Create RankTable from the same matrix format as Heatmap.
- Parameters:
matrix (Sequence[Sequence[float]]) – 2D matrix of numeric values [item_idx][group_idx].
items (Sequence[str]) – Item labels (row labels).
groups (Sequence[str]) – Group labels (column labels).
title (str | None) – Optional chart title.
options (ChartOptions | None) – Chart rendering options.
subject (str | None)
- Returns:
Configured RankTable instance.
- Return type:
ASCII sparkline table for compact multi-metric comparison.
- class textcharts.sparkline_table.SparklineColumn(name, values, higher_is_better=False)[source]¶
Bases:
objectA single metric column in the sparkline table.
- Parameters:
name (str)
values (dict[str, float])
higher_is_better (bool)
- name: str¶
- values: dict[str, float]¶
- higher_is_better: bool = False¶
- class textcharts.sparkline_table.SparklineTableData(rows, columns=<factory>)[source]¶
Bases:
objectComplete data for a sparkline table.
- Parameters:
rows (list[str])
columns (list[SparklineColumn])
- rows: list[str]¶
- columns: list[SparklineColumn]¶
- class textcharts.sparkline_table.SparklineTable(data, title=None, options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseSparkline table showing compact multi-metric comparison.
Each row is an entry, each column is a metric with an inline sparkline bar showing the relative value. Best values are highlighted.
Example output:
` Comparison Overview ────────────────────────────────────────────────────────────── Row Total(ms) GeoMean P99(ms) Load(s) Success DuckDB ▇ 1,240 ▇ 56 ▅ 120 ▂ 2.1 ████ 100% Polars ▆ 1,580 ▆ 72 ▇ 310 ▁ 1.2 ████ 100% SQLite ▃ 4,820 ▃ 219 ▃ 450 ▅ 8.4 ███░ 95% `- Parameters:
data (SparklineTableData)
title (str | None)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)
- textcharts.sparkline_table.from_data(rows, metrics, title=None, options=None, subject=None)[source]¶
Create SparklineTable from metric data.
- Parameters:
rows (list[str]) – List of row names.
metrics (list[tuple[str, dict[str, float], bool]]) – List of (metric_name, {row: value}, higher_is_better) tuples.
title (str | None) – Optional chart title.
options (ChartOptions | None) – Chart rendering options.
subject (str | None)
- Returns:
Configured SparklineTable instance.
- Return type:
ASCII summary box renderer for aggregate statistics.
- class textcharts.summary_box.SummaryStats(title='Summary', primary_value=None, secondary_value=None, total_value=None, primary_baseline=None, primary_comparison=None, total_baseline=None, total_comparison=None, baseline_name='Baseline', comparison_name='Comparison', num_items=0, num_improved=0, num_stable=0, num_regressed=0, best_items=<factory>, worst_items=<factory>, primary_label='Primary', secondary_label='Secondary', total_label='Total', count_label='Items', metric_label='ms', value_formatter=None, lower_is_better=True, environment=None, platform_config=None)[source]¶
Bases:
objectAggregate statistics for a summary box.
For single-run summaries, only the primary fields are used. For comparison summaries, both baseline and comparison fields are used.
- Parameters:
title (str)
primary_value (float | None)
secondary_value (float | None)
total_value (float | None)
primary_baseline (float | None)
primary_comparison (float | None)
total_baseline (float | None)
total_comparison (float | None)
baseline_name (str)
comparison_name (str)
num_items (int)
num_improved (int)
num_stable (int)
num_regressed (int)
best_items (list[tuple[str, float]])
worst_items (list[tuple[str, float]])
primary_label (str)
secondary_label (str)
total_label (str)
count_label (str)
metric_label (str)
value_formatter (Callable[[float], str] | None)
lower_is_better (bool)
environment (dict[str, str] | None)
platform_config (dict[str, str] | None)
- title: str = 'Summary'¶
- primary_value: float | None = None¶
- secondary_value: float | None = None¶
- total_value: float | None = None¶
- primary_baseline: float | None = None¶
- primary_comparison: float | None = None¶
- total_baseline: float | None = None¶
- total_comparison: float | None = None¶
- baseline_name: str = 'Baseline'¶
- comparison_name: str = 'Comparison'¶
- num_items: int = 0¶
- num_improved: int = 0¶
- num_stable: int = 0¶
- num_regressed: int = 0¶
- best_items: list[tuple[str, float]]¶
- worst_items: list[tuple[str, float]]¶
- primary_label: str = 'Primary'¶
- secondary_label: str = 'Secondary'¶
- total_label: str = 'Total'¶
- count_label: str = 'Items'¶
- metric_label: str = 'ms'¶
- value_formatter: Callable[[float], str] | None = None¶
- lower_is_better: bool = True¶
- environment: dict[str, str] | None = None¶
- platform_config: dict[str, str] | None = None¶
- property is_comparison: bool¶
Whether this is a comparison summary (two runs).
- class textcharts.summary_box.SummaryBox(stats, options=None, subtitle=None, subject=None)[source]¶
Bases:
ChartBaseBordered summary panel with aggregate statistics.
Displays key metrics in a box-drawing bordered panel. Supports both single-run and comparison summaries.
Example output:
` ┌──────────────────────────────────────┐ │ Summary │ ├──────────────────────────────────────┤ │ Primary: 142.3ms → 98.7ms -30.6% │ │ Total: 3.2s → 2.1s -34.4% │ ├──────────────────────────────────────┤ │ 5 improved 12 stable 5 regressed │ ├──────────────────────────────────────┤ │ Best: Q6 (-57.2%), Q14 (-38.1%) │ │ Worst: Q21 (+726%), Q17 (+23.4%) │ └──────────────────────────────────────┘ `- Parameters:
stats (SummaryStats)
options (ChartOptions | None)
subtitle (str | None)
subject (str | None)