Interactive D3.js visualizations from Python. Same engine as R-myIO.
Scatter, line, bar, area, histogram, donut, gauge, treemap, hexbin, heatmap, candlestick, waterfall, sankey, boxplot, violin, ridgeline, regression, Q-Q, lollipop, dumbbell, waffle, beeswarm, bump, radar, funnel, calendar heatmap, sparklines, small multiples.
Built-in CI bands, mean ± CI error bars, OLS / polynomial regression, residuals, Q-Q quantiles. Pure Python — no scipy required.
Brush to select, click to annotate, link charts with link_charts(), and add parameter sliders. Events flow back to Python via traitlets.
Same vendored myIOapi.js as R-myIO. Same JSON config. Same renders. One source of truth, two language wrappers.
Click a point to add a label.
Brush points in the left chart to highlight matching rows in the right.
Statistical transforms and composite expansions still pending. All other tabs render against the live d3 engine.
Composite expansion still emits transform=survfit which renders the line layer but expects per-row Greenwood SE fields the engine doesn't synthesize.
Composite still emits transform=fit_distribution on the line layer; needs the equivalent of R's composite_histogram_fit to bin + scale.
Bracket renderer needs the pairwise_test transform output in a specific shape; composite expansion not yet ported.
rangeBar requires low_y/high_y at validation time, but the R-parity {x_var, y_var} call relies on the mean_ci transform to synthesize the band. Required-mapping check needs to be transform-aware.