Loading the parity record
Fetching the measured run — the pinned upstream oracle, every symbol and every case.
Fetching the measured run — the pinned upstream oracle, every symbol and every case.
Parity / matplotlib
Every number on this page was produced by running both implementations over the same cases: the real matplotlib package pinned at 3.10.0 answers first, and its answer is the expectation the Go port is held to. Nothing is a hand-written expectation, so a new upstream release re-scores the port on its own. See matplotlib for the port's own documentation. Source: github.com/malcolmston/matplotlib.
Not a generic diagram: every node below names an artefact of this harness — the pinned package it installed, the runner files it started, the case files it streamed, and the counts it wrote out.
| Case group | Cases | Match | Mismatch | Group parity |
|---|---|---|---|---|
| colors | 45 | 33 | 12 | 73.3% |
| ticks | 18 | 2 | 16 | 11.1% |
| bugs | 14 | 5 | 9 | 35.7% |
| hist | 11 | 7 | 4 | 63.6% |
| labels | 8 | 7 | 1 | 87.5% |
| transforms | 7 | 7 | 0 | 100.0% |
Every exported symbol of the upstream package, and what the port offers for it. The upstream list is derived mechanically, never from a README: python3 -c 'import matplotlib; matplotlib.use("Agg")
import matplotlib.axes, matplotlib.figure, matplotlib.colors, matplotlib.ticker, matplotlib.pyplot as plt
for name, obj in [("Axes", matplotlib.axes.Axes), ("Figure", matplotlib.figure.Figure),
("colors", matplotlib.colors), ("ticker", matplotlib.ticker), ("pyplot", plt)]:
print(name, len([n for n in dir(obj) if not n.startswith("_")]))
print("colormaps", len(plt.colormaps()))
print("named colors", len(matplotlib.colors.get_named_colors_mapping()))'. A symbol with no case is untested, never a match.
| Upstream symbol | Go symbol | Status | Cases | Note |
|---|---|---|---|---|
| Axes.set_title / get_title | Axes.SetTitle | match | labels-all-three, labels-empty, labels-xml-special-chars, labels-unicode | XML escaping round-trips |
| Axes.set_xlabel / get_xlabel | Axes.SetXLabel | match | same four | |
| Axes.set_ylabel / get_ylabel | Axes.SetYLabel | match | same four | |
| Axes.transLimits | internal Axes.tx/ty, observed via SVG | match | d2a-center, d2a-origin, d2a-corner, d2a-quarter, d2a-outside-range, d2a-inverted-xlim, d2a-nonround-limits | agrees for fixed limits, including reversed axes and points outside the view |
| colors.to_hex | Color.Hex | match | hexfmt-tab-blue, hexfmt-black, hexfmt-white, hexfmt-low | |
| colors.rgb_to_hsv | RGBToHSV | match | rgb2hsv-red, rgb2hsv-green, rgb2hsv-gray, rgb2hsv-black, rgb2hsv-tab-blue | bit-for-bit, including hue 0 for unsaturated input |
| colors.hsv_to_rgb | HSVToRGB | match | hsv2rgb-magenta, hsv2rgb-unsaturated, hsv2rgb-teal, hsv2rgb-wrap-hue-1 | |
| rcParams['axes.prop_cycle'] | DefaultColors | match | cycle-0, cycle-3, cycle-9, cycle-wrap-12 | exact tab10, same order, same wraparound |
| Colormap.__call__ clamping | Colormap.At | match | cmap-clamped-out-of-range | out-of-range t clamps to the endpoint colours on both sides |
| Figure.savefig (.png) | Figure.Save / SavePNG | match | save-png | |
| Figure.savefig (.svg) | Figure.Save / SaveSVG | match | save-svg | |
| Figure.add_subplot | Figure.AddAxes | match | labels-all-three, ticks-explicit-0-10-0-100 | both yield a working single axes filling the figure |
| ticker.AutoLocator / MaxNLocator (get_xticks/get_yticks) | internal niceTicks/ticksWithin | differs | ticks-explicit-0-3-0-10, ticks-explicit-negative, ticks-explicit-tiny-range, ticks-explicit-nonround, ticks-plot-auto, ticks-scatter-auto, ticks-hist-auto | the port always aims for 5 ticks; matplotlib picks its bin count from the axes size in points, and typically produces more. See "Divergences" |
| ticker.ScalarFormatter (get_xticklabels) | internal fmtTick | differs | labelfmt-0-1, labelfmt-0-100000 | "0" vs "0.0"; "1.0e+05" vs "100000" |
| Axes.set_xlim | Axes.SetXLim | differs | ticks-explicit-*, ticks-bar-xlim-ignored | honoured on numeric axes; silently ignored on a bar axes |
| Axes.set_ylim | Axes.SetYLim | differs | ticks-explicit-*, ticks-barh-ylim-ignored | ditto for barh |
| Axes.plot (+ autoscale) | Axes.Plot | differs | ticks-plot-auto, ticks-plot-auto-wide | the port has no data margins and snaps the limits to the outermost tick |
| Axes.scatter (+ autoscale) | Axes.Scatter | differs | ticks-scatter-auto | same cause |
| Axes.hist / numpy.histogram | Axes.Hist | differs | hist-4-bins, hist-10-bins, hist-1-bin, hist-negative-data, hist-fractional-edges, hist-outlier-tail, hist-single-value, hist-empty-1-bin, hist-empty-3-bins, hist-bins-zero, hist-bins-negative | ordinary binning agrees exactly; degenerate and invalid inputs do not |
| Axes.bar | Axes.Bar | differs | cat-bar-3, cat-bar-5, ticks-bar-xlim-ignored | categorical tick positions and labels agree; the view limits do not (no margins) |
| Axes.barh | Axes.BarH | differs | cat-barh-4, ticks-barh-ylim-ignored | ditto |
| Axes.pie | Axes.Pie | differs | ticks-pie-lims-ignored | matplotlib keeps a real (equal-aspect) axes; the port's pie axes computes no limits or ticks at all |
| Axes.legend / Legend.get_texts | Axes.Legend + *.SetLabel | differs | legend-two-series, legend-three-series, legend-unlabelled-series, legend-underscore-label | entry order and text agree; the port has no _-prefix exclusion rule |
| colors.to_rgba (hex forms) | Hex | differs | hex-6-digit, hex-3-digit, hex-uppercase, hex-white, hex-8-digit-alpha, hex-no-hash, hex-bad-digits, hex-bad-length | 3- and 6-digit forms agree; #rrggbbaa and a missing # do not |
| colors.to_rgba (CSS colour names) | Black, White, Red, Green, Blue | differs | named-black, named-white, named-red, named-green, named-blue | the port's Red/Green/Blue are tab10 colours, not CSS ones |
| colors.Normalize | Normalize | differs | norm-clip-in-range, norm-clip-out-of-range, norm-noclip-out-of-range, norm-negative-range, norm-degenerate | matches clip=True; the port has no unclipped mode |
| colors.LogNorm | LogNorm | differs | lognorm-decades, lognorm-fractional, lognorm-clip-out-of-range, lognorm-nonpositive-value | matches for positive in-range input; non-positive input is masked upstream, 0 in the port |
| get_cmap('viridis') | Viridis() | differs | cmap-viridis | 5-anchor approximation (documented as such) |
| get_cmap('plasma') | Plasma() | differs | cmap-plasma | approximation |
| get_cmap('jet') | Jet() | differs | cmap-jet | approximation |
| get_cmap('coolwarm') | Coolwarm() | differs | cmap-coolwarm | approximation |
| get_cmap('gray') | Grays() | differs | cmap-gray | only a 1/255 rounding difference at t=0.75 |
| Figure.savefig (format from extension) | Figure.Save | differs | save-pdf, save-jpg, save-unknown-ext | the port writes PNG bytes under whatever name it was given |
| Figure.set_dpi / Figure.dpi | Figure.DPI | differs | dpi-unchanged-100, dpi-doubled-200, dpi-lowered-72 | the field is stored and never read |
| ft2font.FT2Font.get_char_index / font_manager | built-in 5x7 bitmap font (PNG backend) | differs | glyph-ascii-A, glyph-ascii-hash, glyph-latin1-eacute, glyph-greek-alpha, glyph-micro-sign, glyph-arrow | ASCII agrees; every non-ASCII character is silently blank |
| Axes.errorbar | Axes.ErrorBar | untested | — | only pixel output would distinguish it |
| Axes.fill_between | Axes.FillBetween | untested | — | ditto |
| Axes.step | Axes.Step / StepPlot.SetWhere | untested | — | ditto |
| Axes.stem | Axes.Stem | untested | — | ditto |
| Axes.axhline / axvline | Axes.AxHLine / AxVLine | untested | — | ditto |
| Axes.text / annotate | Axes.Text, Annotation | untested | — | ditto |
| Axes.grid | Axes.Grid | untested | — | affects grid lines only |
| Figure.subplots | Figure.Subplots | untested | — | multi-axes layout is pixel geometry |
| Figure.set_facecolor | Figure.Background | untested | — | |
| Figure.canvas.buffer_rgba | Figure.RenderImage, PNGBytes, WritePNG, WriteSVG | untested | — | used internally by the glyph probe, not asserted |
| LinearSegmentedColormap.from_list | NewColormap | untested | — | |
| Colormap.reversed | Colormap.Reversed | untested | — | |
| colors.Normalize.__call__ -> Colormap | Normalize.Map, LogNorm.Map | untested | — | composition of two symbols that are each covered |
| Line2D.set_linewidth / set_marker / set_color | LinePlot.SetLineWidth/SetMarker/SetColor, ScatterPlot.SetSize/SetMarker, BarChart.SetColor, Histogram.SetColor, RefLine.*, StemPlot.*, FillBetween.*, ErrorBar.* | untested | — | style setters with pixel-only effect |
| pyplot.plot/bar/hist/pie/scatter/title/xlabel/ylabel/xlim/ylim/legend/grid/savefig/gca/gcf/clf/figure | Plot, Bar, BarH, Hist, Pie, Scatter, Title, Xlabel, Ylabel, Xlim, Ylim, Legend, Grid, Save, Gca, Gcf, Clf, FigSize | untested | — | the stateful wrapper delegates to the object API that *is* covered; global state makes it a poor fit for a shared runner |
| Axes.get_xlim/get_ylim/get_xticks/get_yticks/get_xticklabels | — | missing | — | no getters at all**; this is why the port's computed values had to be read out of its SVG |
| Axes.set_xticks/set_yticks/set_xticklabels/set_yticklabels/tick_params/minorticks_on | — | missing | — | no tick API |
| matplotlib.ticker (39 public names: MaxNLocator, LogLocator, FixedLocator, ScalarFormatter, FuncFormatter, PercentFormatter, …) | — | missing | — | no locator or formatter is exposed or replaceable |
| Axes.set_xscale/set_yscale/semilogx/semilogy/loglog, scale.LogScale/SymmetricalLogScale/LogitScale | — | missing | — | no log or non-linear axes**; the port's axes are always linear (LogNorm covers only colour mapping) |
| Figure.colorbar / Axes.colorbar / ScalarMappable | — | missing | — | no colorbar**; Normalize+Colormap exist but nothing draws a scale |
| Axes.imshow/pcolormesh/pcolor/contour/contourf/matshow/spy | — | missing | — | no 2-D array/image plotting |
| Axes.boxplot/violinplot/hexbin/hist2d/eventplot/stackplot/quiver/streamplot/broken_barh/stairs | — | missing | — | no statistical or vector-field plots |
| Axes.twinx/twiny/secondary_xaxis/inset_axes/sharex/sharey | — | missing | — | no shared or twinned axes |
| Axes.set_aspect/Axes.axis('equal')/Figure.tight_layout/constrained_layout/GridSpec | — | missing | — | no layout engine; padding is fixed pixel constants |
| Axes.annotate arrows, patches.* (Rectangle, Circle, Polygon, FancyArrow, …), Path, PathEffects | — | missing | — | no artist/patch layer |
| mathtext ($\alpha$), TeX rendering, font_manager, FontProperties, rcParams font selection | — | missing | — | one built-in 5x7 bitmap font, ASCII only |
| matplotlib.rcParams / rc_context / style.use (103 top-level names) | — | missing | — | no configuration system |
| animation.*, widgets.*, interactive backends, pyplot.show | — | missing | — | static output only |
| dates.* (DateFormatter, AutoDateLocator, date units), units/category unit framework | — | missing | — | no date or unit-aware axes |
| colors.ListedColormap, BoundaryNorm, TwoSlopeNorm, PowerNorm, CenteredNorm, SymLogNorm, colors.CSS4_COLORS/XKCD_COLORS (1163 named colours), colors.to_rgba_array, colors.LightSource | — | missing | — | of the 57 public names in matplotlib.colors, 5 have counterparts; 175 of the 180 registered colormaps are absent |
| Figure.savefig to pdf/ps/eps/pgf/webp/tif/raw, backend_pdf, backend_ps | — | missing | — | PNG and SVG only |
| Axes3D / mpl_toolkits.mplot3d, mpl_toolkits.axes_grid1 | — | missing | — | no 3-D or toolkit axes |
| — | Color.Lighten, Color.Darken, Color.Luminance, Color.Grayscale, Color.WithAlpha, Blend | extra | — | no matplotlib equivalent |
| — | Color.HSV, ColorFromHSV | extra | — | 8-bit convenience wrappers over the covered float conversions |
| — | RGB, RGBA, Color.RGBA (image/color.Color) | extra | — | Go-idiomatic constructors |
| — | Linspace, Arange, Logspace | extra | — | numpy helpers, not matplotlib API; deliberately not scored here |
| — | Marker constants, TextAnchor constants, Point | extra | — | port-specific enums |
| — | Figure.RenderSVG returning a string | extra | — | matplotlib has no equivalent in-memory SVG accessor; it is what makes this harness possible |
Every case the harness streamed to both runners, with the exact upstream symbol and Go symbol it exercised. A deliberate, documented difference is a deviation and is counted apart from a mismatch.
| Case | Group | Upstream symbol | Go symbol | Status | Note |
|---|---|---|---|---|---|
| save-png | bugs | matplotlib.figure.Figure.savefig | matplotlib.Figure.Save | match | |
| save-svg | bugs | matplotlib.figure.Figure.savefig | matplotlib.Figure.Save | match | |
| save-pdf | bugs | matplotlib.figure.Figure.savefig (pdf backend) | matplotlib.Figure.Save | mismatch | known port bug: any extension other than .svg silently gets PNG bytes under the requested name |
| save-jpg | bugs | matplotlib.figure.Figure.savefig (jpeg via Pillow) | matplotlib.Figure.Save | mismatch | known port bug: writes PNG bytes into out.jpg |
| save-unknown-ext | bugs | matplotlib.figure.Figure.savefig with an unsupported format | matplotlib.Figure.Save | mismatch | known port bug: matplotlib raises; the port silently writes a PNG named out.xyz |
| glyph-ascii-A | bugs | matplotlib.ft2font.FT2Font.get_char_index | matplotlib PNG backend built-in 5x7 font | match | |
| glyph-ascii-hash | bugs | matplotlib.ft2font.FT2Font.get_char_index | matplotlib PNG backend built-in 5x7 font | match | |
| glyph-latin1-eacute | bugs | matplotlib.ft2font.FT2Font.get_char_index | matplotlib PNG backend built-in 5x7 font | mismatch | known port bug: the PNG backend silently substitutes a blank glyph |
| glyph-greek-alpha | bugs | matplotlib.ft2font.FT2Font.get_char_index | matplotlib PNG backend built-in 5x7 font | mismatch | known port bug: silently dropped |
| glyph-micro-sign | bugs | matplotlib.ft2font.FT2Font.get_char_index | matplotlib PNG backend built-in 5x7 font | mismatch | known port bug: silently dropped |
| glyph-arrow | bugs | matplotlib.ft2font.FT2Font.get_char_index | matplotlib PNG backend built-in 5x7 font | mismatch | known port bug: silently dropped |
| dpi-unchanged-100 | bugs | matplotlib.figure.Figure.set_dpi + canvas.get_width_height | matplotlib.Figure.DPI | match | |
| dpi-doubled-200 | bugs | matplotlib.figure.Figure.set_dpi + canvas.get_width_height | matplotlib.Figure.DPI | mismatch | known port bug: Figure.DPI is stored and never read, so the output size does not change |
| dpi-lowered-72 | bugs | matplotlib.figure.Figure.set_dpi + canvas.get_width_height | matplotlib.Figure.DPI | mismatch | known port bug: Figure.DPI is stored and never read |
| hex-6-digit | colors | matplotlib.colors.to_rgba | matplotlib.Hex | match | |
| hex-3-digit | colors | matplotlib.colors.to_rgba | matplotlib.Hex | match | |
| hex-uppercase | colors | matplotlib.colors.to_rgba | matplotlib.Hex | match | |
| hex-white | colors | matplotlib.colors.to_rgba | matplotlib.Hex | match | |
| hex-8-digit-alpha | colors | matplotlib.colors.to_rgba (#rrggbbaa form) | matplotlib.Hex | mismatch | matplotlib accepts an alpha suffix; the port rejects any length other than 3 or 6 |
| hex-no-hash | colors | matplotlib.colors.to_rgba (must reject) | matplotlib.Hex | mismatch | matplotlib requires the leading '#'; the port accepts the bare digits |
| hex-bad-digits | colors | matplotlib.colors.to_rgba | matplotlib.Hex | match | both sides must fail |
| hex-bad-length | colors | matplotlib.colors.to_rgba | matplotlib.Hex | match | both sides must fail |
| hexfmt-tab-blue | colors | matplotlib.colors.to_hex | matplotlib.Color.Hex | match | |
| hexfmt-black | colors | matplotlib.colors.to_hex | matplotlib.Color.Hex | match | |
| hexfmt-white | colors | matplotlib.colors.to_hex | matplotlib.Color.Hex | match | |
| hexfmt-low | colors | matplotlib.colors.to_hex | matplotlib.Color.Hex | match | |
| named-black | colors | matplotlib.colors.to_rgba('black') | matplotlib.Black | match | |
| named-white | colors | matplotlib.colors.to_rgba('white') | matplotlib.White | match | |
| named-red | colors | matplotlib.colors.to_rgba('red') | matplotlib.Red | mismatch | CSS 'red' is (1,0,0,1); the port's Red is the tab10 red |
| named-green | colors | matplotlib.colors.to_rgba('green') | matplotlib.Green | mismatch | |
| named-blue | colors | matplotlib.colors.to_rgba('blue') | matplotlib.Blue | mismatch | |
| cycle-0 | colors | matplotlib.rcParams['axes.prop_cycle'] | matplotlib.DefaultColors | match | |
| cycle-3 | colors | matplotlib.rcParams['axes.prop_cycle'] | matplotlib.DefaultColors | match | |
| cycle-9 | colors | matplotlib.rcParams['axes.prop_cycle'] | matplotlib.DefaultColors | match | |
| cycle-wrap-12 | colors | matplotlib.rcParams['axes.prop_cycle'] | matplotlib.DefaultColors | match | |
| cmap-viridis | colors | matplotlib.pyplot.get_cmap('viridis').__call__ | matplotlib.Viridis().At | mismatch | the port documents Viridis as a five-anchor approximation |
| cmap-plasma | colors | matplotlib.pyplot.get_cmap('plasma').__call__ | matplotlib.Plasma().At | mismatch | |
| cmap-jet | colors | matplotlib.pyplot.get_cmap('jet').__call__ | matplotlib.Jet().At | mismatch | |
| cmap-coolwarm | colors | matplotlib.pyplot.get_cmap('coolwarm').__call__ | matplotlib.Coolwarm().At | mismatch | |
| cmap-gray | colors | matplotlib.pyplot.get_cmap('gray').__call__ | matplotlib.Grays().At | mismatch | |
| cmap-clamped-out-of-range | colors | Colormap.__call__ under/over colours | matplotlib.Colormap.At clamping | match | |
| norm-clip-in-range | colors | matplotlib.colors.Normalize.__call__ | matplotlib.Normalize.Norm | match | |
| norm-clip-out-of-range | colors | matplotlib.colors.Normalize(clip=True) | matplotlib.Normalize.Norm | match | |
| norm-noclip-out-of-range | colors | matplotlib.colors.Normalize(clip=False) | matplotlib.Normalize.Norm | mismatch | matplotlib returns values outside [0,1] when clip is off; the port always clamps |
| norm-negative-range | colors | matplotlib.colors.Normalize.__call__ | matplotlib.Normalize.Norm | match | |
| norm-degenerate | colors | matplotlib.colors.Normalize with vmin == vmax | matplotlib.Normalize.Norm degenerate range | match | |
| lognorm-decades | colors | matplotlib.colors.LogNorm.__call__ | matplotlib.LogNorm.Norm | match | |
| lognorm-fractional | colors | matplotlib.colors.LogNorm.__call__ | matplotlib.LogNorm.Norm | match | |
| lognorm-clip-out-of-range | colors | matplotlib.colors.LogNorm(clip=True) | matplotlib.LogNorm.Norm | match | |
| lognorm-nonpositive-value | colors | matplotlib.colors.LogNorm on non-positive input | matplotlib.LogNorm.Norm | mismatch | matplotlib masks non-positive values (reported here as NaN); the port returns 0 |
| rgb2hsv-red | colors | matplotlib.colors.rgb_to_hsv | matplotlib.RGBToHSV | match | |
| rgb2hsv-green | colors | matplotlib.colors.rgb_to_hsv | matplotlib.RGBToHSV | match | |
| rgb2hsv-gray | colors | matplotlib.colors.rgb_to_hsv | matplotlib.RGBToHSV | match | |
| rgb2hsv-black | colors | matplotlib.colors.rgb_to_hsv | matplotlib.RGBToHSV | match | |
| rgb2hsv-tab-blue | colors | matplotlib.colors.rgb_to_hsv | matplotlib.RGBToHSV | match | |
| hsv2rgb-magenta | colors | matplotlib.colors.hsv_to_rgb | matplotlib.HSVToRGB | match | |
| hsv2rgb-unsaturated | colors | matplotlib.colors.hsv_to_rgb | matplotlib.HSVToRGB | match | |
| hsv2rgb-teal | colors | matplotlib.colors.hsv_to_rgb | matplotlib.HSVToRGB | match | |
| hsv2rgb-wrap-hue-1 | colors | matplotlib.colors.hsv_to_rgb at h == 1 | matplotlib.HSVToRGB | match | |
| hist-4-bins | hist | numpy.histogram / matplotlib.axes.Axes.hist | matplotlib.Axes.Hist | match | |
| hist-10-bins | hist | numpy.histogram / matplotlib.axes.Axes.hist | matplotlib.Axes.Hist | match | |
| hist-1-bin | hist | numpy.histogram / matplotlib.axes.Axes.hist | matplotlib.Axes.Hist | match | |
| hist-negative-data | hist | numpy.histogram / matplotlib.axes.Axes.hist | matplotlib.Axes.Hist | match | |
| hist-fractional-edges | hist | numpy.histogram / matplotlib.axes.Axes.hist | matplotlib.Axes.Hist | match | |
| hist-single-value | hist | numpy.histogram on a zero-width range | matplotlib.Axes.Hist on a zero-width range | mismatch | numpy widens a degenerate range to (v-0.5, v+0.5); the port widens it to (v, v+1) |
| hist-empty-1-bin | hist | numpy.histogram on empty input | matplotlib.Axes.Hist on empty input | match | |
| hist-empty-3-bins | hist | numpy.histogram on empty input | matplotlib.Axes.Hist on empty input | mismatch | the port collapses empty input to a single [0,1] bin regardless of the requested bin count |
| hist-bins-zero | hist | numpy.histogram with bins=0 | matplotlib.Axes.Hist with bins<=0 | mismatch | both sides must fail, or the port must not silently substitute a different bin count |
| hist-bins-negative | hist | numpy.histogram with a negative bin count | matplotlib.Axes.Hist with bins<=0 | mismatch | both sides must fail |
| hist-outlier-tail | hist | numpy.histogram / matplotlib.axes.Axes.hist | matplotlib.Axes.Hist | match | |
| labels-all-three | labels | Axes.set_title/set_xlabel/set_ylabel + get_* | matplotlib.Axes.SetTitle/SetXLabel/SetYLabel | match | |
| labels-empty | labels | Axes.get_title/get_xlabel/get_ylabel on an unlabelled axes | matplotlib.Axes (zero-value labels) | match | |
| legend-two-series | labels | Axes.legend + Legend.get_texts | matplotlib.Axes.Legend + LinePlot.SetLabel | match | |
| legend-three-series | labels | Axes.legend + Legend.get_texts | matplotlib.Axes.Legend + LinePlot.SetLabel | match | |
| legend-unlabelled-series | labels | Axes.legend with no labelled artists | matplotlib.Axes.Legend with an empty label | match | both sides must produce an empty legend entry list |
| legend-underscore-label | labels | Axes.legend label-underscore exclusion rule | matplotlib.Axes.Legend | mismatch | matplotlib excludes labels beginning with '_' from the legend; the port has no such rule |
| labels-xml-special-chars | labels | Axes.get_title round-trip | matplotlib.Axes.SetTitle round-trip through SVG escaping | match | |
| labels-unicode | labels | Axes.get_title round-trip | matplotlib.Axes.SetTitle round-trip through SVG escaping | match | the SVG backend preserves these; the PNG backend silently drops them (see bugs/glyph-*) |
| ticks-plot-auto | ticks | matplotlib.axes.Axes.get_xlim/get_xticks (AutoLocator) | matplotlib.Axes.Plot + autoscale | mismatch | |
| ticks-plot-auto-wide | ticks | matplotlib.axes.Axes.get_xlim/get_xticks (AutoLocator) | matplotlib.Axes.Plot + autoscale | mismatch | |
| ticks-scatter-auto | ticks | matplotlib.axes.Axes.scatter + autoscale | matplotlib.Axes.Scatter + autoscale | mismatch | |
| ticks-hist-auto | ticks | matplotlib.axes.Axes.hist + autoscale | matplotlib.Axes.Hist + autoscale | mismatch | |
| ticks-explicit-0-3-0-10 | ticks | matplotlib.axes.Axes.set_xlim/set_ylim + MaxNLocator | matplotlib.Axes.SetXLim/SetYLim | mismatch | |
| ticks-explicit-0-10-0-100 | ticks | matplotlib.axes.Axes.set_xlim/set_ylim + MaxNLocator | matplotlib.Axes.SetXLim/SetYLim | match | |
| ticks-explicit-negative | ticks | matplotlib.axes.Axes.set_xlim/set_ylim + MaxNLocator | matplotlib.Axes.SetXLim/SetYLim | mismatch | |
| ticks-explicit-tiny-range | ticks | matplotlib.ticker.MaxNLocator on a 1e-3 span | matplotlib.Axes.SetXLim/SetYLim | mismatch | |
| ticks-explicit-huge-range | ticks | matplotlib.ticker.MaxNLocator on a 1e6 span | matplotlib.Axes.SetXLim/SetYLim | match | |
| ticks-explicit-nonround | ticks | matplotlib.ticker.MaxNLocator on a non-round span | matplotlib.Axes.SetXLim/SetYLim + ticksWithin | mismatch | |
| ticks-bar-xlim-ignored | ticks | matplotlib.axes.Axes.set_xlim on a categorical bar axis | matplotlib.Axes.SetXLim on a bar axes | mismatch | known port bug: SetXLim is ignored once Bar() has made the x axis categorical |
| ticks-barh-ylim-ignored | ticks | matplotlib.axes.Axes.set_ylim on a categorical barh axis | matplotlib.Axes.SetYLim on a barh axes | mismatch | known port bug: SetYLim is ignored once BarH() has made the y axis categorical |
| ticks-pie-lims-ignored | ticks | matplotlib.axes.Axes.pie + set_xlim/get_xlim | matplotlib.Axes.Pie + SetXLim/SetYLim | mismatch | known port bug: a pie axes never computes limits or ticks at all, so SetXLim/SetYLim are dead and nothing is inspectable |
| labelfmt-0-1 | ticks | matplotlib.ticker.ScalarFormatter | matplotlib (unexported fmtTick), observed via SVG tick text | mismatch | |
| labelfmt-0-100000 | ticks | matplotlib.ticker.ScalarFormatter (offset/scientific notation) | matplotlib (unexported fmtTick), observed via SVG tick text | mismatch | |
| cat-bar-3 | ticks | matplotlib.axes.Axes.bar + FixedLocator/IndexFormatter | matplotlib.Axes.Bar categorical axis | mismatch | |
| cat-bar-5 | ticks | matplotlib.axes.Axes.bar + FixedLocator/IndexFormatter | matplotlib.Axes.Bar categorical axis | mismatch | |
| cat-barh-4 | ticks | matplotlib.axes.Axes.barh + FixedLocator/IndexFormatter | matplotlib.Axes.BarH categorical axis | mismatch | |
| d2a-center | transforms | matplotlib.axes.Axes.transLimits | matplotlib.Axes.SetXLim/SetYLim + internal tx/ty (observed via SVG) | match | |
| d2a-origin | transforms | matplotlib.axes.Axes.transLimits | matplotlib.Axes.SetXLim/SetYLim + internal tx/ty (observed via SVG) | match | |
| d2a-corner | transforms | matplotlib.axes.Axes.transLimits | matplotlib.Axes.SetXLim/SetYLim + internal tx/ty (observed via SVG) | match | |
| d2a-quarter | transforms | matplotlib.axes.Axes.transLimits | matplotlib.Axes.SetXLim/SetYLim + internal tx/ty (observed via SVG) | match |