Examples¶
Basic Charts¶
Line Chart — Multi-Series with Annotations¶
fig = (
Figure(width=760, height=460)
.set_title("Monthly Revenue vs Operating Costs (2024)")
.set_xlabel("Month").set_ylabel("USD ($M)")
.add(LineSeries(months, revenue, color="#2563eb", label="Revenue", width=3))
.add(LineSeries(months, costs, color="#dc2626", label="Costs", linestyle="dashed"))
.set_legend("top-left")
.annotate("Peak Revenue", x="Dec", y=3.00, arrow=True, color="#2563eb")
.tight_layout()
)
fig.show()
Scatter with Colormap Encoding¶
ScatterSeries(x, y, c=z_values, cmap="viridis", size=7)
Histogram — Bimodal Distribution¶
import numpy as np
data = np.concatenate([np.random.normal(50,8,400), np.random.normal(78,6,200)])
Figure().add(HistogramSeries(data.tolist(), bins=28, color="#0891b2")).show()
Pie and Donut Charts¶
Heatmap — Correlation Matrix¶
Box Plot — Multi-Group¶
New 2-D Chart Types¶
Bubble Chart¶
from glyphx.bubble import BubbleSeries
fig = Figure().set_title("Market Cap vs Growth Rate")
fig.add(BubbleSeries(x, y, sizes=market_cap, c=growth_rate,
cmap="plasma", label="Companies"))
fig.show()
Sunburst Chart¶
from glyphx.sunburst import SunburstSeries
fig = Figure(width=600, height=600).set_title("Org Revenue Breakdown")
fig.add(SunburstSeries(
labels=["Total", "EMEA", "APAC", "Americas",
"UK", "DE", "JP", "AU", "US", "CA"],
parents=["", "Total","Total","Total",
"EMEA","EMEA","APAC","APAC","Americas","Americas"],
values= [0, 0, 0, 0,
420, 310, 280, 190, 850, 320],
))
fig.show()
Parallel Coordinates¶
from glyphx.parallel_coords import ParallelCoordinatesSeries
fig = Figure(width=900, height=500).set_title("Iris Dataset")
fig.add(ParallelCoordinatesSeries(
data=df[["sepal_length","sepal_width","petal_length","petal_width"]],
labels=df["species"],
cmap="viridis",
))
fig.show()
Diverging Bar Chart¶
from glyphx.diverging_bar import DivergingBarSeries
fig = Figure().set_title("YoY Growth by Region")
fig.add(DivergingBarSeries(
categories=["North","South","East","West","Central"],
values= [ 12, -8, 21, -3, 15],
color_pos="#2563eb",
color_neg="#dc2626",
))
fig.show()
3-D Charts¶
3-D Scatter¶
from glyphx import Figure3D
from glyphx.scatter3d import Scatter3DSeries
import numpy as np
rng = np.random.default_rng(42)
xs = rng.normal(0, 1, 500)
ys = rng.normal(0, 1, 500)
zs = np.sin(xs) + np.cos(ys)
fig = Figure3D(title="Gaussian Scatter", theme="dark",
azimuth=45, elevation=25)
fig.add(Scatter3DSeries(xs, ys, zs, c=zs, cmap="plasma", size=4))
fig.show()
3-D Surface¶
from glyphx import Figure3D
from glyphx.surface3d import Surface3DSeries
import numpy as np
x = np.linspace(-3, 3, 80)
y = np.linspace(-3, 3, 80)
Z = np.sin(np.sqrt(x[None,:]**2 + y[:,None]**2))
fig = Figure3D(title="Sinc Surface", azimuth=30, elevation=35)
fig.add(Surface3DSeries(x, y, Z, cmap="viridis", wireframe=True))
fig.show()
3-D Line (Helix)¶
from glyphx import Figure3D
from glyphx.line3d import Line3DSeries
import numpy as np
t = np.linspace(0, 6 * np.pi, 1_000)
fig = Figure3D(title="Helix")
fig.add(Line3DSeries(np.cos(t), np.sin(t), t / (6 * np.pi),
color="#dc2626", width=2.5, label="Helix"))
fig.show()
Contour Plot¶
from glyphx import Figure3D
from glyphx.contour import ContourSeries
import numpy as np
x = np.linspace(-2, 2, 100)
y = np.linspace(-2, 2, 100)
Z = np.exp(-(x[None,:]**2 + y[:,None]**2))
fig = Figure3D(title="Gaussian Contour")
fig.add(ContourSeries(x, y, Z, levels=10, filled=True, cmap="coolwarm"))
fig.show()
Large-Data 3-D (auto-downsampled)¶
GlyphX automatically downsamples 3-D series; the render stays fast regardless of input size:
import numpy as np
from glyphx import Figure3D
from glyphx.scatter3d import Scatter3DSeries
rng = np.random.default_rng(0)
n = 500_000
xs, ys, zs = rng.uniform(0, 1, n), rng.uniform(0, 1, n), rng.uniform(0, 1, n)
fig = Figure3D(title="500k Points — auto-thinned")
s3 = Scatter3DSeries(xs, ys, zs, cmap="plasma")
fig.add(s3)
fig.render_svg()
print(s3.last_downsample_info)
# {'algorithm': 'voxel-3D', 'original_n': 500000, 'thinned_n': 4913}
Themes¶
Dark Theme¶
Figure(theme="dark")
Colorblind-Safe Theme¶
Figure(theme="colorblind") # Okabe-Ito palette
Line Styles¶
LineSeries(x, y, linestyle="solid")
LineSeries(x, y, linestyle="dashed")
LineSeries(x, y, linestyle="dotted")
LineSeries(x, y, linestyle="longdash")
Colormap Encoding¶
Layout¶
2×2 Subplot Grid¶
fig = Figure(rows=2, cols=2, width=800, height=580)
fig.add_axes(0,0).add_series(LineSeries(...))
fig.add_axes(0,1).add_series(BarSeries(...))
fig.add_axes(1,0).add_series(ScatterSeries(...))
fig.add_axes(1,1).add_series(HistogramSeries(...))
Dual Y-Axis¶
fig.add(LineSeries(x, prices, label="Price (left)"))
fig.add(BarSeries(x, volume, label="Volume (right)"), use_y2=True)
DataFrame Accessor¶
import glyphx # registers df.glyphx
# Basic
df.glyphx.bar(x="month", y="revenue", title="Monthly Revenue")
df.glyphx.bar(groupby="region", y="revenue", agg="sum")
# Hue splitting — one series per region, auto-colored
df.glyphx.bar(x="month", y="revenue", hue="region",
title="Revenue by Month and Region")
Statistical Charts¶
ECDF¶
from glyphx.ecdf import ECDFSeries
fig = (
Figure()
.add(ECDFSeries(ctrl.tolist(), color="#3b82f6", label="Control"))
.add(ECDFSeries(treat.tolist(), color="#ef4444", label="Treatment"))
)
Raincloud Plot¶
from glyphx.raincloud import RaincloudSeries
fig.add(RaincloudSeries(groups, categories=["Control","Low","High"], seed=42))
Significance Brackets¶
fig.add_stat_annotation("Control", "Drug A", p_value=0.0002)
fig.add_stat_annotation("Control", "Drug B", p_value=0.028, y_offset=32)
Financial Charts¶
Candlestick OHLC¶
Waterfall Bridge Chart¶
Treemap¶
Streaming Data¶
from glyphx.streaming import StreamingSeries
stream = StreamingSeries(max_points=120, color="#2563eb", label="Sensor A")
fig.add(stream)
with stream.live(fig, fps=10) as s:
for reading in sensor_generator():
s.push(reading)
Downsampling Examples¶
See also Large-Data Downsampling for the complete downsampling API reference.
Two-stage line pipeline (M4 + LTTB)¶
from glyphx.downsample import maybe_downsample_line
import numpy as np
x = np.linspace(0, 1, 2_000_000)
y = np.sin(x * 500) + np.random.normal(0, 0.1, len(x))
x_down, y_down = maybe_downsample_line(x, y, pixel_width=800)
print(f"{len(x):,} → {len(x_down):,} points")
Per-series threshold override¶
from glyphx import Figure
from glyphx.series import LineSeries
x = list(range(100_000))
y = [i**0.5 for i in x]
# Keep at most 500 points for this series
fig = Figure()
fig.add(LineSeries(x, y, label="sqrt(x)", threshold=500))
fig.show()
Inspect downsampling metadata¶
from glyphx import Figure
from glyphx.series import ScatterSeries
import numpy as np
rng = np.random.default_rng(0)
n = 50_000
sc = ScatterSeries(rng.uniform(0,1,n).tolist(),
rng.uniform(0,1,n).tolist())
Figure().add(sc).render_svg()
info = sc.last_downsample_info
print(f"Algorithm : {info['algorithm']}")
print(f"Original : {info['original_n']:,}")
print(f"Thinned : {info['thinned_n']:,}")