Examples
Horizon Chart
from rich.console import Console
from graphical.bar import Bar
from graphical.data import bands
from graphical.group import Horizontal, Vertical
from graphical.scale.chromatic.sequential import GREENS
from data import data_horizon as data_sets
levels = 4
colors = GREENS.palette(levels)
value_range = (
min(d for data in data_sets for d in data),
max(d for data in data_sets for d in data),
)
graph = Vertical(gap=1)
for data in data_sets:
horizon = Horizontal()
for level, value in bands(data, levels):
horizon.append(
Bar(
value if level < levels else 0.0,
(0, 1),
length=9,
orientation="vertical",
color=colors[level] if level < levels else None,
bgcolor=colors[level - 1] if level > 0 else None,
)
)
graph.append(horizon)
console = Console()
console.print(graph)
Gantt Chart
from rich.console import Console
from graphical.bar import RangeStack
from graphical.group import Vertical
from data import data_gantt as data
graph = Vertical(gap=1)
for start, stop, progress in data:
length = stop - start
graph.append(
RangeStack(
(start, length * progress, length * (1.0 - progress)),
(0, 1),
orientation="horizontal",
colors=["purple", "red"],
)
)
console = Console()
console.print(graph)
Stacked Bar
from rich.console import Console
from graphical.bar import Stack
from graphical.group import Horizontal
from data import data_stacked as data
max_sum = max(sum(d) for d in data)
graph = Horizontal(gap=1)
for d in data[:34]:
graph.append(
Stack(
d,
(0, max_sum),
orientation="vertical",
width=2,
length=15,
)
)
console = Console()
console.print(graph)
Stacked Area
from rich.console import Console
from graphical.bar import Stack
from graphical.group import Horizontal
from data import data_stacked as data
max_sum = max(sum(d) for d in data)
graph = Horizontal()
for d in data:
graph.append(
Stack(
d,
(0, max_sum),
orientation="vertical",
)
)
console = Console()
console.print(graph)
Streamgraph
from rich.console import Console
from graphical.bar import Stack
from graphical.group import Horizontal
from data import data_stacked as data
max_sum = max(sum(d) for d in data)
graph = Horizontal()
for d in data:
offset = (max_sum - sum(d)) / 2.0
graph.append(
Stack(
d,
(-offset, -offset + max_sum),
orientation="vertical",
)
)
console = Console()
console.print(graph)
Heatmap
from rich.console import Console
from graphical.group import Horizontal, Vertical
from graphical.heat import Heat
from graphical.scale.chromatic.sequential import VIRIDIS
from data import data_heatmap as data
value_range = (
min(min(d) for d in data),
max(max(d) for d in data),
)
graph = Vertical()
for data_line in data:
line = Horizontal()
for entry in data_line:
line.append(
Heat(
data=entry,
value_range=value_range,
scheme=VIRIDIS,
repeat_x=4,
repeat_y=2,
)
)
graph.append(line)
console = Console()
console.print(graph)
Calendar Heatmap
from rich.console import Console
from random import random
from calendar import Calendar
from rich.text import Text
from graphical.group import Horizontal, Vertical
from graphical.heat import Heat
from graphical.scale.chromatic.sequential import GREENS
def week_calendar(year: int, pivot: bool = True):
result = []
for month_row in Calendar(firstweekday=6).yeardatescalendar(year, width=1):
for week in month_row[0]:
if week not in result:
result.append([d if d.year == year else None for d in week])
return list(zip(*result)) if pivot else result
weekday_labels = [None, "Mon ", None, "Wed ", None, "Fri ", None]
weekday_graphs = Vertical()
for weekday, weeks in enumerate(week_calendar(2026)):
line = Horizontal()
line.append(Text(weekday_labels[weekday] or " " * 4))
for day in weeks:
if day is None:
line.append(Text(" "))
else:
line.append(
Heat(
data=random(),
value_range=(0, 1),
scheme=GREENS,
repeat_x=2,
)
)
weekday_graphs.append(line)
console = Console()
console.print(weekday_graphs)
Density
from rich.console import Console
from graphical.data import pairs
from graphical.group import Horizontal, Vertical
from graphical.heat import Heat
from graphical.scale.chromatic.sequential import VIRIDIS
from data import data_density as data
value_range = (min(min(d) for d in data), max(max(d) for d in data))
graph = Vertical()
for pair in pairs(data):
line = Horizontal()
for entries in zip(*pair):
line.append(
Heat(
data=entries,
value_range=value_range,
scheme=VIRIDIS,
orientation="vertical",
)
)
graph.append(line)
console = Console()
console.print(graph)
Ridgeline
from rich.console import Console
from graphical.bar import Bar
from graphical.group import Horizontal
from graphical.layer import Layers
from graphical.offset import Offset
from graphical.scale.chromatic.sequential import VIRIDIS
from data import data_ridgeline as data
value_range = (0, max(max(d) for d in data))
colors = VIRIDIS.palette(10)
graph = Layers()
for idx, line_data in enumerate(data):
line = Horizontal()
for value in line_data:
line.append(
Bar(
value,
value_range,
length=5,
color=colors[idx],
orientation="vertical",
)
)
graph.append(Offset(line, 0, idx * 2))
console = Console()
console.print(graph)