Every plot below is rasterized by plotui-core — the same Rust code that draws into your terminal — compiled to WebAssembly. Nothing here is a mock-up: the camera, the picking, the legends and the crosshair are the engine's own. Drag, zoom, hover.
from plotui import Plot
p = Plot()
p.add_scatter3d(xs_a, ys_a, zs_a, color=(236, 76, 134))
p.add_scatter3d(xs_b, ys_b, zs_b, color=(69, 200, 209))
p.add_scatter3d(xs_c, ys_c, zs_c, color=(240, 161, 60))
# drag events → p.rotate(dyaw, dpitch); hover → p.pick_px(...)
from plotui import Plot
p = Plot()
p.add_surface3d(xs, ys, zs, colormap="viridis")
# zs is a len(ys) × len(xs) grid of heights
p.add_surface3d(xs, ys, zs, colormap=None,
color=(103, 111, 118), wireframe=True)
from plotui import Plot
p = Plot()
p.add_graph3d(xs, ys, zs, edges=[(0, 1), (1, 2), ...],
color=(69, 200, 209))
hit = p.pick_element_px(w, h, mx, my, node_radius=8)
# hit → ("node", i) or ("edge", i); highlight via p.set_hovered(hit)
from plotui import Plot
p = Plot()
p.add_line3d(xs, ys, zs, color=(236, 76, 134),
width=1.5, name="lorenz")
# while dragging, plotui renders at reduced resolution —
# the same policy the terminal widget uses
from plotui import Plot
p = Plot()
p.add_line(xs, damped, name="damped")
p.add_line(xs, carrier, name="carrier")
p.add_scatter(sample_xs, sample_ys, name="samples")
p.set_hover2d(mouse_x) # engine draws the crosshair + readout
from plotui import Plot
p = Plot()
p.add_bar(months, totals, color=(69, 200, 209), name="total")
p.add_line(months, trend, color=(240, 161, 60), name="trend")