Skip to content

History

Revisions

  • Deep-dive accuracy: 11 NuGet (not 12), 96 symbols (verified), 4028/11 tests, At a Glance + Who Should Use + Key Differentiators fully updated for v1.3.0

    @xkqg xkqg committed Apr 16, 2026
    453a092
  • Accuracy sweep: 4028 tests across 11 projects (verified), Home.md shows only v1.3.x, 2 new NuGet packages highlighted, Bidirectional-SignalR deferred items resolved, Roadmap 3-D/MathText done

    @xkqg xkqg committed Apr 16, 2026
    be5ebf0
  • v1.3.0 docs: 61->67 series, 6 new 3D series docs+images, MathText v1.3.0 image, Avalonia/Uno in Getting-Started+Package-Map+Home

    @xkqg xkqg committed Apr 16, 2026
    3074361
  • v1.3.0 — Avalonia 12 + Uno controls, interaction polish, 3-D round 2, MathText completion

    @xkqg xkqg committed Apr 16, 2026
    29180cf
  • v1.2.2 — Package-Map AspNetCore section: ChartSessionOptions, ICallerPublisher, OnBrushSelect/OnHover hub methods, v1.2.2 quickstart

    @xkqg xkqg committed Apr 15, 2026
    40befc9
  • v1.2.2 — notification events (BrushSelectEvent + HoverEvent), first per-caller response, tier-2 FigureNotificationEvent stacked record

    @xkqg xkqg committed Apr 15, 2026
    0a53381
  • v1.2.1 — sync all sample figures from main repo (19 updated PNGs, 20 new SVGs, chart.pdf)

    @xkqg xkqg committed Apr 15, 2026
    d931cb6
  • v1.2.1 — update legend_outside.png/svg with ThemedFontProvider fix (was showing pre-fix clipped version)

    @xkqg xkqg committed Apr 15, 2026
    44c1a98
  • v1.2.1 — Bidirectional-SignalR page: note ThemedFontProvider legend refinement, bump test count to 3460

    @xkqg xkqg committed Apr 15, 2026
    6e98de5
  • v1.2.1 — ThemedFontProvider subsystem fix, zero warnings, home page pruned to 1.2.x window

    @xkqg xkqg committed Apr 15, 2026
    bc0b182
  • v1.2.1 — mark as in-progress, not yet released

    @xkqg xkqg committed Apr 15, 2026
    bd0b69e
  • v1.2.1 — split outside-legend clipping fix + CI warning sweep into its own entry

    @xkqg xkqg committed Apr 15, 2026
    56bcc62
  • v1.2.0 — outside-legend clipping fix (LegendMeasurer font drift) + 10 CI warning cleanups

    @xkqg xkqg committed Apr 15, 2026
    25cde2b
  • v1.2.0 — Bidirectional SignalR interactive charts: ChartHub round-trip, FigureRegistry channel pub/sub, stacked event hierarchy, WithServerInteraction fluent opt-in

    @xkqg xkqg committed Apr 15, 2026
    91c9705
  • Roadmap: rephrase v1.2.0+ sections around what we ship, not competitor catch-up Stripped comparative framing from the forward-plan sections so the roadmap describes the work itself rather than positioning it against other libraries. Functional content identical — same packages, same scope, same priority ordering (native desktop → realtime → polish).

    @xkqg xkqg committed Apr 15, 2026
    e502c84
  • Roadmap: v1.2.0+ forward-plan — Avalonia + Interactive.Controls, Realtime, Polish Added the future planned work at the top of the Planned section: - v1.2.0 "Modern Desktop" — MatPlotLibNet.Avalonia + MatPlotLibNet.Interactive.Controls (shared managed input layer: PanModifier / ZoomModifier / CursorModifier / RectangleSelectionModifier, matplotlib widgets.* API parity). WPF and WinForms deliberately skipped as legacy surfaces. - v1.2.1 / v1.2.2 "Reach" — MatPlotLibNet.Uno + MatPlotLibNet.WinUI, each ~100 LOC once the shared interaction layer exists. - v1.3.0 "Realtime" — IStreamingSeries + dirty-region incremental rendering, needs 1-2 design sessions first. - v1.4.0+ "Polish" — colormap designer, indicator fluent API, mplcursors-style crosshair, multi-page PDF, FuncAnimation equivalent, contour labels, geographic projections redesigned from scratch, imshow filters, symlog / unit-aware axis, .mplnet binary save. Positioning driven by the honest competitive analysis from the v1.1.4 wrap-up: MatPlotLibNet's differentiated niche is publication-grade headless rendering with matplotlib semantics served from Blazor / MAUI / notebooks / CI — and the Avalonia control is what converts that niche into an end-to-end developer story for modern cross-platform desktop.

    @xkqg xkqg committed Apr 15, 2026
    b3a7f23
  • v1.1.4 wrap-up quality release — wiki update Full refresh of the wiki for the v1.1.4 release. Summary of changes: - Home.md: rewritten v1.1.4 blurb framing the release as a wrap-up quality pass rather than a feature push. Highlights every major deliverable (Sankey overhaul, treemap drilldown, nested pie, label collision, outside legends, PlanarBar3D, SVG/PNG parity, Geo removal, bug fixes). Test counts updated to 3353/3353 + 146/146. Series count corrected 63 -> 61. - Chart-Types.md: Geo/Map section removed. New sections added for treemap drilldown, nested pie, and the rewritten Sankey (with all properties tabled and 6 sample references). Series count updated. - Advanced.md: Geo/Map section removed. New sections added for outside legends (with LegendMeasurer + dynamic clamp explanation), label collision avoidance (LabelLayoutEngine API), and Sankey hover emphasis. - Roadmap.md: new v1.1.4 wrap-up section at the top documenting the session's interactivity, Sankey, layout, and bug-fix work — fidelity 144/146 -> 146/146 and unit 3328/3329 -> 3353/3353, no tolerances relaxed. - Benchmarks.md: removed GeoMap and Choropleth benchmarks from the tables and run instructions (corresponding feature was removed in v1.1.4). - Package-Map.md: series count corrected 62 -> 61. - Fluent-Cheatsheet.md: new one-page reference for Plt / FigureBuilder / AxesBuilder covering entry points, subplot composition, layout engines, interactivity flags, all series families, per-series configure snippets, 3D camera + lighting, technical indicators, and copy-paste recipes. Linked from _Sidebar.md. - GeoProjections.md: deleted (feature removed). - _Sidebar.md: added Fluent Cheatsheet link, removed GeoProjections. - images/: 14 new PNG+SVG pairs added (accessibility_*, chart, legend_outside, nested_pie, 6 x sankey_*, treemap_drilldown, 3D scatter/surface) + the financial_dashboard.png refreshed from the v1.1.4 sample run.

    @xkqg xkqg committed Apr 15, 2026
    b5a53d8
  • Wiki: make gallery tiles clickable for full-resolution viewing

    @xkqg xkqg committed Apr 15, 2026
    4bd9bf6
  • v1.1.4 deep-dive round: PlanarBar3DSeries + SVG/PNG parity + sticky-clamp + uniform ticks Home.md / Roadmap.md / Chart-Types.md / Advanced.md / Getting-Started.md: - Document the new PlanarBar3DSeries chart type (matplotlib-style "2D bars in different Y planes" / skyscraper plot) with per-bar Colors[] API and three colour lookup modes. - Cross-series DepthQueue3D for correct 3-D compositing regardless of insertion order. - LightingHelper.ShadeColor matplotlib face-shading formula. - IFontMetrics + IGlyphPathProvider abstractions — SVG text now emitted as <path> with vector glyph outlines so SVG and PNG output are byte-identical in layout. - ChartRenderer.PrepareSpacing shared between SVG and PNG paths for TightLayout / ConstrainedLayout figures (fixes SVG margin drift in e.g. colormap_comparison). - Sticky-edge clamp guard in CartesianAxesRenderer / ThreeDAxesRenderer so overlay series like Bollinger bands no longer clip the underlying candlestick X range (financial_dashboard: all 50 candles visible again). - BuildUniformTickFormatter across every axis renderer (2-D, 3-D, polar, colorbar) so ticks render with consistent decimal precision (0.5/1.0/1.5 not 0.5/1/1.5). - 3-D cube edges trimmed from 12 to 9 (front-silhouette diagonals removed) and minor grid lines dropped from wall panes (matches matplotlib default). - phase_f_indicators sample now uses TightLayout() to resolve the top-row/bottom-row label collision. images/: - threed_bar3d_grouped.png — multi-series Bar3D demonstrating DepthQueue3D compositing. - threed_planar_bars.png — new PlanarBar3D chart type. - threed_planar_bars_x0_highlight.png — PlanarBar3D with per-X Colors[] override. - threed_bar3d_interactive.png — refreshed solid Bar3D with matplotlib shading. - annotations_enhanced / bar_labels / colormap_comparison / contour_labels / dashboard / date_axis / financial_dashboard / gridspec_layout / heatmap_colormap / lttb_downsampling / math_text / phase_f_indicators / prop_cycler / scientific_paper / sparkline_dashboard / tick_locators — regenerated through the post-fix renderer with uniform tick formatting. - 12 new gallery_*.png tiles for the Chart-Types top gallery.

    @xkqg xkqg committed Apr 15, 2026
    e61afc8
  • v1.1.3 pixel-parity round 3: x-tick marks, sticky y=0, legend rectangle, tick metrics User-driven bitmap-diff round dropping bar_labels RMS from 34.81 to 21.99 (45% drop in differing pixels). Each fix targeted a specific bright region in the per-pixel diff heatmap. * Delta 9 fix: x-axis tick marks were missing on categorical bar charts. RenderCategoryLabels now calls DrawTickMark for each tick position. * Delta 7 fix: y=0 sticky edge for BarSeries. matplotlib's BarContainer sets sticky_edges.y=[0] so axes.ymargin doesn't pad below the bar baseline. Extended DataRangeContribution with StickyXMin/Max/YMin/Max, BarSeries returns StickyYMin=0, CartesianAxesRenderer clamps padding against sticky edges. Bar bottoms now touch the bottom spine exactly. * Delta 1 fix: legend swatch was a square. Removed the Math.Min(wMax, h) clamp in DrawLegendSwatch default branch; computed handle dimensions from font.Size * 2.0 (handlelength) and font.Size * 0.7 (handleheight) per matplotlib's defaults. Patch swatches now render as 27.78 x 9.72 px rectangles instead of 12 x 12 squares. * Tick metrics: TickConfig.Length, Width, Pad defaults pre-converted from matplotlib points to pixels at 100 DPI. Length 3.5 -> 4.86, Width 0.8 -> 1.11, Pad 3.0 -> 4.86. Five unit tests updated to assert the new pixel values. * Legend frame edge color fixed from theme foreground (#262626) to matplotlib v2 default #CCCCCC. 15 sample PNGs refreshed via the Skia ModuleInitializer flip path. 3379 unit + 146 fidelity tests still green.

    @xkqg xkqg committed Apr 13, 2026
    b2e0328
  • v1.1.3 pixel-parity round 2: bundled DejaVu + BarSeries range + bar-label theme font Three independent fixes after pixel-by-pixel diff against matplotlib v2 default: 1. Bundle DejaVu Sans TTFs in MatPlotLibNet.Skia (~2.6 MB embedded). Skia silently fell back to Segoe UI on Windows because DejaVu Sans isn't installed system-wide. New ResolveTypeface helper checks bundled cache first; SkiaRenderContext routes all text through it. Result: text now renders with matplotlib's IDENTICAL font. 2. BarSeries.ComputeDataRange now reports [first_bar_left, last_bar_right] instead of slot indices [0, N]. Eliminates ~14 px extra whitespace gap between the y-axis spine and the first bar (and last bar / right spine). 3. BarSeriesRenderer reads bar-value-label font from Context.Theme.DefaultFont instead of a hardcoded sans-serif/11. Bar labels now inherit the theme. Pixel diff bar_labels.png vs matplotlib v2: RMS 43.51 -> 34.81, % differing pixels 8.94% -> 6.40%. Visually dramatically closer (correct font, correct bar gap, correct label sizes). 15 sample PNGs refreshed via the same flip-svg-to-png trick as round 1. 146 fidelity tests still green (2 tolerance bumps for atr/obv where the new DejaVu glyphs displaced the top-5 colour cluster).

    @xkqg xkqg committed Apr 13, 2026
    f457641
  • Refresh 15 sample PNGs after matplotlib-theme pt->px font fix matplotlib specifies font sizes in points (font.size=10 for v2, 12 for classic) while our Font.Size flows through Skia/SVG as pixels. At 100 DPI 1 pt = ~1.389 px, so matplotlib's 10 pt is ~14 px. Previously we passed raw 10.0 / 12.0 values straight through, producing text ~28% too small. MatplotlibThemeFactory now pre-converts the font stacks via a PtToPx constant, so MatplotlibV2.DefaultFont.Size = 13.889 (was 10.0) and MatplotlibClassic.DefaultFont.Size = 16.667 (was 12.0). Every sample chart re-rendered with correctly-sized text.

    @xkqg xkqg committed Apr 13, 2026
    493e11c
  • v1.1.3 pixel-parity pass: refresh 15 sample PNGs + Chart-Types prose All sample PNGs re-rendered through the post-fix renderer path: - FigureBuilder._theme default flipped to MatplotlibV2 (grid off, tab10, soft-black #262626, DejaVu Sans 10pt) so Plt.Create() without an explicit .WithTheme() now inherits the modern matplotlib look - EngFormatter default Sep=" " (matches matplotlib) so ticks read "30 k" instead of the compact "30k" - Default tick targetCount 5 -> 8 to match MaxNLocator(nbins='auto'), so y ranges like [0, 36540] produce [0, 5k, 10k, ..., 35k] (8 ticks) instead of [0, 10k, 20k, 30k] (4 ticks) - Chart-Types.md FinancialDashboard sample: BTC/USDT -> ACME Corp; indicator chaining prose rewritten to match the new "last price series wins" semantic

    @xkqg xkqg committed Apr 13, 2026
    823a7d2
  • v1.1.3 wiki refresh: docs + 15 sample PNGs regenerated through the post-fix renderer - Home: bumped to 1.1.3 with v1.1.3 callout (146 dual-theme fidelity tests) - Contributing: added fidelity-test workflow + dual-theme generator instructions - MatplotlibThemes: added pixel-verified-against-matplotlib section (146 tests) - Roadmap: extended v1.1.3 entry with the 3 latent rendering bugs caught by pixel-by-pixel inspection (y-tick swap, Skia rotation, layout reservation) - 15 sample PNGs re-rendered via Skia ModuleInitializer → Save("X.png") path, now showing correctly-placed y-tick marks and properly-rotated y-axis labels

    @xkqg xkqg committed Apr 13, 2026
    210d77c
  • v1.1.3 — dual-theme fidelity (146 tests) + 3 multi-subplot rendering fixes (legend mathtext, interior y-label gutter, dynamic suptitle height)

    @xkqg xkqg committed Apr 13, 2026
    70149c5
  • v1.1.2 — matplotlib fidelity audit: 72 pixel-verified tests, 15 indicators, spine/tick/margin corrections

    @xkqg xkqg committed Apr 12, 2026
    93d5e9c
  • v1.1.1 — NumPy numerics, PolarHeatmapSeries, broken axis, inset constrained-layout fix

    @xkqg xkqg committed Apr 12, 2026
    55b8de7
  • Add prominent v1.1.0 benchmarks section (Surface3D+lighting, GeoMap, Choropleth)

    @xkqg xkqg committed Apr 12, 2026
    9a81e5d
  • Add v1.1.0 changelog entry to Roadmap

    @xkqg xkqg committed Apr 12, 2026
    008f19c
  • Tier 2 complete — mark v1.1.0 done, defer remaining items to Tier 3

    @xkqg xkqg committed Apr 12, 2026
    2b09d05