Lightweight native SVG charting library for MoonBit — bar, line, pie/donut and scatter charts.
These images are real SVG output from the library. See examples/interactive.html for a live, in-browser demo.
moon add Xpeng/moonchartsimport {
"Xpeng/mooncharts",
}///|
test {
let svg = @mooncharts.bar_chart(
[("Q1", 12.0), ("Q2", 19.0), ("Q3", 8.0), ("Q4", 15.0)],
title="Quarterly Revenue",
)
// `svg` is a complete, standalone SVG document string.
inspect(svg.has_prefix("<svg"), content="true")
inspect(svg.contains("Quarterly Revenue"), content="true")
}| Function | Data shape | Notes |
|---|---|---|
| bar_chart | Array[(String, Double)] | vertical bars with value + category labels |
| line_chart | Array[(Double, Double)] | XY line with point markers |
| area_chart | Array[(Double, Double)] | line with the region beneath it filled |
| pie_chart | Array[(String, Double)] | pie, or donut via donut=0.0..1.0 |
| scatter_chart | Array[(Double, Double)] | XY scatter, configurable point radius |
| line_chart_multi | Array[(String, Array[(Double, Double)])] | several named line series + legend |
| bar_chart_grouped | Array[String], Array[(String, Array[Double])] | grouped bars per category + legend |
| bar_chart_stacked | Array[String], Array[(String, Array[Double])] | stacked bars per category + legend |
| bar_chart_horizontal | Array[(String, Double)] | sideways bars with left-hand category labels |
| radar_chart | Array[String], Array[(String, Array[Double])] | spider chart, one filled polygon per series |
| histogram | Array[Double] | raw samples binned into bins? equal-width bars |
| box_plot | Array[(String, Array[Double])] | quartile boxes, 1.5×IQR whiskers, outlier dots |
| area_chart_stacked | Array[Double], Array[(String, Array[Double])] | accumulated area layers + legend |
| heatmap | Array[String], Array[String], Array[Array[Double]] | color-scaled matrix cells with value labels |
| candlestick_chart | Array[(String, Double, Double, Double, Double)] | OHLC candles, rising/falling colors |
| waterfall_chart | Array[(String, Double)] | signed deltas accumulate, connectors + total bar |
| bubble_chart | Array[(Double, Double, Double)] | XY dots with area-true size scaling |
| Benchmark | wasm-gc | js |
|---|---|---|
| pie_chart, 6 slices | 17.7 µs | 11.9 µs |
| bar_chart, 6 bars | 24.3 µs | 15.8 µs |
| line_chart, 100 points | 94.9 µs | 62.3 µs |
| heatmap, 10×10 | 211 µs | 138 µs |
| line_chart, 1000 points | 1.12 ms | 0.55 ms |
///|
test {
let dark = @mooncharts.bar_chart(
[("Q1", 12.0), ("Q2", 19.0)],
theme=@mooncharts.Theme::dark(),
)
inspect(dark.contains("#1e1e2e"), content="true") // dark background
let custom = @mooncharts.Theme::light().with_palette(["#ff5733", "#33c1ff"])
let svg = @mooncharts.bar_chart([("A", 1.0), ("B", 2.0)], theme=custom)
inspect(svg.contains("#ff5733"), content="true")
}moon run cmd/main > gallery.html
# then open gallery.html in your browsermoon build --target js --release
cp _build/js/release/build/web/web.js examples/mooncharts.jspub(all) struct Theme {
palette : Array[String]
background : String
grid : String
axis : String
text : String
title : String
}fn document(width : Double, height : Double, body : String) -> Stringfn escape(s : String) -> Stringfn format_si(x : Double) -> Stringtest {
inspect(@mooncharts.format_si(1200.0), content="1.2k")
inspect(@mooncharts.format_si(3400000.0), content="3.4M")
inspect(@mooncharts.format_si(-52000.0), content="-52k")
inspect(@mooncharts.format_si(42.0), content="42")
}test {
inspect(@mooncharts.mean([1.0, 2.0, 3.0, 4.0]), content="2.5")
}test {
inspect(@mooncharts.median([3.0, 1.0, 2.0]), content="2")
inspect(@mooncharts.median([4.0, 1.0, 3.0, 2.0]), content="2.5")
}fn num(x : Double) -> Stringtest {
let (q1, m, q3) = @mooncharts.quartiles([
1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,
])
inspect(q1, content="2.5")
inspect(m, content="5")
inspect(q3, content="7.5")
}Lightweight native SVG charting library for MoonBit — bar, line, pie/donut and scatter charts.