Plottr — animated, strictly-typed graphs for your GUIs 
Plottr is an open-source graph rendering library for Roblox. Give it any GuiObject and some data, and it draws a clean, animated, interactive chart, no UI framework dependencies, no assets to import, just Luau.
Lines are rendered as antialiased Path2D strokes that draw themselves in like a pen, bars grow out of the axis, and a gradient infill rises in the pen’s wake. Everything re-renders automatically when your data, config, or container size changes, and for live data you can stream values straight into the chart.
-
Docs & API reference: Plottr -
Wally: Plottr = "alternativelua/plottr@0.1.1"
Features
-
Line charts — antialiased
Path2Dstrokes (auto-segmented so long paths never hit the engine’s control point limit) -
Bar charts — rounded bars growing from the baseline, grouped automatically per slot
-
Mixed series — combine lines and bars in one chart, with an automatic legend
-
Animated entries — pen-stroke line reveal, staggered marker pop-ins, growing bars and fill, all on one synced timeline; duration, easing, and stagger are configurable, or turn animation off entirely
-
Gradient infill — the area under a line fades toward the baseline; configurable per graph or per series
-
Curve smoothing — optional monotone cubic interpolation that passes through every data point and never overshoots (no fake peaks)
-
Hover tooltips — points and bars show formatted values on hover
-
Realtime streaming —
graph:push(series, value)appends and redraws instantly (no animation replay), with amaxPointswindow that scrolls old values off; multiple pushes per frame coalesce into one redraw -
Dashboards —
Plottr.newGrouplays out multiple graphs in a resizable grid -
Themes —
Dark,Light, andMidnightpresets, plusThemes.extendfor custom palettes; swap live withsetTheme -
Smart axes — “nice” tick values (1/2/5 steps), abbreviated labels (
1.5k,2.3M), custom x-axis labels, optional zero baseline, configurable grid and padding -
Reactive — re-renders (animated) on data/config changes and redraws instantly on container resize
-
Strictly typed —
--!strictthroughout with exported types for every config table; great autocomplete in Studio -
Modular & zero-dependency — small single-purpose modules; adding a new chart kind is just another renderer
Quick start
local Plottr = require(ReplicatedStorage.Plottr)
local graph = Plottr.new(containerFrame, {
theme = Plottr.Themes.Midnight,
smoothing = { enabled = true },
xLabels = { "Jan", "Feb", "Mar", "Apr", "May", "Jun" },
})
graph:setSeries({
{ name = "Revenue", values = { 4200, 5100, 4800, 6900, 8400, 9600 } },
{ name = "Costs", values = { 3100, 3300, 3600, 4100, 4400, 4900 }, kind = "bar" },
})
Realtime data
local live = Plottr.new(containerFrame, { maxPoints = 40, showPoints = false })
live:setSeries({ { name = "CPU %", values = {} } })
task.spawn(function()
while task.wait(0.2) do
live:push("CPU %", getCpuSample())
end
end)
Dashboards
local group = Plottr.newGroup(containerFrame, { columns = 2, spacing = 12 })
local monthly = group:addGraph("Monthly", { xLabels = months })
local live = group:addGraph("Live", { maxPoints = 40 })
Installation
Wally (recommended):
[dependencies]
Plottr = "alternativelua/plottr@0.1.1"
Manual: grab the source from GitHub and drop src into your project (e.g. as ReplicatedStorage.Plottr).
Credits
Inspired by boatbeaker’s GraphModule. MIT licensed.
Feedback, bug reports, and PRs are very welcome. What should Plottr support next, let me know below! ![]()