From 6a18060a90df75d83bed87d4a9a2f349a7a35900 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Mon, 17 Mar 2025 20:42:28 +0100 Subject: [PATCH 001/120] Shorten Agg template usage with class template argument deduction. Many parts of the Agg & path processing pipeline work by constructing nested templated objects that represent steps of the processing pipeline, e.g. (simplified example) ``` agg::conv_transform // The processing step. tpath // The name of the result. (path, trans); // The arguments passed to the processing step. PathNanRemover> nan_removed (tpath, true, path.has_codes()); ``` The current implementation makes the code shorter by introducing alias typenames for the types at each intermediate step. As of C++17, this can be made simpler and shorter because class template argument deduction ("CTAD") allows not specifying the template arguments (in angle brackets) anymore, i.e. one can write ``` agg::conv_transform tpath(path, trans); PathNanRemover nan_removed(tpath, true, path.has_codes()); ``` and the compiler will auto-fill in the required types. Furthermore, because these steps can be seen as a pipeline (even though they are implemented as the construction of nested objects), it may feel more natural to write them as repeated "function" (constructor) application, i.e. ``` auto tpath = agg::conv_transform{path, trans}; auto nan_removed = PathNanRemover{tpath, true, path.has_codes()}; ``` Perform this transformation whereever applicable. --- src/_backend_agg.cpp | 29 +++--- src/_backend_agg.h | 226 ++++++++++++++++--------------------------- src/_path.h | 128 ++++++++---------------- 3 files changed, 138 insertions(+), 245 deletions(-) diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index 4d097bc80716..aba284719df0 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -122,15 +122,6 @@ bool RendererAgg::render_clippath(mpl::PathIterator &clippath, const agg::trans_affine &clippath_trans, e_snap_mode snap_mode) { - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover nan_removed_t; - /* Unlike normal Paths, the clip path cannot be clipped to the Figure bbox, - * because it needs to remain a complete closed path, so there is no - * PathClipper step. */ - typedef PathSnapper snapped_t; - typedef PathSimplifier simplify_t; - typedef agg::conv_curve curve_t; - bool has_clippath = (clippath.total_vertices() != 0); if (has_clippath && @@ -141,13 +132,19 @@ bool RendererAgg::render_clippath(mpl::PathIterator &clippath, trans *= agg::trans_affine_translation(0.0, (double)height); rendererBaseAlphaMask.clear(agg::gray8(0, 0)); - transformed_path_t transformed_clippath(clippath, trans); - nan_removed_t nan_removed_clippath(transformed_clippath, true, clippath.has_codes()); - snapped_t snapped_clippath(nan_removed_clippath, snap_mode, clippath.total_vertices(), 0.0); - simplify_t simplified_clippath(snapped_clippath, - clippath.should_simplify() && !clippath.has_codes(), - clippath.simplify_threshold()); - curve_t curved_clippath(simplified_clippath); + auto transformed_clippath = agg::conv_transform{clippath, trans}; + auto nan_removed_clippath = PathNanRemover{ + transformed_clippath, true, clippath.has_codes()}; + // Unlike normal Paths, the clip path cannot be clipped to the Figure + // bbox, because it needs to remain a complete closed path, so there is + // no PathClipper step after nan-removal. + auto snapped_clippath = PathSnapper{ + nan_removed_clippath, snap_mode, clippath.total_vertices(), 0.0}; + auto simplified_clippath = PathSimplifier{ + snapped_clippath, + clippath.should_simplify() && !clippath.has_codes(), + clippath.simplify_threshold()}; + auto curved_clippath = agg::conv_curve{simplified_clippath}; theRasterizer.add_path(curved_clippath); rendererAlphaMask.color(agg::gray8(255, 255)); agg::render_scanlines(theRasterizer, scanlineAlphaMask, rendererAlphaMask); diff --git a/src/_backend_agg.h b/src/_backend_agg.h index 1ac3d4c06b13..a4e2aa10040d 100644 --- a/src/_backend_agg.h +++ b/src/_backend_agg.h @@ -295,23 +295,15 @@ template inline void RendererAgg::_draw_path(path_t &path, bool has_clippath, const std::optional &face, GCAgg &gc) { - typedef agg::conv_stroke stroke_t; - typedef agg::conv_dash dash_t; - typedef agg::conv_stroke stroke_dash_t; - typedef agg::pixfmt_amask_adaptor pixfmt_amask_type; - typedef agg::renderer_base amask_ren_type; - typedef agg::renderer_scanline_aa_solid amask_aa_renderer_type; - typedef agg::renderer_scanline_bin_solid amask_bin_renderer_type; - // Render face if (face) { theRasterizer.add_path(path); if (gc.isaa) { if (has_clippath) { - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type r(pfa); - amask_aa_renderer_type ren(r); + auto pfa = agg::pixfmt_amask_adaptor{pixFmt, alphaMask}; + auto r = agg::renderer_base{pfa}; + auto ren = agg::renderer_scanline_aa_solid{r}; ren.color(*face); agg::render_scanlines(theRasterizer, scanlineAlphaMask, ren); } else { @@ -320,9 +312,9 @@ RendererAgg::_draw_path(path_t &path, bool has_clippath, const std::optional hatch_path_trans_t; - typedef agg::conv_curve hatch_path_curve_t; - typedef agg::conv_stroke hatch_path_stroke_t; - mpl::PathIterator hatch_path(gc.hatchpath); agg::trans_affine hatch_trans; hatch_trans *= agg::trans_affine_scaling(1.0, -1.0); hatch_trans *= agg::trans_affine_translation(0.0, 1.0); hatch_trans *= agg::trans_affine_scaling(static_cast(hatch_size), static_cast(hatch_size)); - hatch_path_trans_t hatch_path_trans(hatch_path, hatch_trans); - hatch_path_curve_t hatch_path_curve(hatch_path_trans); - hatch_path_stroke_t hatch_path_stroke(hatch_path_curve); + auto hatch_path_trans = agg::conv_transform{hatch_path, hatch_trans}; + auto hatch_path_curve = agg::conv_curve{hatch_path_trans}; + auto hatch_path_stroke = agg::conv_stroke{hatch_path_curve}; hatch_path_stroke.width(points_to_pixels(gc.hatch_linewidth)); hatch_path_stroke.line_cap(agg::square_cap); @@ -376,18 +364,16 @@ RendererAgg::_draw_path(path_t &path, bool has_clippath, const std::optional img_source_type; - typedef agg::span_pattern_rgba span_gen_type; agg::span_allocator sa; - img_source_type img_src(hatch_img_pixf); - span_gen_type sg(img_src, 0, 0); + auto img_src = agg::image_accessor_wrap< + pixfmt, agg::wrap_mode_repeat_auto_pow2, agg::wrap_mode_repeat_auto_pow2>{ + hatch_img_pixf}; + auto sg = agg::span_pattern_rgba{img_src, 0, 0}; theRasterizer.add_path(path); if (has_clippath) { - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type ren(pfa); + auto pfa = agg::pixfmt_amask_adaptor{pixFmt, alphaMask}; + auto ren = agg::renderer_base{pfa}; agg::render_scanlines_aa(theRasterizer, slineP8, ren, sa, sg); } else { agg::render_scanlines_aa(theRasterizer, slineP8, rendererBase, sa, sg); @@ -401,16 +387,16 @@ RendererAgg::_draw_path(path_t &path, bool has_clippath, const std::optional inline void RendererAgg::draw_path(GCAgg &gc, PathIterator &path, agg::trans_affine &trans, agg::rgba &color) { - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover nan_removed_t; - typedef PathClipper clipped_t; - typedef PathSnapper snapped_t; - typedef PathSimplifier simplify_t; - typedef agg::conv_curve curve_t; - typedef Sketch sketch_t; - std::optional face; if (color.a != 0.0) { face = color; @@ -475,13 +453,15 @@ RendererAgg::draw_path(GCAgg &gc, PathIterator &path, agg::trans_affine &trans, snapping_linewidth = 0.0; } - transformed_path_t tpath(path, trans); - nan_removed_t nan_removed(tpath, true, path.has_codes()); - clipped_t clipped(nan_removed, clip, width, height); - snapped_t snapped(clipped, gc.snap_mode, path.total_vertices(), snapping_linewidth); - simplify_t simplified(snapped, simplify, path.simplify_threshold()); - curve_t curve(simplified); - sketch_t sketch(curve, gc.sketch.scale, gc.sketch.length, gc.sketch.randomness); + auto tpath = agg::conv_transform{path, trans}; + auto nan_removed = PathNanRemover{tpath, true, path.has_codes()}; + auto clipped = PathClipper(nan_removed, clip, width, height); + auto snapped = PathSnapper{ + clipped, gc.snap_mode, path.total_vertices(), snapping_linewidth}; + auto simplified = PathSimplifier{snapped, simplify, path.simplify_threshold()}; + auto curve = agg::conv_curve{simplified}; + auto sketch = Sketch{ + curve, gc.sketch.scale, gc.sketch.length, gc.sketch.randomness}; _draw_path(sketch, has_clippath, face, gc); } @@ -494,28 +474,19 @@ inline void RendererAgg::draw_markers(GCAgg &gc, agg::trans_affine &trans, agg::rgba color) { - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover nan_removed_t; - typedef PathSnapper snap_t; - typedef agg::conv_curve curve_t; - typedef agg::conv_stroke stroke_t; - typedef agg::pixfmt_amask_adaptor pixfmt_amask_type; - typedef agg::renderer_base amask_ren_type; - typedef agg::renderer_scanline_aa_solid amask_aa_renderer_type; - // Deal with the difference in y-axis direction marker_trans *= agg::trans_affine_scaling(1.0, -1.0); trans *= agg::trans_affine_scaling(1.0, -1.0); trans *= agg::trans_affine_translation(0.5, (double)height + 0.5); - transformed_path_t marker_path_transformed(marker_path, marker_trans); - nan_removed_t marker_path_nan_removed(marker_path_transformed, true, marker_path.has_codes()); - snap_t marker_path_snapped(marker_path_nan_removed, - gc.snap_mode, - marker_path.total_vertices(), - points_to_pixels(gc.linewidth)); - curve_t marker_path_curve(marker_path_snapped); + auto marker_path_transformed = agg::conv_transform{marker_path, marker_trans}; + auto marker_path_nan_removed = PathNanRemover{ + marker_path_transformed, true, marker_path.has_codes()}; + auto marker_path_snapped = PathSnapper{ + marker_path_nan_removed, + gc.snap_mode, marker_path.total_vertices(), points_to_pixels(gc.linewidth)}; + auto marker_path_curve = agg::conv_curve{marker_path_snapped}; if (!marker_path_snapped.is_snapping()) { // If the path snapper isn't in effect, at least make sure the marker @@ -524,10 +495,11 @@ inline void RendererAgg::draw_markers(GCAgg &gc, marker_trans *= agg::trans_affine_translation(0.5, 0.5); } - transformed_path_t path_transformed(path, trans); - nan_removed_t path_nan_removed(path_transformed, false, false); - snap_t path_snapped(path_nan_removed, SNAP_FALSE, path.total_vertices(), 0.0); - curve_t path_curve(path_snapped); + auto path_transformed = agg::conv_transform{path, trans}; + auto path_nan_removed = PathNanRemover{path_transformed, false, false}; + auto path_snapped = PathSnapper{ + path_nan_removed, SNAP_FALSE, path.total_vertices(), 0.0}; + auto path_curve = agg::conv_curve{path_snapped}; path_curve.rewind(0); std::optional face; @@ -556,7 +528,7 @@ inline void RendererAgg::draw_markers(GCAgg &gc, scanlines.max_y()); } - stroke_t stroke(marker_path_curve); + auto stroke = agg::conv_stroke{marker_path_curve}; stroke.width(points_to_pixels(gc.linewidth)); stroke.line_cap(gc.cap); stroke.line_join(gc.join); @@ -605,9 +577,9 @@ inline void RendererAgg::draw_markers(GCAgg &gc, continue; } - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type r(pfa); - amask_aa_renderer_type ren(r); + auto pfa = agg::pixfmt_amask_adaptor{pixFmt, alphaMask}; + auto r = agg::renderer_base{pfa}; + auto ren = agg::renderer_scanline_aa_solid{r}; if (face) { ren.color(*face); @@ -706,14 +678,6 @@ class font_to_rgba template inline void RendererAgg::draw_text_image(GCAgg &gc, ImageArray &image, int x, int y, double angle) { - typedef agg::span_allocator color_span_alloc_type; - typedef agg::span_interpolator_linear<> interpolator_type; - typedef agg::image_accessor_clip image_accessor_type; - typedef agg::span_image_filter_gray image_span_gen_type; - typedef font_to_rgba span_gen_type; - typedef agg::renderer_scanline_aa - renderer_type; - theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); if (angle != 0.0) { @@ -745,12 +709,12 @@ inline void RendererAgg::draw_text_image(GCAgg &gc, ImageArray &image, int x, in agg::image_filter_lut filter; filter.calculate(agg::image_filter_spline36()); - interpolator_type interpolator(inv_mtx); - color_span_alloc_type sa; - image_accessor_type ia(pixf_img, agg::gray8(0)); - image_span_gen_type image_span_generator(ia, interpolator, filter); - span_gen_type output_span_generator(&image_span_generator, gc.color); - renderer_type ri(rendererBase, sa, output_span_generator); + auto interpolator = agg::span_interpolator_linear{inv_mtx}; + auto sa = agg::span_allocator{}; + auto ia = agg::image_accessor_clip{pixf_img, agg::gray8(0)}; + auto image_span_generator = agg::span_image_filter_gray{ia, interpolator, filter}; + auto output_span_generator = font_to_rgba{&image_span_generator, gc.color}; + auto ri = agg::renderer_scanline_aa{rendererBase, sa, output_span_generator}; theRasterizer.add_path(rect2); agg::render_scanlines(theRasterizer, slineP8, ri); @@ -846,28 +810,16 @@ inline void RendererAgg::draw_image(GCAgg &gc, agg::trans_affine inv_mtx(mtx); inv_mtx.invert(); - typedef agg::span_allocator color_span_alloc_type; - typedef agg::image_accessor_clip image_accessor_type; - typedef agg::span_interpolator_linear<> interpolator_type; - typedef agg::span_image_filter_rgba_nn - image_span_gen_type; - typedef agg::span_converter span_conv; - - color_span_alloc_type sa; - image_accessor_type ia(pixf, agg::rgba8(0, 0, 0, 0)); - interpolator_type interpolator(inv_mtx); - image_span_gen_type image_span_generator(ia, interpolator); - span_conv_alpha conv_alpha(alpha); - span_conv spans(image_span_generator, conv_alpha); - - typedef agg::pixfmt_amask_adaptor pixfmt_amask_type; - typedef agg::renderer_base amask_ren_type; - typedef agg::renderer_scanline_aa - renderer_type_alpha; - - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type r(pfa); - renderer_type_alpha ri(r, sa, spans); + auto sa = agg::span_allocator{}; + auto ia = agg::image_accessor_clip{pixf, agg::rgba8(0, 0, 0, 0)}; + auto interpolator = agg::span_interpolator_linear{inv_mtx}; + auto image_span_generator = agg::span_image_filter_rgba_nn{ia, interpolator}; + auto conv_alpha = span_conv_alpha{alpha}; + auto spans = agg::span_converter{image_span_generator, conv_alpha}; + + auto pfa = agg::pixfmt_amask_adaptor{pixFmt, alphaMask}; + auto r = agg::renderer_base{pfa}; + auto ri = agg::renderer_scanline_aa{r, sa, spans}; theRasterizer.add_path(rect2); agg::render_scanlines(theRasterizer, scanlineAlphaMask, ri); @@ -905,17 +857,6 @@ inline void RendererAgg::_draw_path_collection_generic(GCAgg &gc, bool has_codes, ColorArray &hatchcolors) { - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover nan_removed_t; - typedef PathClipper clipped_t; - typedef PathSnapper snapped_t; - typedef agg::conv_curve snapped_curve_t; - typedef agg::conv_curve curve_t; - typedef Sketch sketch_clipped_t; - typedef Sketch sketch_curve_t; - typedef Sketch sketch_snapped_t; - typedef Sketch sketch_snapped_curve_t; - size_t Npaths = path_generator.num_paths(); size_t Noffsets = safe_first_shape(offsets); size_t N = std::max(Npaths, Noffsets); @@ -996,27 +937,31 @@ inline void RendererAgg::_draw_path_collection_generic(GCAgg &gc, } gc.isaa = antialiaseds(i % Naa); - transformed_path_t tpath(path, trans); - nan_removed_t nan_removed(tpath, true, has_codes); - clipped_t clipped(nan_removed, do_clip, width, height); + auto tpath = agg::conv_transform{path, trans}; + auto nan_removed = PathNanRemover{tpath, true, has_codes}; + auto clipped = PathClipper(nan_removed, do_clip, width, height); if (check_snap) { - snapped_t snapped( - clipped, gc.snap_mode, path.total_vertices(), points_to_pixels(gc.linewidth)); + auto snapped = PathSnapper{ + clipped, gc.snap_mode, path.total_vertices(), points_to_pixels(gc.linewidth)}; if (has_codes) { - snapped_curve_t curve(snapped); - sketch_snapped_curve_t sketch(curve, gc.sketch.scale, gc.sketch.length, gc.sketch.randomness); + auto curve = agg::conv_curve{snapped}; + auto sketch = Sketch{ + curve, gc.sketch.scale, gc.sketch.length, gc.sketch.randomness}; _draw_path(sketch, has_clippath, face, gc); } else { - sketch_snapped_t sketch(snapped, gc.sketch.scale, gc.sketch.length, gc.sketch.randomness); + auto sketch = Sketch{ + snapped, gc.sketch.scale, gc.sketch.length, gc.sketch.randomness}; _draw_path(sketch, has_clippath, face, gc); } } else { if (has_codes) { - curve_t curve(clipped); - sketch_curve_t sketch(curve, gc.sketch.scale, gc.sketch.length, gc.sketch.randomness); + auto curve = agg::conv_curve{clipped}; + auto sketch = Sketch{ + curve, gc.sketch.scale, gc.sketch.length, gc.sketch.randomness}; _draw_path(sketch, has_clippath, face, gc); } else { - sketch_clipped_t sketch(clipped, gc.sketch.scale, gc.sketch.length, gc.sketch.randomness); + auto sketch = Sketch{ + clipped, gc.sketch.scale, gc.sketch.length, gc.sketch.randomness}; _draw_path(sketch, has_clippath, face, gc); } } @@ -1215,14 +1160,9 @@ inline void RendererAgg::_draw_gouraud_triangle(PointArray &points, theRasterizer.add_path(span_gen); if (has_clippath) { - typedef agg::pixfmt_amask_adaptor pixfmt_amask_type; - typedef agg::renderer_base amask_ren_type; - typedef agg::renderer_scanline_aa - amask_aa_renderer_type; - - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type r(pfa); - amask_aa_renderer_type ren(r, span_alloc, span_gen); + auto pfa = agg::pixfmt_amask_adaptor{pixFmt, alphaMask}; + auto r = agg::renderer_base{pfa}; + auto ren = agg::renderer_scanline_aa{r, span_alloc, span_gen}; agg::render_scanlines(theRasterizer, scanlineAlphaMask, ren); } else { agg::render_scanlines_aa(theRasterizer, slineP8, rendererBase, span_alloc, span_gen); diff --git a/src/_path.h b/src/_path.h index c03703776760..f5eb0ab1008a 100644 --- a/src/_path.h +++ b/src/_path.h @@ -239,24 +239,17 @@ inline void points_in_path(PointArray &points, agg::trans_affine &trans, ResultArray &result) { - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover no_nans_t; - typedef agg::conv_curve curve_t; - typedef agg::conv_contour contour_t; - for (auto i = 0; i < safe_first_shape(points); ++i) { result[i] = false; } - if (path.total_vertices() < 3) { return; } - - transformed_path_t trans_path(path, trans); - no_nans_t no_nans_path(trans_path, true, path.has_codes()); - curve_t curved_path(no_nans_path); + auto trans_path = agg::conv_transform{path, trans}; + auto no_nans_path = PathNanRemover{trans_path, true, path.has_codes()}; + auto curved_path = agg::conv_curve{no_nans_path}; if (r != 0.0) { - contour_t contoured_path(curved_path); + auto contoured_path = agg::conv_contour{curved_path}; contoured_path.width(r); point_in_path_impl(points, contoured_path, result); } else { @@ -286,11 +279,6 @@ template inline bool point_on_path( double x, double y, const double r, PathIterator &path, agg::trans_affine &trans) { - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover no_nans_t; - typedef agg::conv_curve curve_t; - typedef agg::conv_stroke stroke_t; - py::ssize_t shape[] = {1, 2}; py::array_t points_arr(shape); *points_arr.mutable_data(0, 0) = x; @@ -300,10 +288,10 @@ inline bool point_on_path( int result[1]; result[0] = 0; - transformed_path_t trans_path(path, trans); - no_nans_t nan_removed_path(trans_path, true, path.has_codes()); - curve_t curved_path(nan_removed_path); - stroke_t stroked_path(curved_path); + auto trans_path = agg::conv_transform{path, trans}; + auto nan_removed_path = PathNanRemover{trans_path, true, path.has_codes()}; + auto curved_path = agg::conv_curve{nan_removed_path}; + auto stroked_path = agg::conv_stroke{curved_path}; stroked_path.width(r * 2.0); point_in_path_impl(points, stroked_path, result); return result[0] != 0; @@ -352,13 +340,11 @@ inline void update_limits(double x, double y, extent_limits &e) template void update_path_extents(PathIterator &path, agg::trans_affine &trans, extent_limits &extents) { - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover nan_removed_t; double x, y; unsigned code; - transformed_path_t tpath(path, trans); - nan_removed_t nan_removed(tpath, true, path.has_codes()); + auto tpath = agg::conv_transform{path, trans}; + auto nan_removed = PathNanRemover{tpath, true, path.has_codes()}; nan_removed.rewind(0); @@ -481,17 +467,13 @@ bool path_in_path(PathIterator1 &a, PathIterator2 &b, agg::trans_affine &btrans) { - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover no_nans_t; - typedef agg::conv_curve curve_t; - if (a.total_vertices() < 3) { return false; } - transformed_path_t b_path_trans(b, btrans); - no_nans_t b_no_nans(b_path_trans, true, b.has_codes()); - curve_t b_curved(b_no_nans); + auto b_path_trans = agg::conv_transform{b, btrans}; + auto b_no_nans = PathNanRemover{b_path_trans, true, b.has_codes()}; + auto b_curved = agg::conv_curve{b_no_nans}; double x, y; b_curved.rewind(0); @@ -655,8 +637,7 @@ clip_path_to_rect(PathIterator &path, agg::rect_d &rect, bool inside, std::vecto std::swap(ymin, ymax); } - typedef agg::conv_curve curve_t; - curve_t curve(path); + auto curve = agg::conv_curve{path}; Polygon polygon1, polygon2; double x = 0, y = 0; @@ -849,18 +830,15 @@ inline bool segments_intersect(const double &x1, template bool path_intersects_path(PathIterator1 &p1, PathIterator2 &p2) { - typedef PathNanRemover no_nans_t; - typedef agg::conv_curve curve_t; - if (p1.total_vertices() < 2 || p2.total_vertices() < 2) { return false; } - no_nans_t n1(p1, true, p1.has_codes()); - no_nans_t n2(p2, true, p2.has_codes()); + auto n1 = PathNanRemover{p1, true, p1.has_codes()}, + n2 = PathNanRemover{p2, true, p2.has_codes()}; - curve_t c1(n1); - curve_t c2(n2); + auto c1 = agg::conv_curve{n1}, + c2 = agg::conv_curve{n2}; double x11, y11, x12, y12; double x21, y21, x22, y22; @@ -913,15 +891,12 @@ bool path_intersects_rectangle(PathIterator &path, double rect_x2, double rect_y2, bool filled) { - typedef PathNanRemover no_nans_t; - typedef agg::conv_curve curve_t; - if (path.total_vertices() == 0) { return false; } - no_nans_t no_nans(path, true, path.has_codes()); - curve_t curve(no_nans); + auto no_nans = PathNanRemover{path, true, path.has_codes()}; + auto curve = agg::conv_curve{no_nans}; double cx = (rect_x1 + rect_x2) * 0.5, cy = (rect_y1 + rect_y2) * 0.5; double w = fabs(rect_x1 - rect_x2), h = fabs(rect_y1 - rect_y2); @@ -959,20 +934,14 @@ void convert_path_to_polygons(PathIterator &path, int closed_only, std::vector &result) { - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover nan_removal_t; - typedef PathClipper clipped_t; - typedef PathSimplifier simplify_t; - typedef agg::conv_curve curve_t; - bool do_clip = width != 0.0 && height != 0.0; bool simplify = path.should_simplify(); - transformed_path_t tpath(path, trans); - nan_removal_t nan_removed(tpath, true, path.has_codes()); - clipped_t clipped(nan_removed, do_clip, width, height); - simplify_t simplified(clipped, simplify, path.simplify_threshold()); - curve_t curve(simplified); + auto tpath = agg::conv_transform{path, trans}; + auto nan_removed = PathNanRemover{tpath, true, path.has_codes()}; + auto clipped = PathClipper(nan_removed, do_clip, width, height); + auto simplified = PathSimplifier{clipped, simplify, path.simplify_threshold()}; + auto curve = agg::conv_curve{simplified}; Polygon *polygon = &result.emplace_back(); double x, y; @@ -1022,19 +991,12 @@ void cleanup_path(PathIterator &path, std::vector &vertices, std::vector &codes) { - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover nan_removal_t; - typedef PathClipper clipped_t; - typedef PathSnapper snapped_t; - typedef PathSimplifier simplify_t; - typedef agg::conv_curve curve_t; - typedef Sketch sketch_t; - - transformed_path_t tpath(path, trans); - nan_removal_t nan_removed(tpath, remove_nans, path.has_codes()); - clipped_t clipped(nan_removed, do_clip, rect); - snapped_t snapped(clipped, snap_mode, path.total_vertices(), stroke_width); - simplify_t simplified(snapped, do_simplify, path.simplify_threshold()); + auto tpath = agg::conv_transform{path, trans}; + auto nan_removed = PathNanRemover{tpath, remove_nans, path.has_codes()}; + auto clipped = PathClipper{nan_removed, do_clip, rect}; + auto snapped = PathSnapper{ + clipped, snap_mode, path.total_vertices(), stroke_width}; + auto simplified = PathSimplifier{snapped, do_simplify, path.simplify_threshold()}; vertices.reserve(path.total_vertices() * 2); codes.reserve(path.total_vertices()); @@ -1042,8 +1004,9 @@ void cleanup_path(PathIterator &path, if (return_curves && sketch_params.scale == 0.0) { __cleanup_path(simplified, vertices, codes); } else { - curve_t curve(simplified); - sketch_t sketch(curve, sketch_params.scale, sketch_params.length, sketch_params.randomness); + auto curve = agg::conv_curve{simplified}; + auto sketch = Sketch{ + curve, sketch_params.scale, sketch_params.length, sketch_params.randomness}; __cleanup_path(sketch, vertices, codes); } } @@ -1178,22 +1141,14 @@ bool convert_to_string(PathIterator &path, bool postfix, std::string& buffer) { - size_t buffersize; - typedef agg::conv_transform transformed_path_t; - typedef PathNanRemover nan_removal_t; - typedef PathClipper clipped_t; - typedef PathSimplifier simplify_t; - typedef agg::conv_curve curve_t; - typedef Sketch sketch_t; - bool do_clip = (clip_rect.x1 < clip_rect.x2 && clip_rect.y1 < clip_rect.y2); - transformed_path_t tpath(path, trans); - nan_removal_t nan_removed(tpath, true, path.has_codes()); - clipped_t clipped(nan_removed, do_clip, clip_rect); - simplify_t simplified(clipped, simplify, path.simplify_threshold()); + auto tpath = agg::conv_transform{path, trans}; + auto nan_removed = PathNanRemover{tpath, true, path.has_codes()}; + auto clipped = PathClipper{nan_removed, do_clip, clip_rect}; + auto simplified = PathSimplifier{clipped, simplify, path.simplify_threshold()}; - buffersize = (size_t) path.total_vertices() * (precision + 5) * 4; + size_t buffersize = (size_t) path.total_vertices() * (precision + 5) * 4; if (buffersize == 0) { return true; } @@ -1207,8 +1162,9 @@ bool convert_to_string(PathIterator &path, if (sketch_params.scale == 0.0) { return __convert_to_string(simplified, precision, codes, postfix, buffer); } else { - curve_t curve(simplified); - sketch_t sketch(curve, sketch_params.scale, sketch_params.length, sketch_params.randomness); + auto curve = agg::conv_curve{simplified}; + auto sketch = Sketch{ + curve, sketch_params.scale, sketch_params.length, sketch_params.randomness}; return __convert_to_string(sketch, precision, codes, postfix, buffer); } From 3f937281e87b68f3a42ca178db67d9a677a0a332 Mon Sep 17 00:00:00 2001 From: "Lumberbot (aka Jack)" <39504233+meeseeksmachine@users.noreply.github.com> Date: Tue, 25 Nov 2025 17:30:44 +0100 Subject: [PATCH 002/120] Backport PR #30788: Fix typo in key-mapping for "f11" (#30791) Co-authored-by: Ruth Comer <10599679+rcomer@users.noreply.github.com> --- lib/matplotlib/backends/backend_qt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/backend_qt.py b/lib/matplotlib/backends/backend_qt.py index d0aded5fff63..dd642ba838af 100644 --- a/lib/matplotlib/backends/backend_qt.py +++ b/lib/matplotlib/backends/backend_qt.py @@ -55,7 +55,7 @@ ("Key_F8", "f8"), ("Key_F9", "f9"), ("Key_F10", "f10"), - ("Key_F10", "f11"), + ("Key_F11", "f11"), ("Key_F12", "f12"), ("Key_Super_L", "super"), ("Key_Super_R", "super"), From 6a38e4e0725f5ca0310c098d674edce3f5947d5f Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Sat, 29 Nov 2025 21:19:05 +0000 Subject: [PATCH 003/120] Backport PR #30763: DOC: Add example how to align tick labels --- galleries/examples/ticks/align_ticklabels.py | 32 ++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 galleries/examples/ticks/align_ticklabels.py diff --git a/galleries/examples/ticks/align_ticklabels.py b/galleries/examples/ticks/align_ticklabels.py new file mode 100644 index 000000000000..ec36e0db4d07 --- /dev/null +++ b/galleries/examples/ticks/align_ticklabels.py @@ -0,0 +1,32 @@ +""" +================= +Align tick labels +================= + +By default, tick labels are aligned towards the axis. This means the set of +*y* tick labels appear right-aligned. Because the alignment reference point +is on the axis, left-aligned tick labels would overlap the plotting area. +To achieve a good-looking left-alignment, you have to additionally increase +the padding. +""" +import matplotlib.pyplot as plt + +population = { + "Sydney": 5.2, + "Mexico City": 8.8, + "São Paulo": 12.2, + "Istanbul": 15.9, + "Lagos": 15.9, + "Shanghai": 21.9, +} + +fig, ax = plt.subplots(layout="constrained") +ax.barh(population.keys(), population.values()) +ax.set_xlabel('Population (in millions)') + +# left-align all ticklabels +for ticklabel in ax.get_yticklabels(): + ticklabel.set_horizontalalignment("left") + +# increase padding +ax.tick_params("y", pad=70) From ce645296e2ce963e85d254e869238c200635d7be Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 7 Dec 2025 15:30:40 +0100 Subject: [PATCH 004/120] Backport PR #30817: Update sphinx-gallery header patch --- doc/conf.py | 2 +- lib/matplotlib/tests/test_doc.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 96738492b68b..03df9340e66c 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -364,7 +364,7 @@ def gallery_image_warning_filter(record): :class: sphx-glr-download-link-note :ref:`Go to the end ` - to download the full example code.{2} + to download the full example code{2} .. rst-class:: sphx-glr-example-title diff --git a/lib/matplotlib/tests/test_doc.py b/lib/matplotlib/tests/test_doc.py index 3e28fd1b8eb7..6e8ce9fd630c 100644 --- a/lib/matplotlib/tests/test_doc.py +++ b/lib/matplotlib/tests/test_doc.py @@ -9,7 +9,7 @@ def test_sphinx_gallery_example_header(): EXAMPLE_HEADER, this test will start to fail. In that case, please update the monkey-patching of EXAMPLE_HEADER in conf.py. """ - pytest.importorskip('sphinx_gallery', minversion='0.16.0') + pytest.importorskip('sphinx_gallery', minversion='0.20.0') from sphinx_gallery import gen_rst EXAMPLE_HEADER = """ @@ -25,7 +25,7 @@ def test_sphinx_gallery_example_header(): :class: sphx-glr-download-link-note :ref:`Go to the end ` - to download the full example code.{2} + to download the full example code{2} .. rst-class:: sphx-glr-example-title From 1957ba391889a4d6b9048b77080f62b1a1dbcad0 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Fri, 12 Dec 2025 12:24:39 -0600 Subject: [PATCH 005/120] Zenodo v3.10.8 --- doc/_static/zenodo_cache/17595503.svg | 35 +++++++++++++++++++++++++++ doc/project/citing.rst | 3 +++ tools/cache_zenodo_svg.py | 1 + 3 files changed, 39 insertions(+) create mode 100644 doc/_static/zenodo_cache/17595503.svg diff --git a/doc/_static/zenodo_cache/17595503.svg b/doc/_static/zenodo_cache/17595503.svg new file mode 100644 index 000000000000..891bd118d125 --- /dev/null +++ b/doc/_static/zenodo_cache/17595503.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + DOI + + + DOI + + + 10.5281/zenodo.17595503 + + + 10.5281/zenodo.17595503 + + + \ No newline at end of file diff --git a/doc/project/citing.rst b/doc/project/citing.rst index c5e56e6f12d4..1f8c6509e9e6 100644 --- a/doc/project/citing.rst +++ b/doc/project/citing.rst @@ -32,6 +32,9 @@ By version .. START OF AUTOGENERATED +v3.10.8 + .. image:: ../_static/zenodo_cache/17595503.svg + :target: https://doi.org/10.5281/zenodo.17595503 v3.10.7 .. image:: ../_static/zenodo_cache/17298696.svg :target: https://doi.org/10.5281/zenodo.17298696 diff --git a/tools/cache_zenodo_svg.py b/tools/cache_zenodo_svg.py index 07b67a3e04ee..2ee72c6a89fa 100644 --- a/tools/cache_zenodo_svg.py +++ b/tools/cache_zenodo_svg.py @@ -63,6 +63,7 @@ def _get_xdg_cache_dir(): if __name__ == "__main__": data = { + "v3.10.8": "17595503", "v3.10.7": "17298696", "v3.10.6": "16999430", "v3.10.5": "16644850", From 9d0781d25f363466c71898dabb1e1abffe14c504 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 15 Dec 2025 09:41:14 -0500 Subject: [PATCH 006/120] Backport PR #30858: DOC: reinstate "codex" search term --- doc/conf.py | 29 +---------------------------- doc/sphinxext/util.py | 32 ++++++++++++++++++++++++++++++++ lib/matplotlib/tests/test_doc.py | 2 +- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 03df9340e66c..292aff3e1983 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -200,8 +200,6 @@ def _check_dependencies(): else: sg_matplotlib_animations = True -# The following import is only necessary to monkey patch the signature later on -from sphinx_gallery import gen_rst # Prevent plt.show() from emitting a non-GUI backend warning. warnings.filterwarnings('ignore', category=UserWarning, @@ -299,7 +297,7 @@ def autodoc_process_bases(app, name, obj, options, bases): 'reference_url': {'matplotlib': None, 'mpl_toolkits': None}, 'prefer_full_module': {r'mpl_toolkits\.'}, 'remove_config_comments': True, - 'reset_modules': ('matplotlib', clear_basic_units), + 'reset_modules': ('matplotlib', clear_basic_units, 'sphinxext.util.patch_header'), 'subsection_order': gallery_order_sectionorder, 'thumbnail_size': (320, 224), 'within_subsection_order': gallery_order_subsectionorder, @@ -347,31 +345,6 @@ def gallery_image_warning_filter(record): mathmpl_fontsize = 11.0 mathmpl_srcset = ['2x'] -# Monkey-patching gallery header to include search keywords -gen_rst.EXAMPLE_HEADER = """ -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "{0}" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. meta:: - :keywords: codex - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code{2} - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_{1}: - -""" - # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/doc/sphinxext/util.py b/doc/sphinxext/util.py index 14097ba9396a..c0f336eaea18 100644 --- a/doc/sphinxext/util.py +++ b/doc/sphinxext/util.py @@ -1,5 +1,7 @@ import sys +from sphinx_gallery import gen_rst + def matplotlib_reduced_latex_scraper(block, block_vars, gallery_conf, **kwargs): @@ -19,3 +21,33 @@ def matplotlib_reduced_latex_scraper(block, block_vars, gallery_conf, # Clear basic_units module to re-register with unit registry on import. def clear_basic_units(gallery_conf, fname): return sys.modules.pop('basic_units', None) + + +# Monkey-patching gallery header to include search keywords +EXAMPLE_HEADER = """ +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "{0}" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. meta:: + :keywords: codex + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code{2} + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_{1}: + +""" + + +def patch_header(gallery_conf, fname): + gen_rst.EXAMPLE_HEADER = EXAMPLE_HEADER diff --git a/lib/matplotlib/tests/test_doc.py b/lib/matplotlib/tests/test_doc.py index 6e8ce9fd630c..f3d6d6e3fd5d 100644 --- a/lib/matplotlib/tests/test_doc.py +++ b/lib/matplotlib/tests/test_doc.py @@ -7,7 +7,7 @@ def test_sphinx_gallery_example_header(): This test monitors that the version we have copied is still the same as the EXAMPLE_HEADER in sphinx-gallery. If sphinx-gallery changes its EXAMPLE_HEADER, this test will start to fail. In that case, please update - the monkey-patching of EXAMPLE_HEADER in conf.py. + the monkey-patching of EXAMPLE_HEADER in sphinxext/util.py. """ pytest.importorskip('sphinx_gallery', minversion='0.20.0') from sphinx_gallery import gen_rst From 44431a6e9439606c93aa8178da49b40fa2dbe4d6 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 2 Jan 2026 21:57:18 +0100 Subject: [PATCH 007/120] Backport PR #30910: DOC: Improve writer parameter docs of Animation.save() --- lib/matplotlib/animation.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/animation.py b/lib/matplotlib/animation.py index a87f00201124..a4eb80ad1b34 100644 --- a/lib/matplotlib/animation.py +++ b/lib/matplotlib/animation.py @@ -951,9 +951,21 @@ def save(self, filename, writer=None, fps=None, dpi=None, codec=None, filename : str The output filename, e.g., :file:`mymovie.mp4`. - writer : `MovieWriter` or str, default: :rc:`animation.writer` - A `MovieWriter` instance to use or a key that identifies a - class to use, such as 'ffmpeg'. + writer : `AbstractMovieWriter` subclass or str, default: :rc:`animation.writer` + The writer used to grab the frames and create the movie file. + This can be an instance of an `AbstractMovieWriter` subclass or a + string. The builtin writers are + + ================== ============================== + str class + ================== ============================== + 'ffmpeg' `.FFMpegWriter` + 'ffmpeg_file' `.FFMpegFileWriter` + 'imagemagick' `.ImageMagickWriter` + 'imagemagick_file' `.ImageMagickFileWriter` + 'pillow' `.PillowWriter` + 'html' `.HTMLWriter` + ================== ============================== fps : int, optional Movie frame rate (per second). If not set, the frame rate from the From a59d1d27c90d1bb7da203251febca72ea04f0eaa Mon Sep 17 00:00:00 2001 From: Steve Berardi <6608085+steveberardi@users.noreply.github.com> Date: Wed, 14 Jan 2026 09:28:51 -0800 Subject: [PATCH 008/120] Backport PR #30960: SVG backend - handle font weight as integer --- lib/matplotlib/backends/backend_svg.py | 3 ++- lib/matplotlib/font_manager.py | 2 +- lib/matplotlib/tests/test_backend_svg.py | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index 2193dc6b6cdc..7789ec2cd882 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -1132,7 +1132,8 @@ def _draw_text_as_text(self, gc, x, y, s, prop, angle, ismath, mtext=None): font_style['font-style'] = prop.get_style() if prop.get_variant() != 'normal': font_style['font-variant'] = prop.get_variant() - weight = fm.weight_dict[prop.get_weight()] + weight = prop.get_weight() + weight = fm.weight_dict.get(weight, weight) # convert to int if weight != 400: font_style['font-weight'] = f'{weight}' diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index 9aa8dccde444..a44d5bd76b9a 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -744,7 +744,7 @@ def get_variant(self): def get_weight(self): """ - Set the font weight. Options are: A numeric value in the + Get the font weight. Options are: A numeric value in the range 0-1000 or one of 'light', 'normal', 'regular', 'book', 'medium', 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 'extra bold', 'black' diff --git a/lib/matplotlib/tests/test_backend_svg.py b/lib/matplotlib/tests/test_backend_svg.py index 509136fe323e..0f9f5f19afb5 100644 --- a/lib/matplotlib/tests/test_backend_svg.py +++ b/lib/matplotlib/tests/test_backend_svg.py @@ -73,7 +73,8 @@ def test_bold_font_output(): ax.plot(np.arange(10), np.arange(10)) ax.set_xlabel('nonbold-xlabel') ax.set_ylabel('bold-ylabel', fontweight='bold') - ax.set_title('bold-title', fontweight='bold') + # set weight as integer to assert it's handled properly + ax.set_title('bold-title', fontweight=600) @image_comparison(['bold_font_output_with_none_fonttype.svg']) @@ -83,7 +84,8 @@ def test_bold_font_output_with_none_fonttype(): ax.plot(np.arange(10), np.arange(10)) ax.set_xlabel('nonbold-xlabel') ax.set_ylabel('bold-ylabel', fontweight='bold') - ax.set_title('bold-title', fontweight='bold') + # set weight as integer to assert it's handled properly + ax.set_title('bold-title', fontweight=600) @check_figures_equal(tol=20) From bc4431823a9d02dd35367c04aee0a9a4d8ad5c6d Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Thu, 15 Jan 2026 11:07:29 +0100 Subject: [PATCH 009/120] Backport PR #30952: DOC: Tutorial on API shortcuts --- galleries/tutorials/coding_shortcuts.py | 172 ++++++++++++++++++++++++ galleries/tutorials/index.rst | 18 +++ 2 files changed, 190 insertions(+) create mode 100644 galleries/tutorials/coding_shortcuts.py diff --git a/galleries/tutorials/coding_shortcuts.py b/galleries/tutorials/coding_shortcuts.py new file mode 100644 index 000000000000..46868482598f --- /dev/null +++ b/galleries/tutorials/coding_shortcuts.py @@ -0,0 +1,172 @@ +""" +================ +Coding shortcuts +================ + +Matplotlib's primary and universal API is the :ref:`Axes interface `. +While it is clearly structured and powerful, it can sometimes feel overly verbose and +thus cumbersome to write. This page collects patterns for condensing the code +of the Axes-based API and achieving the same results with less typing for many simpler +plots. + +.. note:: + + The :ref:`pyplot interface ` is an alternative more compact + interface, and was historically modeled to be similar to MATLAB. It remains a + valid approach for those who want to use it. However, it has the disadvantage that + it achieves its brevity through implicit assumptions that you have to understand. + + Since it follows a different paradigm, switching between the Axes interface and + the pyplot interface requires a shift of the mental model, and some code rewrite, + if the code develops to a point at which pyplot no longer provides enough + flexibility. + +This tutorial goes the other way round, starting from the standard verbose Axes +interface and using its capabilities for shortcuts when you don't need all the +generality. + +Let's assume we want to make a plot of the number of daylight hours per day over the +year in London. + +The standard approach with the Axes interface looks like this. +""" + +import matplotlib.pyplot as plt +import numpy as np + +day = np.arange(365) +hours = 4.276 * np.sin(2 * np.pi * (day - 80)/365) + 12.203 + +fig, ax = plt.subplots() +ax.plot(day, hours, color="orange") +ax.set_xlabel("day") +ax.set_ylabel("daylight hours") +ax.set_title("London") +plt.show() + +# %% +# Note that we've included ``plt.show()`` here. This is needed to show the plot window +# when running from a command line or in a Python script. If you run a Jupyter notebook, +# this command is automatically executed at the end of each cell. +# +# For the rest of the tutorial, we'll assume that we are in a notebook and leave this +# out for brevity. Depending on your context you may still need it. +# +# If you instead want to save to a file, use ``fig.savefig("daylight.png")``. +# +# +# Collect Axes properties into a single ``set()`` call +# ==================================================== +# +# The properties of Matplotlib Artists can be modified through their respective +# ``set_*()`` methods. Artists additionally have a generic ``set()`` method, that takes +# keyword arguments and is equivalent to calling all the respective ``set_*()`` methods. +# :: +# +# ax.set_xlabel("day") +# ax.set_ylabel("daylight hours") +# +# can also be written as :: +# +# ax.set(xlabel="day", ylabel="daylight hours") +# +# This is the most simple and effective reduction you can do. With that we can shorten +# the above plot to + +fig, ax = plt.subplots() +ax.plot(day, hours, color="orange") +ax.set(xlabel="day", ylabel="daylight hours", title="London") + +# %% +# +# This works as long as you only need to pass one parameter to the ``set_*()`` function. +# The individual functions are still necessary if you want more control, e.g. +# ``set_title("London", fontsize=16)``. +# +# +# Not storing a reference to the figure +# ===================================== +# Another nuisance of ``fig, ax = plt.subplots()`` is that you always create a ``fig`` +# variable, even if you don't use it. A slightly shorter version would be using the +# standard variable for unused value in Python (``_``): ``_, ax = plt.subplots()``. +# However, that's only marginally better. +# +# You can work around this by separating figure and Axes creation and chaining them :: +# +# ax = plt.figure().add_subplot() +# +# This is a bit cleaner logically and has the slight advantage that you could set +# figure properties inline as well; e.g. ``plt.figure(facecolor="lightgoldenrod")``. +# But it has the disadvantage that it's longer than ``fig, ax = plt.subplots()``. +# +# You can still obtain the figure from the Axes if needed, e.g. :: +# +# ax.figure.savefig("daylight_hours.png") +# +# The example code now looks like this: + +ax = plt.figure().add_subplot() +ax.plot(day, hours, color="orange") +ax.set(xlabel="day", ylabel="daylight hours", title="London") + +# %% +# Define Axes properties during axes creation +# =========================================== +# The ``set_*`` methods as well as ``set`` modify existing objects. You can +# alternatively define them right at creation. Since you typically don't instantiate +# classes yourself in Matplotlib, but rather call some factory function that creates +# the object and wires it up correctly with the plot, this may seem less obvious. But +# in fact you just pass the desired properties to the factory functions. You are likely +# doing this already in some places without realizing. Consider the function to create +# a line :: +# +# ax.plot(x, y, color="orange") +# +# This is equivalent to :: +# +# line, = ax.plot(x, y) +# line.set_color("orange") +# +# The same can be done with functions that create Axes. + +ax = plt.figure().add_subplot(xlabel="day", ylabel="daylight hours", title="London") +ax.plot(day, hours, color="orange") + +# %% +# .. important:: +# The Axes properties are only accepted as keyword arguments by +# `.Figure.add_subplot`, which creates a single Axes. +# +# For `.Figure.subplots` and `.pyplot.subplots`, you'd have to pass the properties +# as a dict via the keyword argument ``subplot_kw``. The limitation here is that +# such parameters are given to all Axes. For example, if you need two subplots +# (``fig, (ax1, ax2) = plt.subplots(1, 2)``) with different labels, you have to +# set them individually. +# +# Defining Axes properties during creation is best used for single subplots or when +# all subplots share the same properties. +# +# +# Using implicit figure creation +# ============================== +# You can go even further by tapping into the pyplot logic and use `.pyplot.axes` to +# create the axes: + +ax = plt.axes(xlabel="day", ylabel="daylight hours", title="London") +ax.plot(day, hours, color="orange") + +# %% +# .. warning:: +# When using this, you have to be aware of the implicit figure semantics of pyplot. +# ``plt.axes()`` will only create a new figure if no figure exists. Otherwise, it +# will add the Axes to the current existing figure, which is likely not what you +# want. +# +# Not storing a reference to the Axes +# =================================== +# If you only need to visualize one dataset, you can append the plot command +# directly to the Axes creation. This may be useful e.g. in notebooks, +# where you want to create a plot with some configuration, but as little distracting +# code as possible: + +plt.axes(xlabel="day", ylabel="daylight hours").plot(day, hours, color="orange") diff --git a/galleries/tutorials/index.rst b/galleries/tutorials/index.rst index 48187a862a2e..76c0037dca11 100644 --- a/galleries/tutorials/index.rst +++ b/galleries/tutorials/index.rst @@ -32,6 +32,23 @@ a :ref:`FAQ ` in our :ref:`user guide `. +.. raw:: html + +
+ +.. only:: html + + .. image:: /tutorials/images/thumb/sphx_glr_coding_shortcuts_thumb.png + :alt: Coding shortcuts + + :ref:`sphx_glr_tutorials_coding_shortcuts.py` + +.. raw:: html + +
Coding shortcuts
+
+ + .. raw:: html
@@ -92,6 +109,7 @@ a :ref:`FAQ ` in our :ref:`user guide `. :hidden: /tutorials/pyplot + /tutorials/coding_shortcuts /tutorials/images /tutorials/lifecycle /tutorials/artists From efb581cc82718c7c485674e6d886ffc7aa606d23 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Thu, 15 Jan 2026 11:07:29 +0100 Subject: [PATCH 010/120] Backport PR #30952: DOC: Tutorial on API shortcuts --- galleries/tutorials/coding_shortcuts.py | 172 ++++++++++++++++++++++++ galleries/tutorials/index.rst | 18 +++ 2 files changed, 190 insertions(+) create mode 100644 galleries/tutorials/coding_shortcuts.py diff --git a/galleries/tutorials/coding_shortcuts.py b/galleries/tutorials/coding_shortcuts.py new file mode 100644 index 000000000000..46868482598f --- /dev/null +++ b/galleries/tutorials/coding_shortcuts.py @@ -0,0 +1,172 @@ +""" +================ +Coding shortcuts +================ + +Matplotlib's primary and universal API is the :ref:`Axes interface `. +While it is clearly structured and powerful, it can sometimes feel overly verbose and +thus cumbersome to write. This page collects patterns for condensing the code +of the Axes-based API and achieving the same results with less typing for many simpler +plots. + +.. note:: + + The :ref:`pyplot interface ` is an alternative more compact + interface, and was historically modeled to be similar to MATLAB. It remains a + valid approach for those who want to use it. However, it has the disadvantage that + it achieves its brevity through implicit assumptions that you have to understand. + + Since it follows a different paradigm, switching between the Axes interface and + the pyplot interface requires a shift of the mental model, and some code rewrite, + if the code develops to a point at which pyplot no longer provides enough + flexibility. + +This tutorial goes the other way round, starting from the standard verbose Axes +interface and using its capabilities for shortcuts when you don't need all the +generality. + +Let's assume we want to make a plot of the number of daylight hours per day over the +year in London. + +The standard approach with the Axes interface looks like this. +""" + +import matplotlib.pyplot as plt +import numpy as np + +day = np.arange(365) +hours = 4.276 * np.sin(2 * np.pi * (day - 80)/365) + 12.203 + +fig, ax = plt.subplots() +ax.plot(day, hours, color="orange") +ax.set_xlabel("day") +ax.set_ylabel("daylight hours") +ax.set_title("London") +plt.show() + +# %% +# Note that we've included ``plt.show()`` here. This is needed to show the plot window +# when running from a command line or in a Python script. If you run a Jupyter notebook, +# this command is automatically executed at the end of each cell. +# +# For the rest of the tutorial, we'll assume that we are in a notebook and leave this +# out for brevity. Depending on your context you may still need it. +# +# If you instead want to save to a file, use ``fig.savefig("daylight.png")``. +# +# +# Collect Axes properties into a single ``set()`` call +# ==================================================== +# +# The properties of Matplotlib Artists can be modified through their respective +# ``set_*()`` methods. Artists additionally have a generic ``set()`` method, that takes +# keyword arguments and is equivalent to calling all the respective ``set_*()`` methods. +# :: +# +# ax.set_xlabel("day") +# ax.set_ylabel("daylight hours") +# +# can also be written as :: +# +# ax.set(xlabel="day", ylabel="daylight hours") +# +# This is the most simple and effective reduction you can do. With that we can shorten +# the above plot to + +fig, ax = plt.subplots() +ax.plot(day, hours, color="orange") +ax.set(xlabel="day", ylabel="daylight hours", title="London") + +# %% +# +# This works as long as you only need to pass one parameter to the ``set_*()`` function. +# The individual functions are still necessary if you want more control, e.g. +# ``set_title("London", fontsize=16)``. +# +# +# Not storing a reference to the figure +# ===================================== +# Another nuisance of ``fig, ax = plt.subplots()`` is that you always create a ``fig`` +# variable, even if you don't use it. A slightly shorter version would be using the +# standard variable for unused value in Python (``_``): ``_, ax = plt.subplots()``. +# However, that's only marginally better. +# +# You can work around this by separating figure and Axes creation and chaining them :: +# +# ax = plt.figure().add_subplot() +# +# This is a bit cleaner logically and has the slight advantage that you could set +# figure properties inline as well; e.g. ``plt.figure(facecolor="lightgoldenrod")``. +# But it has the disadvantage that it's longer than ``fig, ax = plt.subplots()``. +# +# You can still obtain the figure from the Axes if needed, e.g. :: +# +# ax.figure.savefig("daylight_hours.png") +# +# The example code now looks like this: + +ax = plt.figure().add_subplot() +ax.plot(day, hours, color="orange") +ax.set(xlabel="day", ylabel="daylight hours", title="London") + +# %% +# Define Axes properties during axes creation +# =========================================== +# The ``set_*`` methods as well as ``set`` modify existing objects. You can +# alternatively define them right at creation. Since you typically don't instantiate +# classes yourself in Matplotlib, but rather call some factory function that creates +# the object and wires it up correctly with the plot, this may seem less obvious. But +# in fact you just pass the desired properties to the factory functions. You are likely +# doing this already in some places without realizing. Consider the function to create +# a line :: +# +# ax.plot(x, y, color="orange") +# +# This is equivalent to :: +# +# line, = ax.plot(x, y) +# line.set_color("orange") +# +# The same can be done with functions that create Axes. + +ax = plt.figure().add_subplot(xlabel="day", ylabel="daylight hours", title="London") +ax.plot(day, hours, color="orange") + +# %% +# .. important:: +# The Axes properties are only accepted as keyword arguments by +# `.Figure.add_subplot`, which creates a single Axes. +# +# For `.Figure.subplots` and `.pyplot.subplots`, you'd have to pass the properties +# as a dict via the keyword argument ``subplot_kw``. The limitation here is that +# such parameters are given to all Axes. For example, if you need two subplots +# (``fig, (ax1, ax2) = plt.subplots(1, 2)``) with different labels, you have to +# set them individually. +# +# Defining Axes properties during creation is best used for single subplots or when +# all subplots share the same properties. +# +# +# Using implicit figure creation +# ============================== +# You can go even further by tapping into the pyplot logic and use `.pyplot.axes` to +# create the axes: + +ax = plt.axes(xlabel="day", ylabel="daylight hours", title="London") +ax.plot(day, hours, color="orange") + +# %% +# .. warning:: +# When using this, you have to be aware of the implicit figure semantics of pyplot. +# ``plt.axes()`` will only create a new figure if no figure exists. Otherwise, it +# will add the Axes to the current existing figure, which is likely not what you +# want. +# +# Not storing a reference to the Axes +# =================================== +# If you only need to visualize one dataset, you can append the plot command +# directly to the Axes creation. This may be useful e.g. in notebooks, +# where you want to create a plot with some configuration, but as little distracting +# code as possible: + +plt.axes(xlabel="day", ylabel="daylight hours").plot(day, hours, color="orange") diff --git a/galleries/tutorials/index.rst b/galleries/tutorials/index.rst index 48187a862a2e..76c0037dca11 100644 --- a/galleries/tutorials/index.rst +++ b/galleries/tutorials/index.rst @@ -32,6 +32,23 @@ a :ref:`FAQ ` in our :ref:`user guide `.
+.. raw:: html + +
+ +.. only:: html + + .. image:: /tutorials/images/thumb/sphx_glr_coding_shortcuts_thumb.png + :alt: Coding shortcuts + + :ref:`sphx_glr_tutorials_coding_shortcuts.py` + +.. raw:: html + +
Coding shortcuts
+
+ + .. raw:: html
@@ -92,6 +109,7 @@ a :ref:`FAQ ` in our :ref:`user guide `. :hidden: /tutorials/pyplot + /tutorials/coding_shortcuts /tutorials/images /tutorials/lifecycle /tutorials/artists From 8c7d40fb2771abf78e9a1391c938e840c65aead0 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:34:01 +0000 Subject: [PATCH 011/120] Backport PR #30969: DOC: Simplify barh() example --- galleries/examples/lines_bars_and_markers/barh.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/galleries/examples/lines_bars_and_markers/barh.py b/galleries/examples/lines_bars_and_markers/barh.py index 5493c7456c75..c8834e252cb6 100644 --- a/galleries/examples/lines_bars_and_markers/barh.py +++ b/galleries/examples/lines_bars_and_markers/barh.py @@ -15,12 +15,10 @@ # Example data people = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim') -y_pos = np.arange(len(people)) performance = 3 + 10 * np.random.rand(len(people)) error = np.random.rand(len(people)) -ax.barh(y_pos, performance, xerr=error, align='center') -ax.set_yticks(y_pos, labels=people) +ax.barh(people, performance, xerr=error, align='center') ax.invert_yaxis() # labels read top-to-bottom ax.set_xlabel('Performance') ax.set_title('How fast do you want to go today?') From fe5ca0610b2ef745bf4af8021f92911b53071c00 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:34:01 +0000 Subject: [PATCH 012/120] Backport PR #30969: DOC: Simplify barh() example --- galleries/examples/lines_bars_and_markers/barh.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/galleries/examples/lines_bars_and_markers/barh.py b/galleries/examples/lines_bars_and_markers/barh.py index 5493c7456c75..c8834e252cb6 100644 --- a/galleries/examples/lines_bars_and_markers/barh.py +++ b/galleries/examples/lines_bars_and_markers/barh.py @@ -15,12 +15,10 @@ # Example data people = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim') -y_pos = np.arange(len(people)) performance = 3 + 10 * np.random.rand(len(people)) error = np.random.rand(len(people)) -ax.barh(y_pos, performance, xerr=error, align='center') -ax.set_yticks(y_pos, labels=people) +ax.barh(people, performance, xerr=error, align='center') ax.invert_yaxis() # labels read top-to-bottom ax.set_xlabel('Performance') ax.set_title('How fast do you want to go today?') From 89a35d8aaf4c7c4d15f0cc0876293f4c6156bbd9 Mon Sep 17 00:00:00 2001 From: Scott Shambaugh <14363975+scottshambaugh@users.noreply.github.com> Date: Sat, 17 Jan 2026 13:01:03 -0700 Subject: [PATCH 013/120] Backport PR #30985: MNT: do not assign a numpy array shape --- lib/matplotlib/tests/test_axes.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 159fc70282b8..b9eb145b1410 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -2182,9 +2182,8 @@ def test_pcolor_regression(pd): time_axis, y_axis = np.meshgrid(times, y_vals) shape = (len(y_vals) - 1, len(times) - 1) - z_data = np.arange(shape[0] * shape[1]) + z_data = np.arange(shape[0] * shape[1]).reshape(shape) - z_data.shape = shape try: register_matplotlib_converters() From 2deb54c8d78ba071ba4042af1be81bea79b6a164 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Mon, 26 Jan 2026 14:37:14 +0000 Subject: [PATCH 014/120] Backport PR #31035: DOCS: Fix typo in time array step size comment --- galleries/examples/animation/double_pendulum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galleries/examples/animation/double_pendulum.py b/galleries/examples/animation/double_pendulum.py index 7a42a6d989ba..76076341d5c2 100644 --- a/galleries/examples/animation/double_pendulum.py +++ b/galleries/examples/animation/double_pendulum.py @@ -51,7 +51,7 @@ def derivs(t, state): return dydx -# create a time array from 0..t_stop sampled at 0.02 second steps +# create a time array from 0..t_stop sampled at 0.01 second steps dt = 0.01 t = np.arange(0, t_stop, dt) From 3039ff1b3baa223f5b4d59412829b7f33f9271d1 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Mon, 26 Jan 2026 14:37:14 +0000 Subject: [PATCH 015/120] Backport PR #31035: DOCS: Fix typo in time array step size comment --- galleries/examples/animation/double_pendulum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/galleries/examples/animation/double_pendulum.py b/galleries/examples/animation/double_pendulum.py index 7a42a6d989ba..76076341d5c2 100644 --- a/galleries/examples/animation/double_pendulum.py +++ b/galleries/examples/animation/double_pendulum.py @@ -51,7 +51,7 @@ def derivs(t, state): return dydx -# create a time array from 0..t_stop sampled at 0.02 second steps +# create a time array from 0..t_stop sampled at 0.01 second steps dt = 0.01 t = np.arange(0, t_stop, dt) From 313a44d28fea53da5db65a69d41b7009af91a780 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 4 Feb 2026 15:41:41 -0500 Subject: [PATCH 016/120] Backport PR #31075: Fix remove method for figure title and xy-labels --- lib/matplotlib/figure.py | 7 +++++++ lib/matplotlib/tests/test_figure.py | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 089141727189..e5794954abb8 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -376,10 +376,17 @@ def _suplabels(self, t, info, **kwargs): else: suplab = self.text(x, y, t, **kwargs) setattr(self, info['name'], suplab) + suplab._remove_method = functools.partial(self._remove_suplabel, + name=info['name']) + suplab._autopos = autopos self.stale = True return suplab + def _remove_suplabel(self, label, name): + self.texts.remove(label) + setattr(self, name, None) + @_docstring.Substitution(x0=0.5, y0=0.98, name='super title', ha='center', va='top', rc='title') @_docstring.copy(_suplabels) diff --git a/lib/matplotlib/tests/test_figure.py b/lib/matplotlib/tests/test_figure.py index 3a4ced254091..d24f701b4085 100644 --- a/lib/matplotlib/tests/test_figure.py +++ b/lib/matplotlib/tests/test_figure.py @@ -364,6 +364,28 @@ def test_get_suptitle_supxlabel_supylabel(): assert fig.get_supylabel() == 'supylabel' +def test_remove_suptitle_supxlabel_supylabel(): + fig = plt.figure() + + title = fig.suptitle('suptitle') + xlabel = fig.supxlabel('supxlabel') + ylabel = fig.supylabel('supylabel') + + assert len(fig.texts) == 3 + assert fig._suptitle is not None + assert fig._supxlabel is not None + assert fig._supylabel is not None + + title.remove() + assert fig._suptitle is None + xlabel.remove() + assert fig._supxlabel is None + ylabel.remove() + assert fig._supylabel is None + + assert not fig.texts + + @image_comparison(['alpha_background'], # only test png and svg. The PDF output appears correct, # but Ghostscript does not preserve the background color. From b9d7e7f73eee09ebd33e9c8505c5d0c4d8866dcf Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Fri, 13 Feb 2026 13:22:13 -0600 Subject: [PATCH 017/120] Backport PR #31153: TST: Use correct method of clearing mock objects --- lib/matplotlib/tests/test_backends_interactive.py | 2 +- lib/matplotlib/tests/test_colors.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/tests/test_backends_interactive.py b/lib/matplotlib/tests/test_backends_interactive.py index 4e3c1bbc2bb5..594681391e61 100644 --- a/lib/matplotlib/tests/test_backends_interactive.py +++ b/lib/matplotlib/tests/test_backends_interactive.py @@ -648,7 +648,7 @@ def _impl_test_interactive_timers(): assert mock.call_count > 1 # Now turn it into a single shot timer and verify only one gets triggered - mock.call_count = 0 + mock.reset_mock() timer.single_shot = True timer.start() plt.pause(pause_time) diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index 7da4bab69c15..7ca9c0f77858 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -1590,7 +1590,7 @@ def test_norm_callback(): assert increment.call_count == 2 # We only want autoscale() calls to send out one update signal - increment.call_count = 0 + increment.reset_mock() norm.autoscale([0, 1, 2]) assert increment.call_count == 1 From ef19bdcc9a1b199c00d9948cf73044b9cdfea435 Mon Sep 17 00:00:00 2001 From: Aman Srivastava <160766756+aman-coder03@users.noreply.github.com> Date: Wed, 11 Mar 2026 23:04:28 +0530 Subject: [PATCH 018/120] Backport PR #31278: Fix `clabel` manual argument not accepting unit-typed coordinates --- lib/matplotlib/contour.py | 2 ++ lib/matplotlib/tests/test_datetime.py | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index f7318d578121..4f3e594e9202 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -446,6 +446,8 @@ def add_label_near(self, x, y, inline=True, inline_spacing=5, if transform is None: transform = self.axes.transData if transform: + x = self.axes.convert_xunits(x) + y = self.axes.convert_yunits(y) x, y = transform.transform((x, y)) idx_level_min, idx_vtx_min, proj = self._find_nearest_contour( diff --git a/lib/matplotlib/tests/test_datetime.py b/lib/matplotlib/tests/test_datetime.py index 276056d044ae..9fc133549017 100644 --- a/lib/matplotlib/tests/test_datetime.py +++ b/lib/matplotlib/tests/test_datetime.py @@ -259,11 +259,22 @@ def test_bxp(self): ax.xaxis.set_major_formatter(mpl.dates.DateFormatter("%Y-%m-%d")) ax.set_title('Box plot with datetime data') - @pytest.mark.xfail(reason="Test for clabel not written yet") @mpl.style.context("default") def test_clabel(self): + dates = [datetime.datetime(2023, 10, 1) + datetime.timedelta(days=i) + for i in range(10)] + x = np.arange(-10.0, 5.0, 0.5) + X, Y = np.meshgrid(x, dates) + Z = np.arange(X.size).reshape(X.shape) + fig, ax = plt.subplots() - ax.clabel(...) + CS = ax.contour(X, Y, Z) + labels = ax.clabel(CS, manual=[(x[0], dates[0])]) + assert len(labels) == 1 + assert labels[0].get_text() == '0' + x_pos, y_pos = labels[0].get_position() + assert x_pos == pytest.approx(-10.0, abs=1e-3) + assert y_pos == pytest.approx(mpl.dates.date2num(dates[0]), abs=1e-3) @mpl.style.context("default") def test_contour(self): From d9ef7af11bd65934de92a7cbbfdb8a7716c13b80 Mon Sep 17 00:00:00 2001 From: Mafalda Botelho Date: Mon, 23 Mar 2026 00:03:21 +0000 Subject: [PATCH 019/120] Fix #21409: Make twin axes inherit parent position When set_position() is called before twinx() or twiny(), the twin axes are created using the original subplot position instead of the current position of the parent. Set the twin position from the parent in _make_twin_axes so that twins start aligned with the parent axes. Add a regression test covering both twinx() and twiny(). --- lib/matplotlib/axes/_base.py | 3 +++ lib/matplotlib/tests/test_axes.py | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index f89c231815dc..1a3d142742ac 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -4657,6 +4657,9 @@ def _make_twin_axes(self, *args, **kwargs): twin.set_zorder(self.zorder) self._twinned_axes.join(self, twin) + + twin.set_position(self.get_position()) + return twin def twinx(self, axes_class=None, **kwargs): diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 74d48a89d0c0..849b5d3dc27f 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -477,6 +477,16 @@ def test_twin_inherit_autoscale_setting(): assert not ax_y_off.get_autoscaley_on() +@pytest.mark.parametrize("twin", ("x", "y")) +def test_twin_respects_position_after_set_position(twin): + fig, ax = plt.subplots() + + ax.set_position([0.2, 0.2, 0.5, 0.5]) + ax2 = getattr(ax, f"twin{twin}")() + + assert_allclose(ax.bbox.bounds, ax2.bbox.bounds) + + def test_inverted_cla(): # GitHub PR #5450. Setting autoscale should reset # axes to be non-inverted. From 88d4ec56449927e8acbc8925ca84f7bd12225952 Mon Sep 17 00:00:00 2001 From: Mafalda Botelho Date: Tue, 24 Mar 2026 17:23:39 +0000 Subject: [PATCH 020/120] Refine twin position fix to preserve layout participation --- lib/matplotlib/axes/_base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 1a3d142742ac..b5be77f2bd4b 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -4657,8 +4657,8 @@ def _make_twin_axes(self, *args, **kwargs): twin.set_zorder(self.zorder) self._twinned_axes.join(self, twin) - - twin.set_position(self.get_position()) + if not self.get_in_layout(): + twin.set_position(self.get_position()) return twin From a5435b5a09a951b5d644090f502c7caa9cf92d03 Mon Sep 17 00:00:00 2001 From: Mafalda Botelho Date: Wed, 25 Mar 2026 00:26:59 +0000 Subject: [PATCH 021/120] Address review: preserve original/active positions and fix test + lint --- lib/matplotlib/axes/_base.py | 4 +++- lib/matplotlib/tests/test_axes.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index b5be77f2bd4b..68fd00a46c7e 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -4657,8 +4657,10 @@ def _make_twin_axes(self, *args, **kwargs): twin.set_zorder(self.zorder) self._twinned_axes.join(self, twin) + if not self.get_in_layout(): - twin.set_position(self.get_position()) + twin._set_position(self.get_position(original=True), which="original") + twin._set_position(self.get_position(original=False), which="active") return twin diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 849b5d3dc27f..4d57405f66d7 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -484,7 +484,7 @@ def test_twin_respects_position_after_set_position(twin): ax.set_position([0.2, 0.2, 0.5, 0.5]) ax2 = getattr(ax, f"twin{twin}")() - assert_allclose(ax.bbox.bounds, ax2.bbox.bounds) + assert_allclose(ax.get_position().bounds, ax2.get_position().bounds) def test_inverted_cla(): From ce749b465cb8b787b49e1f8a9b4031e51f89f318 Mon Sep 17 00:00:00 2001 From: Mafalda Botelho Date: Wed, 25 Mar 2026 20:01:11 +0000 Subject: [PATCH 022/120] Clarify manual-position twin sync in code comment --- lib/matplotlib/axes/_base.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 68fd00a46c7e..a09e69b378d9 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -4658,6 +4658,15 @@ def _make_twin_axes(self, *args, **kwargs): self._twinned_axes.join(self, twin) + # If the parent Axes has been manually positioned (set_position() sets + # in_layout=False), the SubplotSpec-based add_subplot(...) path ignores + # that manual position when creating a twin. In that case, explicitly + # copy both the original and active positions to the twin so they start + # aligned. + # + # For layout-managed Axes (in_layout=True), we keep the existing + # SubplotSpec-driven behavior, so layout engines such as tight_layout + # and constrained_layout continue to control positioning. if not self.get_in_layout(): twin._set_position(self.get_position(original=True), which="original") twin._set_position(self.get_position(original=False), which="active") From f32af1d8e71ee524453155c0265a46f913028860 Mon Sep 17 00:00:00 2001 From: Vikash Kumar <163628932+Vikash-Kumar-23@users.noreply.github.com> Date: Sat, 28 Mar 2026 03:38:39 +0530 Subject: [PATCH 023/120] Backport PR #31323: FIX: Prevent crash when removing a subfigure containing subplots --- lib/matplotlib/artist.py | 8 +++++--- lib/matplotlib/tests/test_figure.py | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/artist.py b/lib/matplotlib/artist.py index c87c789048c4..25515da77ed7 100644 --- a/lib/matplotlib/artist.py +++ b/lib/matplotlib/artist.py @@ -240,10 +240,12 @@ def remove(self): # clear stale callback self.stale_callback = None _ax_flag = False - if hasattr(self, 'axes') and self.axes: + ax = getattr(self, 'axes', None) + mouseover_set = getattr(ax, '_mouseover_set', None) + if mouseover_set is not None: # remove from the mouse hit list - self.axes._mouseover_set.discard(self) - self.axes.stale = True + mouseover_set.discard(self) + ax.stale = True self.axes = None # decouple the artist from the Axes _ax_flag = True diff --git a/lib/matplotlib/tests/test_figure.py b/lib/matplotlib/tests/test_figure.py index 3a4ced254091..7fb3598e84bb 100644 --- a/lib/matplotlib/tests/test_figure.py +++ b/lib/matplotlib/tests/test_figure.py @@ -1551,6 +1551,7 @@ def test_subfigures_wspace_hspace(): def test_subfigure_remove(): fig = plt.figure() sfs = fig.subfigures(2, 2) + sfs[1, 1].subplots() sfs[1, 1].remove() assert len(fig.subfigs) == 3 From 5876d06ffed133aecae705d0fff4dae1f54251ef Mon Sep 17 00:00:00 2001 From: Mafalda Botelho Date: Fri, 27 Mar 2026 22:33:55 +0000 Subject: [PATCH 024/120] Add regression test for twinx top spine position --- lib/matplotlib/tests/test_axes.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 4d57405f66d7..588e5edec7a7 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -484,7 +484,21 @@ def test_twin_respects_position_after_set_position(twin): ax.set_position([0.2, 0.2, 0.5, 0.5]) ax2 = getattr(ax, f"twin{twin}")() - assert_allclose(ax.get_position().bounds, ax2.get_position().bounds) + assert_allclose(ax.get_position(original=True).bounds, + ax2.get_position(original=True).bounds) + + assert_allclose(ax.get_position(original=False).bounds, + ax2.get_position(original=False).bounds) + + +@pytest.mark.parametrize("twin", ("x", "y")) +def test_twin_keeps_layout_participation_for_layout_managed_axes(twin): + fig, ax = plt.subplots() + + ax2 = getattr(ax, f"twin{twin}")() + + assert ax.get_in_layout() + assert ax2.get_in_layout() def test_inverted_cla(): From 6aac3dad99575575744972f7b68c80be28ec736a Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Fri, 27 Mar 2026 01:43:56 -0400 Subject: [PATCH 025/120] Backport PR #31401: BLD: Temporarily pin setuptools-scm<10 BLD: Temporarily pin setuptools-scm<10 (cherry picked from commit 443c728e3af423a882d51e758c88577959e0c7d1) --- .github/workflows/cygwin.yml | 2 +- .github/workflows/tests.yml | 2 +- environment.yml | 2 +- pyproject.toml | 4 ++-- requirements/dev/build-requirements.txt | 2 +- requirements/testing/mypy.txt | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/cygwin.yml b/.github/workflows/cygwin.yml index bde902013412..befc83162075 100644 --- a/.github/workflows/cygwin.yml +++ b/.github/workflows/cygwin.yml @@ -181,7 +181,7 @@ jobs: export PATH="/usr/local/bin:$PATH" python -m pip install --no-build-isolation 'contourpy>=1.0.1' python -m pip install --upgrade cycler fonttools \ - packaging pyparsing python-dateutil setuptools-scm \ + packaging pyparsing python-dateutil 'setuptools-scm<10' \ -r requirements_test.txt sphinx ipython python -m pip install --upgrade pycairo 'cairocffi>=0.8' PyGObject && python -c 'import gi; gi.require_version("Gtk", "3.0"); from gi.repository import Gtk' && diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ea402d954137..906c6c4408d7 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -243,7 +243,7 @@ jobs: # Preinstall build requirements to enable no-build-isolation builds. python -m pip install --upgrade $PRE \ 'contourpy>=1.0.1' cycler fonttools kiwisolver importlib_resources \ - packaging pillow 'pyparsing!=3.1.0' python-dateutil setuptools-scm \ + packaging pillow 'pyparsing!=3.1.0' python-dateutil 'setuptools-scm<10' \ 'meson-python>=0.13.1' 'pybind11>=2.13.2' \ -r requirements/testing/all.txt \ ${{ matrix.extra-requirements }} diff --git a/environment.yml b/environment.yml index 2a4f3eff69ea..f39ba3f93f2f 100644 --- a/environment.yml +++ b/environment.yml @@ -26,7 +26,7 @@ dependencies: - pyqt - python>=3.10 - python-dateutil>=2.1 - - setuptools_scm + - setuptools_scm<10 - wxpython # building documentation - colorspacious diff --git a/pyproject.toml b/pyproject.toml index 23c441b52c9c..96b69829e674 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,7 +50,7 @@ requires-python = ">=3.10" dev = [ "meson-python>=0.13.1,<0.17.0", "pybind11>=2.13.2,!=2.13.3", - "setuptools_scm>=7", + "setuptools_scm>=7,<10", # Not required by us but setuptools_scm without a version, cso _if_ # installed, then setuptools_scm 8 requires at least this version. # Unfortunately, we can't do a sort of minimum-if-instaled dependency, so @@ -74,7 +74,7 @@ build-backend = "mesonpy" requires = [ "meson-python>=0.13.1,<0.17.0", "pybind11>=2.13.2,!=2.13.3", - "setuptools_scm>=7", + "setuptools_scm>=7,<10", ] [tool.meson-python.args] diff --git a/requirements/dev/build-requirements.txt b/requirements/dev/build-requirements.txt index 4d2a098c3c4f..372a7d669fb1 100644 --- a/requirements/dev/build-requirements.txt +++ b/requirements/dev/build-requirements.txt @@ -1,3 +1,3 @@ pybind11>=2.13.2,!=2.13.3 meson-python -setuptools-scm +setuptools-scm<10 diff --git a/requirements/testing/mypy.txt b/requirements/testing/mypy.txt index 0cef979a34bf..4421560494d7 100644 --- a/requirements/testing/mypy.txt +++ b/requirements/testing/mypy.txt @@ -22,5 +22,5 @@ packaging>=20.0 pillow>=8 pyparsing>=3 python-dateutil>=2.7 -setuptools_scm>=7 +setuptools_scm>=7,<10 setuptools>=64 From 3c91aec2b20adf547b102c68b37cfdedb03e7d54 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 29 Mar 2026 12:51:07 +0200 Subject: [PATCH 026/120] Backport PR #31420: Fix outdated Savannah URL for freetype download --- subprojects/freetype-2.6.1.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/freetype-2.6.1.wrap b/subprojects/freetype-2.6.1.wrap index 763362b84df0..270556f0d5d3 100644 --- a/subprojects/freetype-2.6.1.wrap +++ b/subprojects/freetype-2.6.1.wrap @@ -1,5 +1,5 @@ [wrap-file] -source_url = https://download.savannah.gnu.org/releases/freetype/freetype-old/freetype-2.6.1.tar.gz +source_url = https://download.savannah.nongnu.org/releases/freetype/freetype-old/freetype-2.6.1.tar.gz source_fallback_url = https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz source_filename = freetype-2.6.1.tar.gz source_hash = 0a3c7dfbda6da1e8fce29232e8e96d987ababbbf71ebc8c75659e4132c367014 From e8df9e59bd26a9f6c2d068b91430926b72358f2e Mon Sep 17 00:00:00 2001 From: Mafalda Botelho Date: Sun, 29 Mar 2026 18:35:52 +0100 Subject: [PATCH 027/120] Add test to ensure twin axes remain aligned after tight_layout --- lib/matplotlib/tests/test_axes.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 588e5edec7a7..5af6a9000dca 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -501,6 +501,16 @@ def test_twin_keeps_layout_participation_for_layout_managed_axes(twin): assert ax2.get_in_layout() +@pytest.mark.parametrize("twin", ("x", "y")) +def test_twin_stays_aligned_after_tight_layout(twin): + fig,ax = plt.subplots() + ax2 = getattr(ax, f"twin{twin}")() + + fig.tight_layout() + + assert_allclose(ax.get_position().bounds, ax2.get_position().bounds) + + def test_inverted_cla(): # GitHub PR #5450. Setting autoscale should reset # axes to be non-inverted. From 486efeea46824c8dbee7f9b069a567351f2c006d Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Mon, 16 Mar 2026 13:13:56 +0000 Subject: [PATCH 028/120] DOC: setting active axes position is ineffective --- lib/matplotlib/axes/_base.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index db85c1eea7fe..5af3b0adcc2d 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -1175,6 +1175,15 @@ def set_position(self, pos, which='both'): which : {'both', 'active', 'original'}, default: 'both' Determines which position variables to change. + .. note:: + This parameter is considered internal. End users should not use it. + + For native Matplotlib `.Axes`, the active position is + determined by a combination of the original position and the + aspect ratio. Any active position set by the user will therefore be + overwritten by internal handling. This option is retained as it may be + relevant for some third party `.Axes` subclasses. + See Also -------- matplotlib.transforms.Bbox.from_bounds From c2a343cfdd9a481b978aecfe8138b710aed6daf5 Mon Sep 17 00:00:00 2001 From: Mafalda Botelho Date: Mon, 30 Mar 2026 12:16:01 +0100 Subject: [PATCH 029/120] Add tests for twin axes alignment with manual positioning_layout --- lib/matplotlib/tests/test_axes.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 5af6a9000dca..75ab359a27eb 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -502,11 +502,13 @@ def test_twin_keeps_layout_participation_for_layout_managed_axes(twin): @pytest.mark.parametrize("twin", ("x", "y")) -def test_twin_stays_aligned_after_tight_layout(twin): - fig,ax = plt.subplots() +def test_twin_stays_aligned_after_constrained_layout(twin): + fig, ax = plt.subplots(constrained_layout=True) + + ax.set_position([0.2, 0.2, 0.5, 0.5]) ax2 = getattr(ax, f"twin{twin}")() - fig.tight_layout() + fig.canvas.draw() assert_allclose(ax.get_position().bounds, ax2.get_position().bounds) From d1575870cb14c688a2d5c209940127424e8972f3 Mon Sep 17 00:00:00 2001 From: Rahul Date: Wed, 1 Apr 2026 12:19:43 +0530 Subject: [PATCH 030/120] FIX: Guard against already removed labels in ContourSet.remove() --- lib/matplotlib/contour.py | 7 +++++-- lib/matplotlib/tests/test_contour.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index eb103dc2fc2a..6b6def824798 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -513,9 +513,12 @@ def labels(self, inline, inline_spacing): self._paths[icon] = Path.make_compound_path(*additions) def remove(self): + axes = self.axes super().remove() - for text in self.labelTexts: - text.remove() + for text in list(self.labelTexts): + if axes is not None and text in axes.texts: + text.remove() + self.labelTexts.clear() def _find_closest_point_on_path(xys, p): diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index 42ad75862b2e..c506ad5faec3 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -876,3 +876,18 @@ def test_contour_aliases(fig_test, fig_ref): def test_contour_singular_color(): with pytest.raises(TypeError): plt.figure().add_subplot().contour([[0, 1], [2, 3]], color="r") + +def test_contour_remove_after_label_removed(): + # Test that CS.remove() works even if labels were manually removed first + # Regression test for https://github.com/matplotlib/matplotlib/issues/31404 + fig, ax = plt.subplots() + x = np.linspace(-3.0, 3.0, 20) + y = np.linspace(-2.0, 2.0, 20) + X, Y = np.meshgrid(x, y) + Z = np.exp(-X**2 - Y**2) + CS = ax.contour(X, Y, Z) + labels = ax.clabel(CS, colors='k') + for label in labels: + label.remove() + ax.clabel(CS, colors='r') + CS.remove() # Should not raise ValueError From ada7b700ca67a7af713b5b84a92c8a8e9adaa300 Mon Sep 17 00:00:00 2001 From: Rahul Date: Wed, 1 Apr 2026 12:22:33 +0530 Subject: [PATCH 031/120] FIX: Add blank lines before test function --- lib/matplotlib/tests/test_contour.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index c506ad5faec3..5543180efd6a 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -877,6 +877,8 @@ def test_contour_singular_color(): with pytest.raises(TypeError): plt.figure().add_subplot().contour([[0, 1], [2, 3]], color="r") + + def test_contour_remove_after_label_removed(): # Test that CS.remove() works even if labels were manually removed first # Regression test for https://github.com/matplotlib/matplotlib/issues/31404 From ff2eab950f62c1e54526a7f1d3672f70f7ca4b5a Mon Sep 17 00:00:00 2001 From: Rahul Date: Wed, 1 Apr 2026 16:50:14 +0530 Subject: [PATCH 032/120] FIX: Address review feedback - simpler fix and cleaner test --- lib/matplotlib/contour.py | 5 +++-- lib/matplotlib/tests/test_contour.py | 26 ++++++++++---------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 6b6def824798..c003828e293e 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -513,11 +513,12 @@ def labels(self, inline, inline_spacing): self._paths[icon] = Path.make_compound_path(*additions) def remove(self): - axes = self.axes super().remove() for text in list(self.labelTexts): - if axes is not None and text in axes.texts: + try: text.remove() + except ValueError: + pass self.labelTexts.clear() diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index 5543180efd6a..d59e4cc5b63a 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -804,6 +804,16 @@ def test_contour_remove(): assert ax.get_children() == orig_children +def test_contour_remove_with_labels(): + ax = plt.figure().add_subplot() + cs = ax.contour(np.arange(16).reshape((4, 4))) + labels = cs.clabel() + for label in labels: + label.remove() + cs.clabel() + cs.remove() + + def test_contour_no_args(): fig, ax = plt.subplots() data = [[0, 1], [1, 0]] @@ -877,19 +887,3 @@ def test_contour_singular_color(): with pytest.raises(TypeError): plt.figure().add_subplot().contour([[0, 1], [2, 3]], color="r") - - -def test_contour_remove_after_label_removed(): - # Test that CS.remove() works even if labels were manually removed first - # Regression test for https://github.com/matplotlib/matplotlib/issues/31404 - fig, ax = plt.subplots() - x = np.linspace(-3.0, 3.0, 20) - y = np.linspace(-2.0, 2.0, 20) - X, Y = np.meshgrid(x, y) - Z = np.exp(-X**2 - Y**2) - CS = ax.contour(X, Y, Z) - labels = ax.clabel(CS, colors='k') - for label in labels: - label.remove() - ax.clabel(CS, colors='r') - CS.remove() # Should not raise ValueError From 8038b6196f50c779f9f794212438c01b1feb69cf Mon Sep 17 00:00:00 2001 From: Rahul Date: Wed, 1 Apr 2026 16:54:07 +0530 Subject: [PATCH 033/120] FIX: Remove trailing newline --- lib/matplotlib/tests/test_contour.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index d59e4cc5b63a..242d69bf113d 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -886,4 +886,3 @@ def test_contour_aliases(fig_test, fig_ref): def test_contour_singular_color(): with pytest.raises(TypeError): plt.figure().add_subplot().contour([[0, 1], [2, 3]], color="r") - From d35b9cd9fcb835db460ac66c5304cdff2583e0f4 Mon Sep 17 00:00:00 2001 From: Rahul Date: Fri, 3 Apr 2026 11:51:04 +0530 Subject: [PATCH 034/120] FIX: Add warning and docs for manual label removal in ContourSet --- lib/matplotlib/contour.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index c003828e293e..4b40ece0fd34 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -143,6 +143,10 @@ def clabel(self, levels=None, *, ------- labels A list of `.Text` instances for the labels. + + Note: The returned .Text instances should not be individually + removed or have their geometry modified. To remove all labels, + remove the entire .ContourSet and recreate it. """ if self.filled: @@ -518,7 +522,12 @@ def remove(self): try: text.remove() except ValueError: - pass + import warnings + warnings.warn( + "Some labels were manually removed before the ContourSet. " + "To remove labels cleanly, remove the entire ContourSet " + "and recreate it.", + UserWarning, stacklevel=2) self.labelTexts.clear() From ca0515a18e05e2d965eb2d54043140a1bd7012c3 Mon Sep 17 00:00:00 2001 From: Rahul Date: Fri, 3 Apr 2026 12:15:41 +0530 Subject: [PATCH 035/120] TST: Expect UserWarning when labels manually removed before CS.remove() --- lib/matplotlib/tests/test_contour.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index 242d69bf113d..b3f25567d384 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -811,7 +811,8 @@ def test_contour_remove_with_labels(): for label in labels: label.remove() cs.clabel() - cs.remove() + with pytest.warns(UserWarning, match="Some labels were manually removed"): + cs.remove() def test_contour_no_args(): From b23fd27bf5f5c9ac54269c293d1a1da78c0cf547 Mon Sep 17 00:00:00 2001 From: Rahul Date: Fri, 3 Apr 2026 17:13:51 +0530 Subject: [PATCH 036/120] FIX: Address timhoffm review feedback --- lib/matplotlib/contour.py | 14 ++++++-------- lib/matplotlib/tests/test_contour.py | 4 +--- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 4b40ece0fd34..25ed2e63736e 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -144,9 +144,9 @@ def clabel(self, levels=None, *, labels A list of `.Text` instances for the labels. - Note: The returned .Text instances should not be individually - removed or have their geometry modified. To remove all labels, - remove the entire .ContourSet and recreate it. + Note: The returned Text instances should not be individually + removed or have their geometry modified, e.g. by changing text or font size. + If you need such a modification, remove the entire `.ContourSet` and recreate it. """ if self.filled: @@ -518,16 +518,14 @@ def labels(self, inline, inline_spacing): def remove(self): super().remove() - for text in list(self.labelTexts): + for text in self.labelTexts: try: text.remove() except ValueError: - import warnings - warnings.warn( + _api.warn_external( "Some labels were manually removed before the ContourSet. " "To remove labels cleanly, remove the entire ContourSet " - "and recreate it.", - UserWarning, stacklevel=2) + "and recreate it.") self.labelTexts.clear() diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index b3f25567d384..7db660772934 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -808,9 +808,7 @@ def test_contour_remove_with_labels(): ax = plt.figure().add_subplot() cs = ax.contour(np.arange(16).reshape((4, 4))) labels = cs.clabel() - for label in labels: - label.remove() - cs.clabel() + labels[0].remove() with pytest.warns(UserWarning, match="Some labels were manually removed"): cs.remove() From 8eff29253945008a67c4debd9e16da9c63e3f600 Mon Sep 17 00:00:00 2001 From: Rahul Date: Fri, 3 Apr 2026 17:43:04 +0530 Subject: [PATCH 037/120] FIX: Fix line too long in docstring --- lib/matplotlib/contour.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 25ed2e63736e..f83d866042df 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -146,7 +146,8 @@ def clabel(self, levels=None, *, Note: The returned Text instances should not be individually removed or have their geometry modified, e.g. by changing text or font size. - If you need such a modification, remove the entire `.ContourSet` and recreate it. + If you need such a modification, remove the entire + `.ContourSet` and recreate it. """ if self.filled: From d3bf464798efc47132607007872da6b05d0df4ca Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Fri, 3 Apr 2026 14:52:37 +0100 Subject: [PATCH 038/120] TST: account for flakiness with Numpy v1 (part 2) --- lib/matplotlib/tests/test_colorbar.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_colorbar.py b/lib/matplotlib/tests/test_colorbar.py index 77ff797be11d..691df9cde3bd 100644 --- a/lib/matplotlib/tests/test_colorbar.py +++ b/lib/matplotlib/tests/test_colorbar.py @@ -631,7 +631,9 @@ def test_colorbar_format(fmt): assert cbar.ax.yaxis.get_ticklabels()[4].get_text() == '2.00e+02' # but if we change the norm: - im.set_norm(LogNorm(vmin=0.1, vmax=10)) + # when we require numpy >= 2, vmin can be 0.1, but at numpy 1.x this is + # sensitive to floating point errors + im.set_norm(LogNorm(vmin=0.09999, vmax=10)) fig.canvas.draw() assert (cbar.ax.yaxis.get_ticklabels()[0].get_text() == '$\\mathdefault{10^{-2}}$') From 5f1d6b04208feb1cf8b1bba1036bbef6109c4aca Mon Sep 17 00:00:00 2001 From: Rahul Monani Date: Fri, 3 Apr 2026 19:26:28 +0530 Subject: [PATCH 039/120] Update lib/matplotlib/contour.py Co-authored-by: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> --- lib/matplotlib/contour.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index f83d866042df..76481280729a 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -524,7 +524,7 @@ def remove(self): text.remove() except ValueError: _api.warn_external( - "Some labels were manually removed before the ContourSet. " + "Some labels were manually removed from the ContourSet. " "To remove labels cleanly, remove the entire ContourSet " "and recreate it.") self.labelTexts.clear() From 22b56ea92626aba7e1951ff0b2f8539929c0f5f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 19:13:56 +0000 Subject: [PATCH 040/120] Bump the actions group with 3 updates Bumps the actions group with 3 updates: [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel), [j178/prek-action](https://github.com/j178/prek-action) and [plbstl/first-contribution](https://github.com/plbstl/first-contribution). Updates `pypa/cibuildwheel` from 3.4.0 to 3.4.1 - [Release notes](https://github.com/pypa/cibuildwheel/releases) - [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md) - [Commits](https://github.com/pypa/cibuildwheel/compare/ee02a1537ce3071a004a6b08c41e72f0fdc42d9a...8d2b08b68458a16aeb24b64e68a09ab1c8e82084) Updates `j178/prek-action` from 2.0.0 to 2.0.1 - [Release notes](https://github.com/j178/prek-action/releases) - [Commits](https://github.com/j178/prek-action/compare/79f765515bd648eb4d6bb1b17277b7cb22cb6468...53276d8b0d10f8b6672aa85b4588c6921d0370cc) Updates `plbstl/first-contribution` from 4.2.0 to 4.3.0 - [Release notes](https://github.com/plbstl/first-contribution/releases) - [Commits](https://github.com/plbstl/first-contribution/compare/4fb1541ce2706255850d56c5684552607be1ae9b...7c31f41b0e7a70adfcae06cf964679f61af6780b) --- updated-dependencies: - dependency-name: pypa/cibuildwheel dependency-version: 3.4.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: actions - dependency-name: j178/prek-action dependency-version: 2.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: actions - dependency-name: plbstl/first-contribution dependency-version: 4.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: actions ... Signed-off-by: dependabot[bot] --- .github/workflows/cibuildwheel.yml | 10 +++++----- .github/workflows/linting.yml | 2 +- .github/workflows/pr_welcome.yml | 2 +- .github/workflows/wasm.yml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/cibuildwheel.yml b/.github/workflows/cibuildwheel.yml index ae4b03a559fa..905955e7fea0 100644 --- a/.github/workflows/cibuildwheel.yml +++ b/.github/workflows/cibuildwheel.yml @@ -146,7 +146,7 @@ jobs: path: dist/ - name: Build wheels for CPython 3.14 - uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 + uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -156,7 +156,7 @@ jobs: CIBW_MANYLINUX_X86_64_IMAGE: manylinux_2_28 - name: Build wheels for CPython 3.13 - uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 + uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -165,7 +165,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.12 - uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 + uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -173,7 +173,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for CPython 3.11 - uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 + uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: @@ -181,7 +181,7 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} - name: Build wheels for PyPy - uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 + uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 with: package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }} env: diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index daa380e80759..e73165c504d8 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: "3.x" - - uses: j178/prek-action@79f765515bd648eb4d6bb1b17277b7cb22cb6468 # v2.0.0 + - uses: j178/prek-action@53276d8b0d10f8b6672aa85b4588c6921d0370cc # v2.0.1 with: extra_args: --hook-stage manual --all-files diff --git a/.github/workflows/pr_welcome.yml b/.github/workflows/pr_welcome.yml index f5fea030e4eb..41ee535ff04f 100644 --- a/.github/workflows/pr_welcome.yml +++ b/.github/workflows/pr_welcome.yml @@ -16,7 +16,7 @@ jobs: issues: write pull-requests: write steps: - - uses: plbstl/first-contribution@4fb1541ce2706255850d56c5684552607be1ae9b # v4.2.0 + - uses: plbstl/first-contribution@7c31f41b0e7a70adfcae06cf964679f61af6780b # v4.3.0 with: labels: first-contribution pr-opened-msg: >+ diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml index 11c73ce242a4..578acc7f8c6e 100644 --- a/.github/workflows/wasm.yml +++ b/.github/workflows/wasm.yml @@ -50,7 +50,7 @@ jobs: python-version: '3.13' - name: Build wheels for wasm - uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 + uses: pypa/cibuildwheel@8d2b08b68458a16aeb24b64e68a09ab1c8e82084 # v3.4.1 env: CIBW_BUILD: "cp312-*" CIBW_PLATFORM: "pyodide" From 69e6954018d082dd2c396b312b4ce40922176092 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 2 Apr 2026 15:28:06 -0400 Subject: [PATCH 041/120] Backport PR #31437: mathtext: Fix type inconsistency with fontmaps mathtext: Fix type inconsistency with fontmaps (cherry picked from commit fc6aa040a6e5d4a5bc6557f257f9102edd447b4b) --- ci/mypy-stubtest-allowlist.txt | 1 - lib/matplotlib/_mathtext.py | 73 +++++++++++++++------------------- lib/matplotlib/ft2font.pyi | 4 +- 3 files changed, 35 insertions(+), 43 deletions(-) diff --git a/ci/mypy-stubtest-allowlist.txt b/ci/mypy-stubtest-allowlist.txt index 46ec06e0a9f1..85d9be15673e 100644 --- a/ci/mypy-stubtest-allowlist.txt +++ b/ci/mypy-stubtest-allowlist.txt @@ -28,7 +28,6 @@ matplotlib\.ticker\.LogitLocator\.nonsingular # Stdlib/Enum considered inconsistent (no fault of ours, I don't think) matplotlib\.backend_bases\._Mode\.__new__ -matplotlib\.units\.Number\.__hash__ # 3.6 Pending deprecations matplotlib\.figure\.Figure\.set_constrained_layout diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index cf35dc1de7db..50077c6738fa 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -331,20 +331,15 @@ def __init__(self, default_font_prop: FontProperties, load_glyph_flags: LoadFlag # Per-instance cache. self._get_info = functools.cache(self._get_info) # type: ignore[method-assign] self._fonts = {} - self.fontmap: dict[str | int, str] = {} + self.fontmap: dict[str, str] = {} filename = findfont(self.default_font_prop) default_font = get_font(filename) self._fonts['default'] = default_font self._fonts['regular'] = default_font - def _get_font(self, font: str | int) -> FT2Font: - if font in self.fontmap: - basename = self.fontmap[font] - else: - # NOTE: An int is only passed by subclasses which have placed int keys into - # `self.fontmap`, so we must cast this to confirm it to typing. - basename = T.cast(str, font) + def _get_font(self, font: str) -> FT2Font: + basename = self.fontmap.get(font, font) cached_font = self._fonts.get(basename) if cached_font is None and os.path.exists(basename): cached_font = get_font(basename) @@ -574,12 +569,13 @@ def __init__(self, default_font_prop: FontProperties, load_glyph_flags: LoadFlag # include STIX sized alternatives for glyphs if fallback is STIX if isinstance(self._fallback_font, StixFonts): stixsizedaltfonts = { - 0: 'STIXGeneral', - 1: 'STIXSizeOneSym', - 2: 'STIXSizeTwoSym', - 3: 'STIXSizeThreeSym', - 4: 'STIXSizeFourSym', - 5: 'STIXSizeFiveSym'} + '0': 'STIXGeneral', + '1': 'STIXSizeOneSym', + '2': 'STIXSizeTwoSym', + '3': 'STIXSizeThreeSym', + '4': 'STIXSizeFourSym', + '5': 'STIXSizeFiveSym', + } for size, name in stixsizedaltfonts.items(): fullpath = findfont(name) @@ -637,7 +633,7 @@ def _get_glyph(self, fontname: str, font_class: str, g = self._fallback_font._get_glyph(fontname, font_class, sym) family = g[0].family_name - if family in list(BakomaFonts._fontmap.values()): + if family in BakomaFonts._fontmap.values(): family = "Computer Modern" _log.info("Substituting symbol %s from %s", sym, family) return g @@ -658,13 +654,12 @@ def _get_glyph(self, fontname: str, font_class: str, def get_sized_alternatives_for_symbol(self, fontname: str, sym: str) -> list[tuple[str, str]]: if self._fallback_font: - return self._fallback_font.get_sized_alternatives_for_symbol( - fontname, sym) + return self._fallback_font.get_sized_alternatives_for_symbol(fontname, sym) return [(fontname, sym)] class DejaVuFonts(UnicodeFonts, metaclass=abc.ABCMeta): - _fontmap: dict[str | int, str] = {} + _fontmap: dict[str, str] = {} def __init__(self, default_font_prop: FontProperties, load_glyph_flags: LoadFlags): # This must come first so the backend's owner is set correctly @@ -676,11 +671,11 @@ def __init__(self, default_font_prop: FontProperties, load_glyph_flags: LoadFlag TruetypeFonts.__init__(self, default_font_prop, load_glyph_flags) # Include Stix sized alternatives for glyphs self._fontmap.update({ - 1: 'STIXSizeOneSym', - 2: 'STIXSizeTwoSym', - 3: 'STIXSizeThreeSym', - 4: 'STIXSizeFourSym', - 5: 'STIXSizeFiveSym', + '1': 'STIXSizeOneSym', + '2': 'STIXSizeTwoSym', + '3': 'STIXSizeThreeSym', + '4': 'STIXSizeFourSym', + '5': 'STIXSizeFiveSym', }) for key, name in self._fontmap.items(): fullpath = findfont(name) @@ -718,7 +713,7 @@ class DejaVuSerifFonts(DejaVuFonts): 'sf': 'DejaVu Sans', 'tt': 'DejaVu Sans Mono', 'ex': 'DejaVu Serif Display', - 0: 'DejaVu Serif', + '0': 'DejaVu Serif', } @@ -736,7 +731,7 @@ class DejaVuSansFonts(DejaVuFonts): 'sf': 'DejaVu Sans', 'tt': 'DejaVu Sans Mono', 'ex': 'DejaVu Sans Display', - 0: 'DejaVu Sans', + '0': 'DejaVu Sans', } @@ -752,7 +747,7 @@ class StixFonts(UnicodeFonts): - handles sized alternative characters for the STIXSizeX fonts. """ - _fontmap: dict[str | int, str] = { + _fontmap = { 'rm': 'STIXGeneral', 'it': 'STIXGeneral:italic', 'bf': 'STIXGeneral:weight=bold', @@ -760,12 +755,12 @@ class StixFonts(UnicodeFonts): 'nonunirm': 'STIXNonUnicode', 'nonuniit': 'STIXNonUnicode:italic', 'nonunibf': 'STIXNonUnicode:weight=bold', - 0: 'STIXGeneral', - 1: 'STIXSizeOneSym', - 2: 'STIXSizeTwoSym', - 3: 'STIXSizeThreeSym', - 4: 'STIXSizeFourSym', - 5: 'STIXSizeFiveSym', + '0': 'STIXGeneral', + '1': 'STIXSizeOneSym', + '2': 'STIXSizeTwoSym', + '3': 'STIXSizeThreeSym', + '4': 'STIXSizeFourSym', + '5': 'STIXSizeFiveSym', } _fallback_font = None _sans = False @@ -832,10 +827,8 @@ def _map_virtual_font(self, fontname: str, font_class: str, return fontname, uniindex @functools.cache - def get_sized_alternatives_for_symbol( # type: ignore[override] - self, - fontname: str, - sym: str) -> list[tuple[str, str]] | list[tuple[int, str]]: + def get_sized_alternatives_for_symbol(self, fontname: str, + sym: str) -> list[tuple[str, str]]: fixes = { '\\{': '{', '\\}': '}', '\\[': '[', '\\]': ']', '<': '\N{MATHEMATICAL LEFT ANGLE BRACKET}', @@ -846,8 +839,8 @@ def get_sized_alternatives_for_symbol( # type: ignore[override] uniindex = get_unicode_index(sym) except ValueError: return [(fontname, sym)] - alternatives = [(i, chr(uniindex)) for i in range(6) - if self._get_font(i).get_char_index(uniindex) != 0] + alternatives = [(str(i), chr(uniindex)) for i in range(6) + if self._get_font(str(i)).get_char_index(uniindex) != 0] # The largest size of the radical symbol in STIX has incorrect # metrics that cause it to be disconnected from the stem. if sym == r'\__sqrt__': @@ -1542,7 +1535,7 @@ def __init__(self, c: str, height: float, depth: float, state: ParserState, break shift = 0.0 - if state.font != 0 or len(alternatives) == 1: + if state.font != '0' or len(alternatives) == 1: if factor is None: factor = target_total / (char.height + char.depth) state.fontsize *= factor @@ -2530,7 +2523,7 @@ def subsuper(self, s: str, loc: int, toks: ParseResults) -> T.Any: # Handle regular sub/superscripts constants = _get_font_constant_set(state) lc_height = last_char.height - lc_baseline = 0 + lc_baseline = 0.0 if self.is_dropsub(last_char): lc_baseline = last_char.depth diff --git a/lib/matplotlib/ft2font.pyi b/lib/matplotlib/ft2font.pyi index 37281afeaafa..3c8b52a73b6b 100644 --- a/lib/matplotlib/ft2font.pyi +++ b/lib/matplotlib/ft2font.pyi @@ -194,7 +194,7 @@ class FT2Font(Buffer): _kerning_factor: int = ... ) -> None: ... if sys.version_info[:2] >= (3, 12): - def __buffer__(self, flags: int) -> memoryview: ... + def __buffer__(self, /, flags: int) -> memoryview: ... def _get_fontmap(self, string: str) -> dict[str, FT2Font]: ... def clear(self) -> None: ... def draw_glyph_to_bitmap( @@ -286,7 +286,7 @@ class FT2Image(Buffer): def __init__(self, width: int, height: int) -> None: ... def draw_rect_filled(self, x0: int, y0: int, x1: int, y1: int) -> None: ... if sys.version_info[:2] >= (3, 12): - def __buffer__(self, flags: int) -> memoryview: ... + def __buffer__(self, /, flags: int) -> memoryview: ... @final class Glyph: From 04243efd521d638a111df80c6b58f1c605fbbe75 Mon Sep 17 00:00:00 2001 From: David Stansby Date: Fri, 3 Apr 2026 22:10:56 +0200 Subject: [PATCH 042/120] Add type stubs for functions in matplotlib.dates (#30385) * Add type stubs for functions in matplotlib.dates * Make date typing tighter with overloads * Fix _dt64_to_ordinalf type * Remvoe old type alisas * Add argument defaults * Remove overload on datestr2num --- lib/matplotlib/dates.py | 2 +- lib/matplotlib/dates.pyi | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 lib/matplotlib/dates.pyi diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 369e93f1ac6f..f5f0918dcc13 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -309,7 +309,7 @@ def get_epoch(): def _dt64_to_ordinalf(d): """ - Convert `numpy.datetime64` or an `numpy.ndarray` of those types to + Convert a `numpy.ndarray` of np.datetime64 to Gregorian date as UTC float relative to the epoch (see `.get_epoch`). Roundoff is float64 precision. Practically: microseconds for dates between 290301 BC, 294241 AD, milliseconds for larger dates diff --git a/lib/matplotlib/dates.pyi b/lib/matplotlib/dates.pyi new file mode 100644 index 000000000000..426082679393 --- /dev/null +++ b/lib/matplotlib/dates.pyi @@ -0,0 +1,37 @@ +import datetime +from collections.abc import Sequence +from typing import overload + +import numpy as np +import numpy.typing as npt + +TZ = str | datetime.tzinfo + +def _get_tzinfo(tz: TZ | None=None) -> datetime.tzinfo: ... +def _reset_epoch_test_example() -> None: ... +def set_epoch(epoch: str) -> None: ... +def get_epoch() -> str: ... +def _dt64_to_ordinalf(d: npt.NDArray[np.datetime64]) -> npt.NDArray[np.floating]: ... +def _from_ordinalf(x: float, tz: TZ | None=None) -> datetime.datetime: ... +# Ideally str | Sequence[str] would get an override, but because a str is a valid Sequence[str], +# it's not possible to distinguish between them in the type system +# See https://github.com/python/typing/issues/256 +def datestr2num(d: str | Sequence[str], default: datetime.datetime | None=None) -> float | npt.NDArray[np.floating]: ... + +@overload +def date2num(d: datetime.datetime | np.datetime64) -> float: ... +@overload +def date2num(d: Sequence[datetime.datetime] | Sequence[np.datetime64]) -> npt.NDArray[np.floating]: ... + +@overload +def num2date(x: float, tz: TZ | None=None) -> datetime.datetime: ... +@overload +def num2date(x: Sequence[float], tz: TZ | None=None) -> list[datetime.datetime]: ... + +@overload +def num2timedelta(x: float) -> datetime.timedelta: ... +@overload +def num2timedelta(x: Sequence[float]) -> list[datetime.timedelta]: ... + +def drange(dstart: datetime.datetime, dend: datetime.datetime, delta: datetime.timedelta) -> npt.NDArray[np.floating]: ... +def _wrap_in_tex(text: str) -> str: ... From cada119f034458b6335bc7b9463618352d3ce89b Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Fri, 3 Apr 2026 16:05:56 -0500 Subject: [PATCH 043/120] Bump mimimum Ubuntu Version on Azure because 20.04 is EOL --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index cfd4f65dc775..5dce09e6d36b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -50,7 +50,7 @@ stages: strategy: matrix: Linux_py310: - vmImage: 'ubuntu-20.04' # keep one job pinned to the oldest image + vmImage: 'ubuntu-22.04' # keep one job pinned to the oldest image python.version: '3.10' Linux_py311: vmImage: 'ubuntu-latest' From d2d77e9f8d1f48b2d7a44fbb6ad0982a5a613448 Mon Sep 17 00:00:00 2001 From: RETHICK CB Date: Sat, 4 Apr 2026 18:44:08 +0530 Subject: [PATCH 044/120] Fix: improve log-scale error message wording --- lib/matplotlib/ticker.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index c3b245c60c51..0287127623d4 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -2484,8 +2484,7 @@ def tick_values(self, vmin, vmax): vmin = self.axis.get_minpos() if vmin <= 0.0 or not np.isfinite(vmin): - raise ValueError( - "Data has no positive values, and therefore cannot be log-scaled.") + raise ValueError("Data cannot be log-scaled because all values are <= 0.") if vmax < vmin: vmin, vmax = vmax, vmin From e54425d80df681e2cc2629c87b5ffd16f1654bed Mon Sep 17 00:00:00 2001 From: RETHICK CB Date: Sat, 4 Apr 2026 18:54:18 +0530 Subject: [PATCH 045/120] Fix: format error message to satisfy line length rule --- lib/matplotlib/ticker.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index 0287127623d4..cec84e1f3f36 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -2484,7 +2484,8 @@ def tick_values(self, vmin, vmax): vmin = self.axis.get_minpos() if vmin <= 0.0 or not np.isfinite(vmin): - raise ValueError("Data cannot be log-scaled because all values are <= 0.") + raise ValueError( + "Data cannot be log-scaled because all values are <= 0.") if vmax < vmin: vmin, vmax = vmax, vmin From 8d4b92c39cdca6a5b62d92e75742df0f3647b991 Mon Sep 17 00:00:00 2001 From: Arnaud Patard Date: Tue, 7 Apr 2026 15:55:59 +0200 Subject: [PATCH 046/120] lib/matplotlib/tests/test_inset.py: Fix tolerance on aarch64 I tried to run the test suite on a aarch64 linux system and it failed due to test_zoom_inset_connector_styles exceeding the tolerance. The test is already checking the platform to increase the tolerance on aarch64 but the check is failing as on this system, ``platform.machine()`` is returning ``aarch64`` not ``arm64``. I've checked on several distributions and it seems consistent. So, update the check to match both ``arm64`` and ``aarch64``. Signed-off-by: Arnaud Patard --- lib/matplotlib/tests/test_inset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_inset.py b/lib/matplotlib/tests/test_inset.py index e368a4af4e1b..81528580c723 100644 --- a/lib/matplotlib/tests/test_inset.py +++ b/lib/matplotlib/tests/test_inset.py @@ -94,7 +94,7 @@ def test_inset_indicator_zorder(): @image_comparison(['zoom_inset_connector_styles.png'], remove_text=True, style='mpl20', - tol=0.024 if platform.machine() == 'arm64' else 0) + tol=0.024 if platform.machine() in ['aarch64', 'arm64'] else 0) def test_zoom_inset_connector_styles(): fig, axs = plt.subplots(2) for ax in axs: From d80c3981b2cfce5b73f211c5267f725184b2d106 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 7 Apr 2026 15:24:56 -0400 Subject: [PATCH 047/120] DOC: Replace `skip_deprecated` extension by standard Sphinx metadata --- doc/conf.py | 1 - doc/sphinxext/skip_deprecated.py | 17 ----------------- lib/matplotlib/colors.py | 10 ++++++---- 3 files changed, 6 insertions(+), 22 deletions(-) delete mode 100644 doc/sphinxext/skip_deprecated.py diff --git a/doc/conf.py b/doc/conf.py index 1fec5f632d4e..fba30148a133 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -134,7 +134,6 @@ def _parse_skip_subdirs_file(): 'sphinxext.mock_gui_toolkits', 'sphinxext.rcparams', 'sphinxext.redirect_from', - 'sphinxext.skip_deprecated', 'sphinx_copybutton', 'sphinx_design', 'sphinx_tags', diff --git a/doc/sphinxext/skip_deprecated.py b/doc/sphinxext/skip_deprecated.py deleted file mode 100644 index d4ef795e9ab1..000000000000 --- a/doc/sphinxext/skip_deprecated.py +++ /dev/null @@ -1,17 +0,0 @@ -# Skip deprecated members - - -def skip_deprecated(app, what, name, obj, skip, options): - if skip: - return skip - skipped = {"matplotlib.colors": ["ColorConverter", "hex2color", "rgb2hex"]} - skip_list = skipped.get(getattr(obj, "__module__", None)) - if skip_list is not None: - return getattr(obj, "__name__", None) in skip_list - - -def setup(app): - app.connect('autodoc-skip-member', skip_deprecated) - - metadata = {'parallel_read_safe': True, 'parallel_write_safe': True} - return metadata diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 23db1031ffef..b04b8c6ca7a3 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -579,10 +579,10 @@ def to_hex(c, keep_alpha=False): ### Backwards-compatible color-conversion API -cnames = CSS4_COLORS -hexColorPattern = re.compile(r"\A#[a-fA-F0-9]{6}\Z") -rgb2hex = to_hex -hex2color = to_rgb +cnames = CSS4_COLORS #: :meta private: +hexColorPattern = re.compile(r"\A#[a-fA-F0-9]{6}\Z") #: :meta private: +rgb2hex = to_hex #: :meta private: +hex2color = to_rgb #: :meta private: class ColorConverter: @@ -590,6 +590,8 @@ class ColorConverter: A class only kept for backwards compatibility. Its functionality is entirely provided by module-level functions. + + :meta private: """ colors = _colors_full_map cache = _colors_full_map.cache From e1c601d8b939f5ed70c81575a6a049a72cc93929 Mon Sep 17 00:00:00 2001 From: Allison <56557237+AllisonBrand@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:20:25 -0700 Subject: [PATCH 048/120] Allow handles to be passed as a nparray and not just a Python list This is a one line edit. I replaced "if handles and labels:" with "if handles is not None and labels is not None:" I ran into an error when I passed the handles as a nparray instead of a Python list: "ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()". I felt it should work for any iterable that contains the handles, and this tiny edit solved the issue with nparrays. --- lib/matplotlib/legend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index 133ca062df7a..e25c3525821c 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -1363,7 +1363,7 @@ def _parse_legend_args(axs, *args, handles=None, labels=None, **kwargs): f"len(handles) = {len(handles)} " f"len(labels) = {len(labels)}") # if got both handles and labels as kwargs, make same length - if handles and labels: + if handles is not None and labels is not None: handles, labels = zip(*zip(handles, labels)) elif handles is not None and labels is None: From 2277c92003ea73957f0307b4c48d467043450f2d Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Tue, 7 Apr 2026 00:20:58 +0200 Subject: [PATCH 049/120] DOC: Impove AI policy - Change title from "Restrictions ..." to "Usage ..." which is more neutral - Introductory paragraph copied from https://devguide.python.org/getting-started/generative-ai/#generative-ai (CC0 license) - I find this a very good high-level summary of the mindset - Add lists of acceptable and unacceptable uses --- doc/devel/contribute.rst | 60 +++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/doc/devel/contribute.rst b/doc/devel/contribute.rst index 5eb8ac2b677e..cf158cbe67ad 100644 --- a/doc/devel/contribute.rst +++ b/doc/devel/contribute.rst @@ -185,32 +185,42 @@ If you have developed an extension to Matplotlib, please consider adding it to o .. _generative_ai: +Use of Generative AI +==================== + +Generative AI tools are evolving rapidly and can be helpful. As with any tool, +the resulting contribution is the responsibility of the contributor. We +expect dedicated and authentic engagement in our community. In particular when +using AI, carefully consider what and how to communicate, question results, +think things through thoroughly and make well-informed decisions. + +Some examples of acceptable and unacceptable AI uses are: + +.. grid:: 1 1 2 2 + + .. grid-item:: + + :octicon:`check;1em;sd-text-success` **Acceptable uses** + + - Gaining understanding of the existing code + - Getting solution ideas + - Translating or proof-reading your comments or PR descriptions. Please keep + the wording as close as possible to your original wording. + + .. grid-item:: + + :octicon:`x;1em;sd-text-danger` **Unacceptable uses** + + - External AI tooling (e.g. bots, agents) directly interacting with the project; + including creating issues, PRs or commenting on GitHub or Discourse. + - Solving topics that you wouldn't be able to solve yourself without AI + - Using AI output without ensuring that you fully understand the output or + without verifying that it is the correct approach. -Restrictions on Generative AI Usage -=================================== - -We expect authentic engagement in our community. - -- Do not post output from Large Language Models or similar generative AI as - comments on GitHub or our discourse server, as such comments tend to be - formulaic and low content. -- If you use generative AI tools as an aid in developing code or documentation - changes, ensure that you fully understand the proposed changes and can - explain why they are the correct approach. -- If you use AI for translation or grammar correction, please keep the wording as close - as possible to the original wording. It is much easier to come to a mutual - understanding when we are working off a direct translation of your words/thoughts - rather than a text an LLM may have embellished with possibly spurious information. - -Make sure you have added value based on your personal competency to your -contributions. Just taking some input, feeding it to an AI and posting the -result is not of value to the project. To preserve precious core developer -capacity, we reserve the right to rigorously reject seemingly AI generated -low-value contributions. - -In particular, it is also strictly forbidden to post AI generated -content to issues or PRs via automated tooling such as bots or agents. We -may ban such users and/or report them to GitHub. +To ensure project health and preserve limited core developer capacity, we will flag +and reject low-value contributions that we believe are AI generated. We may ban +and/or report users to GitHub if they harm the project or its community through +irresponsible use of AI. .. _new_contributors: From ca2582886b16cb0ae0f2c097f7c6984e0e45c834 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 7 Apr 2026 23:46:58 -0400 Subject: [PATCH 050/120] MNT: Deprecate matplotlib.image.thumbnail Pillow has some straightforward functionality for this, and we aren't an image processing library. The only thing novel is you get a preview builtin, but I doubt this is particularly noteworthy. --- .../deprecations/31468-ES.rst | 6 ++++ .../examples/misc/image_thumbnail_sgskip.py | 32 ------------------- lib/matplotlib/image.py | 4 ++- 3 files changed, 9 insertions(+), 33 deletions(-) create mode 100644 doc/api/next_api_changes/deprecations/31468-ES.rst delete mode 100644 galleries/examples/misc/image_thumbnail_sgskip.py diff --git a/doc/api/next_api_changes/deprecations/31468-ES.rst b/doc/api/next_api_changes/deprecations/31468-ES.rst new file mode 100644 index 000000000000..a71644a6e4f5 --- /dev/null +++ b/doc/api/next_api_changes/deprecations/31468-ES.rst @@ -0,0 +1,6 @@ +``image.thumbnail`` +~~~~~~~~~~~~~~~~~~~ + +... is deprecated without replacement. Use :external:py:`Pillow's thumbnail +method ` instead. See also the `Pillow tutorial +`_. diff --git a/galleries/examples/misc/image_thumbnail_sgskip.py b/galleries/examples/misc/image_thumbnail_sgskip.py deleted file mode 100644 index e361d3bf53ab..000000000000 --- a/galleries/examples/misc/image_thumbnail_sgskip.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -=============== -Image thumbnail -=============== - -You can use Matplotlib to generate thumbnails from existing images. -Matplotlib relies on Pillow_ for reading images, and thus supports all formats -supported by Pillow. - -.. _Pillow: https://python-pillow.github.io -""" - -from argparse import ArgumentParser -from pathlib import Path -import sys - -import matplotlib.image as image - -parser = ArgumentParser( - description="Build thumbnails of all images in a directory.") -parser.add_argument("imagedir", type=Path) -args = parser.parse_args() -if not args.imagedir.is_dir(): - sys.exit(f"Could not find input directory {args.imagedir}") - -outdir = Path("thumbs") -outdir.mkdir(parents=True, exist_ok=True) - -for path in args.imagedir.glob("*.png"): - outpath = outdir / path.name - fig = image.thumbnail(path, outpath, scale=0.15) - print(f"saved thumbnail of {path} to {outpath}") diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 0ae6eab12361..25e6a3bd5ee8 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -1787,12 +1787,14 @@ def _pil_png_to_float_array(pil_png): raise ValueError(f"Unknown PIL rawmode: {rawmode}") +@_api.deprecated('3.11', alternative="Pillow's `PIL.Image.Image.thumbnail`") def thumbnail(infile, thumbfile, scale=0.1, interpolation='bilinear', preview=False): """ Make a thumbnail of image in *infile* with output filename *thumbfile*. - See :doc:`/gallery/misc/image_thumbnail_sgskip`. + See `Pillow for a replacement + `_. Parameters ---------- From 9f28bd9629acf400b53ffd2c8bf71ffe9343aa77 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:55:00 +0100 Subject: [PATCH 051/120] DOC: make simple animation example easier to find --- doc/sphinxext/gallery_order.py | 2 ++ galleries/examples/animation/simple_anim.py | 12 +++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/doc/sphinxext/gallery_order.py b/doc/sphinxext/gallery_order.py index 99b90062a42a..0bc6e58f59fc 100644 --- a/doc/sphinxext/gallery_order.py +++ b/doc/sphinxext/gallery_order.py @@ -82,6 +82,8 @@ def __call__(self, item): "colors", # **Examples** + # animation + "simple_anim", # Most basic example # color "color_demo", # pies diff --git a/galleries/examples/animation/simple_anim.py b/galleries/examples/animation/simple_anim.py index 5391ca5b7aed..2b65b5935b40 100644 --- a/galleries/examples/animation/simple_anim.py +++ b/galleries/examples/animation/simple_anim.py @@ -1,7 +1,7 @@ """ -================== -Animated line plot -================== +======================== +Basic animated line plot +======================== Output generated via `matplotlib.animation.Animation.to_jshtml`. """ @@ -36,3 +36,9 @@ def animate(i): # ani.save("movie.mp4", writer=writer) plt.show() + +# %% +# +# .. tags:: +# component: animation, +# level: beginner From 448badec7e70ec6a967d0fe8c4870361a09bb889 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Wed, 8 Apr 2026 12:10:35 +0100 Subject: [PATCH 052/120] Purge gitter links --- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/workflows/pr_welcome.yml | 6 +++--- README.md | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index dc80f6d7c91d..635f11028226 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -7,5 +7,5 @@ contact_links: url: https://discourse.matplotlib.org about: If you have a usage question - name: Chat with devs - url: https://gitter.im/matplotlib/matplotlib + url: https://discourse.matplotlib.org/chat/c/matplotlib/2 about: Ask short questions about contributing to Matplotlib diff --git a/.github/workflows/pr_welcome.yml b/.github/workflows/pr_welcome.yml index 41ee535ff04f..48691e61d87b 100644 --- a/.github/workflows/pr_welcome.yml +++ b/.github/workflows/pr_welcome.yml @@ -32,9 +32,9 @@ jobs: experience to go through the review process. - You can also join us [on - gitter](https://gitter.im/matplotlib/matplotlib) for real-time - discussion. + You can also join us [on discourse + chat](https://discourse.matplotlib.org/chat/c/matplotlib/2) for + real-time discussion. For details on testing, writing docs, and our review process, diff --git a/README.md b/README.md index 8f9edaad2b5b..bbbbec35331e 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![LFX Health Score](https://insights.linuxfoundation.org/api/badge/health-score?project=matplotlib)](https://insights.linuxfoundation.org/project/matplotlib) [![Discourse help forum](https://img.shields.io/badge/help_forum-discourse-blue.svg)](https://discourse.matplotlib.org) -[![Gitter](https://badges.gitter.im/matplotlib/matplotlib.svg)](https://gitter.im/matplotlib/matplotlib) +[![Discourse chat](https://img.shields.io/badge/chat-discourse-mediumaquamarine)](https://discourse.matplotlib.org/chat/c/matplotlib/2) [![GitHub issues](https://img.shields.io/badge/issue_tracking-github-blue.svg)](https://github.com/matplotlib/matplotlib/issues) [![Contributing](https://img.shields.io/badge/PR-Welcome-%23FF8300.svg?)](https://matplotlib.org/stable/devel/index.html) @@ -61,9 +61,9 @@ Our active mailing lists (which are mirrored on Discourse) are: - [Development](https://mail.python.org/mailman/listinfo/matplotlib-devel) mailing list: -[Gitter](https://gitter.im/matplotlib/matplotlib) is for coordinating -development and asking questions directly related to contributing to -matplotlib. +[Discourse Chat](https://discourse.matplotlib.org/chat/c/matplotlib/2) is for +coordinating development and asking questions directly related to contributing +to matplotlib. ## Citing Matplotlib From 6ee2de660ab1d13e30e8a48067f9b30ca41c27aa Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:30:34 +0200 Subject: [PATCH 053/120] DOC: Improve Radio Buttons Grid example Simplify and make more similar with the Radio Buttons example. --- .../examples/widgets/radio_buttons_grid.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/galleries/examples/widgets/radio_buttons_grid.py b/galleries/examples/widgets/radio_buttons_grid.py index 1f6199b8e06a..215d54f78b16 100644 --- a/galleries/examples/widgets/radio_buttons_grid.py +++ b/galleries/examples/widgets/radio_buttons_grid.py @@ -23,7 +23,7 @@ t = np.arange(0.0, 2.0, 0.01) s = np.sin(2 * np.pi * t) -fig, (ax_plot, ax_buttons) = plt.subplots( +fig, (ax, ax_buttons) = plt.subplots( 1, 2, figsize=(8, 4), @@ -31,28 +31,24 @@ ) # Create initial plot -(line,) = ax_plot.plot(t, s, lw=2, color="red") -ax_plot.set_xlabel("Time (s)") -ax_plot.set_ylabel("Amplitude") -ax_plot.set_title("Sine Wave - Click a color!") -ax_plot.grid(True, alpha=0.3) +(line,) = ax.plot(t, s, lw=2, color="red") +ax.set(xlabel="Time (s)", ylabel="Amplitude", title="Sine Wave - Click a color!") # Configure the radio buttons axes -ax_buttons.set_facecolor("0.9") -ax_buttons.set_title("Line Color", fontsize=12, pad=10) +ax_buttons.set_facecolor("0.95") +ax_buttons.set_title("Line Color") # Create a 2D grid of color options (3 rows x 2 columns) colors = ["red", "yellow", "green", "purple", "brown", "gray"] radio = RadioButtons(ax_buttons, colors, layout=(3, 2)) -def color_func(label): +def update_color(label): """Update the line color based on selected button.""" line.set_color(label) fig.canvas.draw() +radio.on_clicked(update_color) -radio.on_clicked(color_func) - plt.show() # %% From 3af89be77779ee4b10c3fb70742f50300e9ce21b Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:08:08 +0200 Subject: [PATCH 054/120] DOC: Improve Radio Buttons example Several small changes. --- galleries/examples/widgets/radio_buttons.py | 56 ++++++++++++--------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/galleries/examples/widgets/radio_buttons.py b/galleries/examples/widgets/radio_buttons.py index b2d7f8396576..185b1acf97b5 100644 --- a/galleries/examples/widgets/radio_buttons.py +++ b/galleries/examples/widgets/radio_buttons.py @@ -19,12 +19,15 @@ from matplotlib.widgets import RadioButtons +FREQUENCIES = {'1 Hz': 1, '2 Hz': 2, '4 Hz': 4} + t = np.arange(0.0, 2.0, 0.01) -s0 = np.sin(2*np.pi*t) -s1 = np.sin(4*np.pi*t) -s2 = np.sin(8*np.pi*t) -fig, ax = plt.subplot_mosaic( + +def f(t, freq): + return np.sin(2 * np.pi * freq * t) + +fig, axd = plt.subplot_mosaic( [ ['main', 'freq'], ['main', 'color'], @@ -33,26 +36,29 @@ width_ratios=[5, 1], layout='constrained', ) -l, = ax['main'].plot(t, s0, lw=2, color='red') +(line,) = axd['main'].plot(t, f(t, freq=1), lw=2, color='red') +axd['main'].set(xlabel="Time (s)", ylabel="Amplitude", title="Sine Wave") -radio_background = 'lightgoldenrodyellow' +background_color = '0.95' -ax['freq'].set_facecolor(radio_background) -radio = RadioButtons(ax['freq'], ('1 Hz', '2 Hz', '4 Hz'), - label_props={'color': 'cmy', 'fontsize': [12, 14, 16]}, +axd['freq'].set_facecolor(background_color) +axd['freq'].set_title('Frequency') +radio = RadioButtons(axd['freq'], labels=list(FREQUENCIES.keys()), + label_props={'fontsize': [12, 14, 16]}, radio_props={'s': [16, 32, 64]}) -def hzfunc(label): - hzdict = {'1 Hz': s0, '2 Hz': s1, '4 Hz': s2} - ydata = hzdict[label] - l.set_ydata(ydata) +def update_frequency(label): + ydata = f(t, freq=FREQUENCIES[label]) + line.set_ydata(ydata) fig.canvas.draw() -radio.on_clicked(hzfunc) +radio.on_clicked(update_frequency) -ax['color'].set_facecolor(radio_background) + +axd['color'].set_facecolor(background_color) +axd['color'].set_title('Color') radio2 = RadioButtons( - ax['color'], ('red', 'blue', 'green'), + axd['color'], ('red', 'blue', 'green'), label_props={'color': ['red', 'blue', 'green']}, radio_props={ 'facecolor': ['red', 'blue', 'green'], @@ -60,19 +66,21 @@ def hzfunc(label): }) -def colorfunc(label): - l.set_color(label) +def update_color(label): + line.set_color(label) fig.canvas.draw() -radio2.on_clicked(colorfunc) +radio2.on_clicked(update_color) + -ax['linestyle'].set_facecolor(radio_background) -radio3 = RadioButtons(ax['linestyle'], ('-', '--', '-.', ':')) +axd['linestyle'].set_facecolor(background_color) +axd['linestyle'].set_title('Linestyle') +radio3 = RadioButtons(axd['linestyle'], ('solid', 'dashed', 'dashdot', 'dotted')) -def stylefunc(label): - l.set_linestyle(label) +def update_linestyle(label): + line.set_linestyle(label) fig.canvas.draw() -radio3.on_clicked(stylefunc) +radio3.on_clicked(update_linestyle) plt.show() From 269853a7b02969dbdbeb7d89fa397382698ecedd Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 8 Apr 2026 01:58:59 -0400 Subject: [PATCH 055/120] DOC: Use FuncAnimation in 3D animations These examples were disabled because the manual pausing caused the example to take very long while the docs were being built. Using the animation framework works if run by itself and also in Sphinx-Gallery, which can then have the frames generated as quickly as possible. That being said, I have only enabled the wire3d animation. The axes3d rotation example goes through so many frames that it takes over 3 minutes, which is by far longer than any other example, so it remains skipped. --- .../examples/mplot3d/rotate_axes3d_sgskip.py | 14 +++++---- ...nimation_sgskip.py => wire3d_animation.py} | 29 ++++++++++++++----- 2 files changed, 30 insertions(+), 13 deletions(-) rename galleries/examples/mplot3d/{wire3d_animation_sgskip.py => wire3d_animation.py} (60%) diff --git a/galleries/examples/mplot3d/rotate_axes3d_sgskip.py b/galleries/examples/mplot3d/rotate_axes3d_sgskip.py index 76a3369a20d6..df4fa730646b 100644 --- a/galleries/examples/mplot3d/rotate_axes3d_sgskip.py +++ b/galleries/examples/mplot3d/rotate_axes3d_sgskip.py @@ -5,7 +5,7 @@ A very simple animation of a rotating 3D plot about all three axes. -See :doc:`wire3d_animation_sgskip` for another example of animating a 3D plot. +See :doc:`wire3d_animation` for another example of animating a 3D plot. (This example is skipped when building the documentation gallery because it intentionally takes a long time to run) @@ -13,6 +13,7 @@ import matplotlib.pyplot as plt +from matplotlib import animation from mpl_toolkits.mplot3d import axes3d fig = plt.figure() @@ -27,8 +28,9 @@ ax.set_ylabel('y') ax.set_zlabel('z') + # Rotate the axes and update -for angle in range(0, 360*4 + 1): +def animate(angle): # Normalize the angle to the range [-180, 180] for display angle_norm = (angle + 180) % 360 - 180 @@ -45,10 +47,12 @@ # Update the axis view and title ax.view_init(elev, azim, roll) - plt.title('Elevation: %d°, Azimuth: %d°, Roll: %d°' % (elev, azim, roll)) + ax.set_title(f'Elevation: {elev}°, Azimuth: {azim}°, Roll: {roll}°') + + +ani = animation.FuncAnimation(fig, animate, interval=25, frames=360*4) - plt.draw() - plt.pause(.001) +plt.show() # %% # .. tags:: diff --git a/galleries/examples/mplot3d/wire3d_animation_sgskip.py b/galleries/examples/mplot3d/wire3d_animation.py similarity index 60% rename from galleries/examples/mplot3d/wire3d_animation_sgskip.py rename to galleries/examples/mplot3d/wire3d_animation.py index 903ff4918586..3104b35ffe8c 100644 --- a/galleries/examples/mplot3d/wire3d_animation_sgskip.py +++ b/galleries/examples/mplot3d/wire3d_animation.py @@ -4,9 +4,6 @@ =========================== A very simple "animation" of a 3D plot. See also :doc:`rotate_axes3d_sgskip`. - -(This example is skipped when building the documentation gallery because it -intentionally takes a long time to run.) """ import time @@ -14,6 +11,11 @@ import matplotlib.pyplot as plt import numpy as np +from matplotlib import animation + +FRAMES = 25 +FPS = 25 + fig = plt.figure() ax = fig.add_subplot(projection='3d') @@ -28,17 +30,28 @@ # Begin plotting. wframe = None tstart = time.time() -for phi in np.linspace(0, 180. / np.pi, 100): - # If a line collection is already remove it before drawing. + + +def animate(i): + global wframe + # If a line collection is already there, remove it before drawing. if wframe: wframe.remove() # Generate data. + phi = i / FRAMES * 2 * np.pi Z = np.cos(2 * np.pi * X + phi) * (1 - np.hypot(X, Y)) - # Plot the new wireframe and pause briefly before continuing. + # Plot the new wireframe. wframe = ax.plot_wireframe(X, Y, Z, rstride=2, cstride=2) - plt.pause(.001) + if i == FRAMES - 1: # Print FPS at the end of the loop. + global tstart + fps = FRAMES / (time.time() - tstart) + print(f'Expected FPS: {FPS}; Average FPS: {fps}') + tstart = time.time() + + +ani = animation.FuncAnimation(fig, animate, interval=1000 / FPS, frames=FRAMES) -print('Average FPS: %f' % (100 / (time.time() - tstart))) +plt.show() # %% # .. tags:: From 12d2a4db6762d2eff72440470e816382f39ec256 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 9 Apr 2026 02:40:52 -0400 Subject: [PATCH 056/120] Update test images for font/text overhaul This includes images changes for the following pull requests / commits: * [Fix center of rotation with rotation_mode='anchor'](https://github.com/matplotlib/matplotlib/pull/29199) (c44db77b9fb1318934767cfa01397ba6b81e30f7) * [Remove ttconv backwards-compatibility code](https://github.com/matplotlib/matplotlib/pull/30145) (8caff885c195fd65588c5dae6c4feaf5e57c44f7) * [Remove kerning_factor from tests](https://github.com/matplotlib/matplotlib/pull/29816) (7b4d725306b2d5907a023c14a30474a04280f804) * [Set text hinting to defaults](https://github.com/matplotlib/matplotlib/pull/29816) (8255ae206b273524657a4c81c8c06162a31a27e0) * [Update FreeType to 2.13.3](https://github.com/matplotlib/matplotlib/pull/29816) (89c054dc80e61425f0e07f192a62801cf6a22cc1) * [Implement text shaping with libraqm](https://github.com/matplotlib/matplotlib/pull/30000) (b0ded3aadda70932fa2130df61ed9629cd7d54e4, 98135232085af3c5585e4d7a077318f3d511306d) * [Add language parameter to Text objects](https://github.com/matplotlib/matplotlib/pull/29794) (7ce8eae7264dcef06278d675afd5b23b86c8c93b) * [Fix auto-sized glyphs with BaKoMa fonts](https://github.com/matplotlib/matplotlib/pull/29936) (3ba2c1321cb565a1e7103d3f9f502132e1a9b324) * [pdf: Improve text with characters outside embedded font limits](https://github.com/matplotlib/matplotlib/pull/30512) (b70fb888657ce566950a5f83b3e6e88b4c44404d, 6cedcf7094696567e9ee761a43d2935b3c5bb577) * [Prepare `CharacterTracker` for advanced font features](https://github.com/matplotlib/matplotlib/pull/30608) (8274e1733a0deb3fd3ca81c3ee05a97f2d59c81f, 70dc3880a7f04dd92ea18974a995034af95b60ab, df670cf4509173d392b5bf852c98af643bb0da14, ed5e07459235379bed74f9e6f51b4224e181e23f) * [Add font feature API to Text](https://github.com/matplotlib/matplotlib/pull/29695) (972a6888c4d0ebfc655bdc6dd7a46faa95eae917) * [Fix spacing in r"$\max f$"](https://github.com/matplotlib/matplotlib/pull/30715) (4a99a83773ea6fd7bb5c65472f1928c4040394d3) * [Implement libraqm for vector outputs](https://github.com/matplotlib/matplotlib/pull/30607) (bd17cd43dd71b879928828c899cb2f9087ce745e) * [Drop the FT2Font intermediate buffer](https://github.com/matplotlib/matplotlib/pull/30059) (9d7d7b42ab5f241499f69cadab99e2cd506173c9) * [Rasterize dvi files without dvipng](https://github.com/matplotlib/matplotlib/pull/30039) (762711831e7d6e21d7c804e9c5dea55ff1a6b961) * [Update bundled FreeType and HarfBuzz libraries](https://github.com/matplotlib/matplotlib/pull/30938) (a16165863e751b2d604bfaf036eb1a9d83580678, 9619bcc8ab1c1e2a8908b51f70c9f7566969ad1f) * [Fix positioning of wide mathtext accents](https://github.com/matplotlib/matplotlib/pull/31069) (c2fa7bacc36f2d039f9dae997af85699ea30320c) * [Refactor RendererAgg.draw_{mathtext,text,tex} to use same base algorithm](https://github.com/matplotlib/matplotlib/pull/31085) (931bcf3f034172ddd22e905e5a6cf4ed515f25e6) * [Implement TeX's fraction and script alignment](https://github.com/matplotlib/matplotlib/pull/31046) (94ff452edd18042395cf6578c538e41398378eca, 4bfa0f975042ab82d65d5233cf9d926bcaef8ce2, 1cd851066810b5acb870c3172eb3fcefe6edbb49) * [Fix confusion between text height and ascent in metrics calculations](https://github.com/matplotlib/matplotlib/pull/31107) (60f231068d7aeb96a58f83b4e1ad779ae36087bd) * [mathtext: Fetch quad width & axis height from font metrics](https://github.com/matplotlib/matplotlib/pull/31110) (692df3f8cd0487faae933a9dce2fb6a7fe2b2288, 383028bcfa7c6d3a66f672d42763d8fc19f95566) * [mathtext: add mathnormal and distinguish between normal and italic family](https://github.com/matplotlib/matplotlib/pull/31121) (a6913f3b26d539846896d87b7729d1b1b74da2fa) * [ENH: Ignore empty text for tightbbox](https://github.com/matplotlib/matplotlib/pull/31285) (d772043d67603f0d0260fdbe990ba82e6f47f4c6) * [Drop axis_artist tickdir image compat, due to text-overhaul merge](https://github.com/matplotlib/matplotlib/pull/31281) (2057583f1763a34c25452dc3696386fcef538377) * [text: Use font metrics to determine line heights](https://github.com/matplotlib/matplotlib/pull/31291) (3ab6a275b2724d798b597571512b5cc9a8f7690a, d961462910d4bc45535708affb7b2e6778f814d2, 97f4943cf279c82a4dc64e40ec52dcb1bcd218fe) * [ps/pdf: Override font height metrics to support AFM files](https://github.com/matplotlib/matplotlib/pull/31371) (e0913d466ed4e8f5fb9b03195ecd8b0dab5f43ce) * [TST: Cleanup back-compat code in tests touched by text overhaul](https://github.com/matplotlib/matplotlib/pull/31295) (7c33379e32fb02ca54199d782e061f87156dbfcc) * [TST: Set tests touched by text overhaul to mpl20 style](https://github.com/matplotlib/matplotlib/pull/31300) (41c4d8d24516c690b63f83c4c17ac11ec776bd5f) --- .appveyor.yml | 20 - .github/workflows/tests.yml | 19 - .github/workflows/wasm.yml | 19 - azure-pipelines.yml | 19 - .../test_agg_filter/agg_filter_alpha.gif | Bin 15787 -> 11171 bytes .../test_agg_filter/agg_filter_alpha.pdf | Bin 9724 -> 8041 bytes .../test_agg_filter/agg_filter_alpha.png | Bin 18410 -> 11318 bytes .../boxarrow_adjustment_test_image.png | Bin 48457 -> 23390 bytes .../boxarrow_test_image.png | Bin 39807 -> 16088 bytes .../test_artist/default_edges.png | Bin 21649 -> 14515 bytes .../test_axes/axhspan_epoch.png | Bin 20492 -> 5604 bytes .../test_axes/axvspan_epoch.png | Bin 13027 -> 9181 bytes .../test_axes/bar_tick_label_multiple.png | Bin 8097 -> 3622 bytes ...ick_label_multiple_old_label_alignment.png | Bin 8084 -> 3752 bytes .../test_axes/bar_tick_label_single.png | Bin 8704 -> 3563 bytes .../test_axes/barh_tick_label.png | Bin 6344 -> 4125 bytes .../baseline_images/test_axes/boxplot.png | Bin 9685 -> 4454 bytes .../boxplot_autorange_false_whiskers.png | Bin 5784 -> 3015 bytes .../boxplot_autorange_true_whiskers.png | Bin 5447 -> 2853 bytes .../test_axes/boxplot_custom_capwidths.png | Bin 2837 -> 1553 bytes .../test_axes/bxp_baseline.png | Bin 2735 -> 1449 bytes .../test_axes/bxp_custom_capwidth.png | Bin 2735 -> 1448 bytes .../test_axes/bxp_custom_capwidths.png | Bin 2797 -> 1449 bytes .../test_axes/bxp_percentilewhis.png | Bin 2945 -> 1561 bytes .../test_axes/bxp_rangewhis.png | Bin 2187 -> 1272 bytes .../test_axes/bxp_with_xlabels.png | Bin 2774 -> 1453 bytes .../test_axes/bxp_with_ylabels.png | Bin 3108 -> 1484 bytes .../baseline_images/test_axes/canonical.pdf | Bin 5196 -> 4878 bytes .../baseline_images/test_axes/canonical.png | Bin 17769 -> 16943 bytes .../baseline_images/test_axes/canonical.svg | 688 +- .../test_axes/contour_colorbar.pdf | Bin 112564 -> 110789 bytes .../test_axes/contour_colorbar.png | Bin 121056 -> 70246 bytes .../test_axes/contour_colorbar.svg | 400 +- .../test_axes/errorbar_basic.png | Bin 27610 -> 16987 bytes .../test_axes/errorbar_limits.png | Bin 37128 -> 20994 bytes .../test_axes/errorbar_mixed.png | Bin 48487 -> 25176 bytes .../test_axes/errorbar_zorder.png | Bin 16287 -> 9908 bytes .../test_axes/extent_units.png | Bin 67140 -> 38241 bytes .../baseline_images/test_axes/fill_units.png | Bin 23578 -> 15275 bytes .../test_axes/formatter_ticker_001.png | Bin 13120 -> 4253 bytes .../test_axes/formatter_ticker_002.png | Bin 26378 -> 14725 bytes .../test_axes/formatter_ticker_003.png | Bin 26566 -> 14765 bytes .../test_axes/formatter_ticker_004.png | Bin 35133 -> 20919 bytes .../test_axes/formatter_ticker_005.png | Bin 35204 -> 20945 bytes .../baseline_images/test_axes/grouped_bar.png | Bin 3914 -> 2141 bytes .../baseline_images/test_axes/hexbin_log.png | Bin 121470 -> 98301 bytes .../test_axes/hist_density.png | Bin 17433 -> 4860 bytes .../baseline_images/test_axes/hist_offset.png | Bin 10844 -> 3673 bytes .../test_axes/hist_stacked_bar.png | Bin 22933 -> 10725 bytes .../test_axes/hist_stacked_normed.png | Bin 13059 -> 9800 bytes .../test_axes/hist_stacked_step.png | Bin 11291 -> 4143 bytes .../test_axes/hist_stacked_stepfilled.png | Bin 11080 -> 3909 bytes .../hist_stacked_stepfilled_alpha.png | Bin 11409 -> 3879 bytes .../test_axes/hist_stacked_weights.png | Bin 12041 -> 4512 bytes .../test_axes/hist_step_horiz.png | Bin 9319 -> 3758 bytes .../test_axes/hlines_basic.png | Bin 9839 -> 3767 bytes .../test_axes/hlines_masked.png | Bin 11609 -> 3412 bytes .../test_axes/hlines_with_nan.png | Bin 20392 -> 14465 bytes .../baseline_images/test_axes/imshow_clip.pdf | Bin 18407 -> 18122 bytes .../baseline_images/test_axes/imshow_clip.png | Bin 21354 -> 17685 bytes .../baseline_images/test_axes/imshow_clip.svg | 104 +- .../baseline_images/test_axes/markevery.png | Bin 27648 -> 15184 bytes .../test_axes/markevery_line.png | Bin 44158 -> 26567 bytes .../test_axes/nonfinite_limits.pdf | Bin 6365 -> 6501 bytes .../test_axes/nonfinite_limits.png | Bin 15836 -> 11200 bytes .../test_axes/nonfinite_limits.svg | 534 +- .../test_axes/o_marker_path_snap.png | Bin 14109 -> 8418 bytes .../test_axes/offset_points.pdf | Bin 6757 -> 6063 bytes .../test_axes/offset_points.png | Bin 17893 -> 9871 bytes .../test_axes/offset_points.svg | 973 +- .../test_axes/pcolor_datetime_axis.png | Bin 26249 -> 45102 bytes .../test_axes/pcolormesh_datetime_axis.png | Bin 26249 -> 45220 bytes .../test_axes/pie_ccw_true.png | Bin 32647 -> 25382 bytes .../test_axes/pie_center_radius.png | Bin 31656 -> 23990 bytes .../baseline_images/test_axes/pie_default.png | Bin 51797 -> 28578 bytes .../test_axes/pie_frame_grid.png | Bin 46043 -> 36090 bytes .../test_axes/pie_linewidth_0.png | Bin 28958 -> 22357 bytes .../test_axes/pie_linewidth_2.png | Bin 35605 -> 28105 bytes .../test_axes/pie_no_label.png | Bin 55248 -> 24125 bytes .../test_axes/pie_rotatelabels_true.png | Bin 35450 -> 26555 bytes .../test_axes/preset_clip_paths.png | Bin 34650 -> 24861 bytes .../baseline_images/test_axes/rc_grid.png | Bin 8835 -> 1897 bytes .../test_axes/rc_markerfill.png | Bin 32317 -> 22157 bytes .../baseline_images/test_axes/rc_spines.png | Bin 3290 -> 1109 bytes .../test_axes/retain_tick_visibility.png | Bin 16126 -> 13189 bytes .../test_axes/secondary_xy.png | Bin 55748 -> 46583 bytes .../test_axes/set_get_ticklabels.png | Bin 28692 -> 17617 bytes .../test_axes/single_point.pdf | Bin 13160 -> 7226 bytes .../test_axes/single_point.png | Bin 31629 -> 13380 bytes .../test_axes/single_point.svg | 1094 +- .../test_axes/stackplot_test_image.png | Bin 26739 -> 15474 bytes .../baseline_images/test_axes/symlog.pdf | Bin 6255 -> 5349 bytes .../test_centered_bar_label_nonlinear.svg | 84 +- .../test_axes/test_stairs_datetime.png | Bin 25157 -> 15719 bytes .../test_axes/test_stairs_options.png | Bin 15641 -> 10490 bytes .../twin_axis_locators_formatters.png | Bin 37522 -> 22396 bytes .../test_axes/violinplot_horiz_baseline.png | Bin 36196 -> 14943 bytes .../violinplot_horiz_custompoints_10.png | Bin 33577 -> 13810 bytes .../violinplot_horiz_custompoints_200.png | Bin 35874 -> 14972 bytes .../test_axes/violinplot_horiz_showall.png | Bin 36925 -> 15436 bytes .../violinplot_horiz_showextrema.png | Bin 36661 -> 15053 bytes .../test_axes/violinplot_horiz_showmeans.png | Bin 38193 -> 15089 bytes .../violinplot_horiz_showmedians.png | Bin 38192 -> 15378 bytes .../test_axes/violinplot_vert_baseline.png | Bin 37868 -> 15289 bytes .../violinplot_vert_custompoints_10.png | Bin 35222 -> 14369 bytes .../violinplot_vert_custompoints_200.png | Bin 36340 -> 15391 bytes .../test_axes/violinplot_vert_showall.png | Bin 37471 -> 15688 bytes .../test_axes/violinplot_vert_showextrema.png | Bin 36951 -> 14768 bytes .../test_axes/violinplot_vert_showmeans.png | Bin 36951 -> 15390 bytes .../test_axes/violinplot_vert_showmedians.png | Bin 35851 -> 15179 bytes .../test_axes/vline_hline_zorder.png | Bin 27608 -> 15480 bytes .../test_axes/vlines_basic.png | Bin 9892 -> 3674 bytes .../vlines_hlines_blended_transform.png | Bin 18624 -> 13564 bytes .../test_axes/vlines_masked.png | Bin 11916 -> 3472 bytes .../test_axes/vlines_with_nan.png | Bin 21335 -> 10005 bytes .../test_backend_pdf/kerning.pdf | Bin 3807 -> 4181 bytes .../test_backend_pdf/multi_font_type3.pdf | Bin 201781 -> 196060 bytes .../test_backend_pdf/multi_font_type42.pdf | Bin 56520 -> 154239 bytes .../test_backend_pdf/truetype-conversion.pdf | Bin 4466 -> 3630 bytes .../test_backend_pdf/ttc_type3.pdf | Bin 21114 -> 20786 bytes .../test_backend_pdf/ttc_type42.pdf | Bin 9696 -> 185702 bytes .../test_backend_pgf/pgf_bbox_inches.pdf | Bin 3803 -> 4001 bytes .../pgf_document_font_size.pdf | Bin 8797 -> 8798 bytes .../test_backend_pgf/pgf_mixedmode.pdf | Bin 9822 -> 9784 bytes .../test_backend_pgf/pgf_pdflatex.pdf | Bin 90456 -> 87847 bytes .../test_backend_pgf/pgf_rcupdate1.pdf | Bin 11755 -> 11758 bytes .../test_backend_pgf/pgf_rcupdate2.pdf | Bin 129441 -> 129447 bytes .../test_backend_pgf/pgf_xelatex.pdf | Bin 17341 -> 16269 bytes .../test_backend_ps/colorbar_shift.eps | 494 +- .../test_backend_ps/multi_font_type3.eps | 22093 ++++++++++++---- .../test_backend_ps/multi_font_type42.eps | 19159 ++++++++++++-- .../test_backend_ps/ttc_type3.eps | 946 +- .../test_backend_ps/ttc_type42.eps | 946 +- .../test_backend_svg/bold_font_output.svg | 1630 +- .../bold_font_output_with_none_fonttype.svg | 122 +- .../test_backend_svg/multi_font_aspath.svg | 7849 +++--- .../test_backend_svg/multi_font_astext.svg | 40 +- .../bbox_inches_fixed_aspect.png | Bin 5293 -> 2205 bytes .../bbox_inches_tight_layout.png | Bin 1952 -> 829 bytes .../bbox_inches_tight_raster.pdf | Bin 7245 -> 5817 bytes .../bbox_inches_tight_raster.png | Bin 11651 -> 4545 bytes .../bbox_inches_tight_raster.svg | 211 +- .../bbox_inches_tight_suptile_legend.pdf | Bin 12520 -> 10745 bytes .../bbox_inches_tight_suptile_legend.png | Bin 33312 -> 18308 bytes .../bbox_inches_tight_suptile_legend.svg | 797 +- .../bbox_inches_tight_suptile_non_default.png | Bin 12170 -> 3992 bytes .../EventCollection_plot__add_positions.png | Bin 16477 -> 11586 bytes ...EventCollection_plot__append_positions.png | Bin 16910 -> 11135 bytes .../EventCollection_plot__default.png | Bin 14407 -> 10594 bytes ...EventCollection_plot__extend_positions.png | Bin 16543 -> 11508 bytes .../EventCollection_plot__set_color.png | Bin 14734 -> 10395 bytes .../EventCollection_plot__set_linelength.png | Bin 17379 -> 9034 bytes .../EventCollection_plot__set_lineoffset.png | Bin 16204 -> 10694 bytes .../EventCollection_plot__set_linestyle.png | Bin 16315 -> 10988 bytes .../EventCollection_plot__set_linewidth.png | Bin 15555 -> 10759 bytes .../EventCollection_plot__set_orientation.png | Bin 15320 -> 5061 bytes .../EventCollection_plot__set_positions.png | Bin 16067 -> 10795 bytes ...entCollection_plot__switch_orientation.png | Bin 15710 -> 5158 bytes ...ollection_plot__switch_orientation__2x.png | Bin 17016 -> 11060 bytes .../test_collections/cap_and_joinstyle.png | Bin 30397 -> 14760 bytes .../test_colorbar/cbar_locationing.png | Bin 3256 -> 1119 bytes .../test_colorbar/cbar_sharing.png | Bin 2842 -> 1043 bytes .../test_colorbar/cbar_with_orientation.png | Bin 1720 -> 660 bytes .../colorbar_change_lim_scale.png | Bin 8520 -> 6703 bytes .../test_colorbar/colorbar_keeping_xlabel.png | Bin 13075 -> 9394 bytes .../test_colorbar/double_cbar.png | Bin 13538 -> 7296 bytes .../test_colorbar/nonorm_colorbars.svg | 44 +- .../test_colors/boundarynorm_and_colorbar.png | Bin 16772 -> 10483 bytes .../test_colors/levels_and_colors.png | Bin 8127 -> 3574 bytes .../constrained_layout6.png | Bin 10865 -> 10751 bytes .../test_constrainedlayout/test_bbox.png | Bin 978 -> 394 bytes .../test_constrainedlayout/test_bboxtight.png | Bin 2686 -> 932 bytes .../test_colorbar_location.png | Bin 14984 -> 11601 bytes .../test_contour/contour_datetime_axis.png | Bin 48968 -> 55767 bytes .../contour_disconnected_segments.png | Bin 9795 -> 4230 bytes .../test_contour/contour_log_locator.svg | 290 +- .../test_contour/contour_manual_labels.pdf | Bin 5498 -> 4894 bytes .../test_contour/contour_manual_labels.png | Bin 11204 -> 11422 bytes .../test_contour/contour_manual_labels.svg | 220 +- .../test_contour/contour_rasterization.pdf | Bin 7823 -> 7632 bytes .../contour_test_label_transforms.png | Bin 38323 -> 35829 bytes .../DateFormatter_fractionalSeconds.png | Bin 25559 -> 20456 bytes .../test_dates/RRuleLocator_bounds.png | Bin 22881 -> 17260 bytes .../test_dates/date_axhline.png | Bin 21790 -> 9788 bytes .../test_dates/date_axhspan.png | Bin 21360 -> 9879 bytes .../test_dates/date_axvline.png | Bin 15897 -> 12082 bytes .../test_dates/date_axvspan.png | Bin 13532 -> 9688 bytes .../test_dates/date_inverted_limit.png | Bin 21707 -> 9821 bytes .../test_figure/figure_align_labels.png | Bin 65569 -> 32584 bytes .../test_figure/figure_align_labels.svg | 3527 +-- .../figure_align_titles_constrained.png | Bin 35117 -> 25024 bytes .../test_figure/figure_align_titles_tight.png | Bin 33777 -> 24312 bytes .../test_figure/figure_legend.png | Bin 48043 -> 27310 bytes .../test_figure/figure_suptitle.png | Bin 12561 -> 8020 bytes .../test_figure/figure_today.png | Bin 23452 -> 16599 bytes .../test_figure/test_subfigure.png | Bin 63233 -> 52612 bytes .../test_figure/test_subfigure_double.png | Bin 53528 -> 54947 bytes .../test_figure/test_subfigure_ss.png | Bin 52707 -> 41844 bytes .../test_ft2font/last_resort.pdf | Bin 10329 -> 9066 bytes .../test_ft2font/last_resort.png | Bin 6010 -> 2364 bytes .../test_ft2font/last_resort.svg | 54 +- .../test_image/downsampling.png | Bin 387263 -> 252373 bytes .../test_image/downsampling_speckle.png | Bin 3413 -> 2360 bytes .../baseline_images/test_image/image_clip.pdf | Bin 6915 -> 6218 bytes .../baseline_images/test_image/image_clip.png | Bin 17115 -> 13015 bytes .../baseline_images/test_image/image_clip.svg | 252 +- .../test_image/image_cliprect.pdf | Bin 6646 -> 5548 bytes .../test_image/image_cliprect.png | Bin 6181 -> 3215 bytes .../test_image/image_cliprect.svg | 98 +- .../test_image/interp_nearest_vs_none.pdf | Bin 2395 -> 2357 bytes .../test_image/interp_nearest_vs_none.svg | 348 +- .../test_image/nonuniform_logscale.png | Bin 10224 -> 8029 bytes .../test_image/rgba_antialias.png | Bin 109806 -> 73848 bytes .../baseline_images/test_image/upsampling.png | Bin 68096 -> 54662 bytes .../baseline_images/test_legend/fancy.png | Bin 21776 -> 11151 bytes .../test_legend/framealpha.pdf | Bin 6079 -> 5726 bytes .../test_legend/framealpha.png | Bin 16661 -> 11294 bytes .../test_legend/framealpha.svg | 721 +- .../baseline_images/test_legend/hatching.pdf | Bin 11379 -> 12528 bytes .../baseline_images/test_legend/hatching.png | Bin 39539 -> 23638 bytes .../baseline_images/test_legend/hatching.svg | 1340 +- .../test_legend/legend_auto1.png | Bin 16301 -> 5213 bytes .../test_legend/legend_auto2.png | Bin 9693 -> 3140 bytes .../test_legend/legend_auto3.png | Bin 13485 -> 8923 bytes .../test_legend/legend_expand.png | Bin 24398 -> 14473 bytes .../test_legend/legend_labels_first.png | Bin 19095 -> 10605 bytes .../test_legend/legend_multiple_keys.png | Bin 31611 -> 19662 bytes .../test_legend/legend_stackplot.png | Bin 29512 -> 16589 bytes .../test_legend/legend_various_labels.png | Bin 11087 -> 4043 bytes .../test_legend/not_covering_scatter.png | Bin 15704 -> 9042 bytes .../not_covering_scatter_transform.png | Bin 21609 -> 14910 bytes .../test_legend/rcparam_alpha.png | Bin 21080 -> 12096 bytes .../test_legend/rgba_alpha.png | Bin 21278 -> 12100 bytes .../test_legend/scatter_rc1.png | Bin 10020 -> 3727 bytes .../test_legend/scatter_rc3.png | Bin 10887 -> 6654 bytes .../test_legend/shadow_argument_types.png | Bin 17186 -> 13760 bytes .../test_lines/scaled_lines.pdf | Bin 10397 -> 10286 bytes .../test_lines/scaled_lines.png | Bin 28101 -> 19595 bytes .../test_lines/scaled_lines.svg | 544 +- .../test_mathtext/math_fontfamily_image.png | Bin 5542 -> 2907 bytes .../test_mathtext/mathfont_cm_00.png | Bin 2994 -> 1163 bytes .../test_mathtext/mathfont_cm_01.png | Bin 7077 -> 2878 bytes .../test_mathtext/mathfont_cm_02.png | Bin 5351 -> 2157 bytes .../test_mathtext/mathfont_cm_03.png | Bin 3388 -> 1393 bytes .../test_mathtext/mathfont_cm_04.png | Bin 5373 -> 1979 bytes .../test_mathtext/mathfont_cm_05.png | Bin 3821 -> 1540 bytes .../test_mathtext/mathfont_cm_06.png | Bin 7365 -> 3032 bytes .../test_mathtext/mathfont_cm_07.png | Bin 5982 -> 2387 bytes .../test_mathtext/mathfont_cm_08.png | Bin 4288 -> 1780 bytes .../test_mathtext/mathfont_cm_09.png | Bin 6089 -> 2372 bytes .../test_mathtext/mathfont_cm_10.png | Bin 4087 -> 1580 bytes .../test_mathtext/mathfont_cm_11.png | Bin 7271 -> 3040 bytes .../test_mathtext/mathfont_cm_12.png | Bin 6297 -> 2462 bytes .../test_mathtext/mathfont_cm_13.png | Bin 4469 -> 1781 bytes .../test_mathtext/mathfont_cm_14.png | Bin 6396 -> 2376 bytes .../test_mathtext/mathfont_cm_15.png | Bin 3840 -> 1524 bytes .../test_mathtext/mathfont_cm_16.png | Bin 7925 -> 3176 bytes .../test_mathtext/mathfont_cm_17.png | Bin 6224 -> 2419 bytes .../test_mathtext/mathfont_cm_18.png | Bin 4286 -> 1719 bytes .../test_mathtext/mathfont_cm_19.png | Bin 6070 -> 2317 bytes .../test_mathtext/mathfont_cm_20.png | Bin 3809 -> 1473 bytes .../test_mathtext/mathfont_cm_21.png | Bin 6363 -> 2538 bytes .../test_mathtext/mathfont_cm_22.png | Bin 6025 -> 2412 bytes .../test_mathtext/mathfont_cm_32.png | Bin 3990 -> 1746 bytes .../test_mathtext/mathfont_cm_33.png | Bin 7854 -> 3267 bytes .../test_mathtext/mathfont_cm_34.png | Bin 7190 -> 2808 bytes .../test_mathtext/mathfont_cm_35.png | Bin 3117 -> 1337 bytes .../test_mathtext/mathfont_cm_36.png | Bin 4187 -> 2186 bytes .../test_mathtext/mathfont_cm_37.png | Bin 7146 -> 3442 bytes .../test_mathtext/mathfont_cm_38.png | Bin 6212 -> 3013 bytes .../test_mathtext/mathfont_cm_39.png | Bin 2852 -> 1662 bytes .../test_mathtext/mathfont_cm_40.png | Bin 4250 -> 2163 bytes .../test_mathtext/mathfont_cm_41.png | Bin 7868 -> 3560 bytes .../test_mathtext/mathfont_cm_42.png | Bin 6774 -> 3200 bytes .../test_mathtext/mathfont_cm_43.png | Bin 3208 -> 1756 bytes .../test_mathtext/mathfont_cm_44.png | Bin 9006 -> 3336 bytes .../test_mathtext/mathfont_cm_45.png | Bin 11289 -> 4399 bytes .../test_mathtext/mathfont_cm_46.png | Bin 6477 -> 2642 bytes .../test_mathtext/mathfont_cm_47.png | Bin 10796 -> 4677 bytes .../test_mathtext/mathfont_cm_48.png | Bin 6949 -> 3141 bytes .../test_mathtext/mathfont_cm_49.png | Bin 11517 -> 3962 bytes .../test_mathtext/mathfont_cm_50.png | Bin 7682 -> 2981 bytes .../test_mathtext/mathfont_cm_51.png | Bin 4108 -> 1553 bytes .../test_mathtext/mathfont_cm_52.png | Bin 7026 -> 2752 bytes .../test_mathtext/mathfont_cm_53.png | Bin 5838 -> 2198 bytes .../test_mathtext/mathfont_cm_54.png | Bin 4283 -> 1944 bytes .../test_mathtext/mathfont_cm_55.png | Bin 7293 -> 3142 bytes .../test_mathtext/mathfont_cm_56.png | Bin 6025 -> 2518 bytes .../test_mathtext/mathfont_cm_57.png | Bin 4448 -> 1999 bytes .../test_mathtext/mathfont_cm_58.png | Bin 7350 -> 3163 bytes .../test_mathtext/mathfont_cm_59.png | Bin 6196 -> 2521 bytes .../test_mathtext/mathfont_cm_60.png | Bin 4336 -> 1684 bytes .../test_mathtext/mathfont_cm_61.png | Bin 8477 -> 3478 bytes .../test_mathtext/mathfont_cm_62.png | Bin 7269 -> 2710 bytes .../test_mathtext/mathfont_cm_63.png | Bin 4963 -> 2037 bytes .../test_mathtext/mathfont_cm_64.png | Bin 7005 -> 2646 bytes .../test_mathtext/mathfont_dejavusans_00.png | Bin 3240 -> 1291 bytes .../test_mathtext/mathfont_dejavusans_01.png | Bin 6665 -> 2881 bytes .../test_mathtext/mathfont_dejavusans_02.png | Bin 6180 -> 2517 bytes .../test_mathtext/mathfont_dejavusans_03.png | Bin 3088 -> 1314 bytes .../test_mathtext/mathfont_dejavusans_04.png | Bin 6337 -> 2446 bytes .../test_mathtext/mathfont_dejavusans_05.png | Bin 4084 -> 1673 bytes .../test_mathtext/mathfont_dejavusans_06.png | Bin 6757 -> 2796 bytes .../test_mathtext/mathfont_dejavusans_07.png | Bin 5364 -> 2544 bytes .../test_mathtext/mathfont_dejavusans_08.png | Bin 3974 -> 1690 bytes .../test_mathtext/mathfont_dejavusans_09.png | Bin 6463 -> 2551 bytes .../test_mathtext/mathfont_dejavusans_10.png | Bin 4444 -> 1749 bytes .../test_mathtext/mathfont_dejavusans_11.png | Bin 6959 -> 2963 bytes .../test_mathtext/mathfont_dejavusans_12.png | Bin 6402 -> 2726 bytes .../test_mathtext/mathfont_dejavusans_13.png | Bin 3975 -> 1835 bytes .../test_mathtext/mathfont_dejavusans_14.png | Bin 6581 -> 2695 bytes .../test_mathtext/mathfont_dejavusans_15.png | Bin 4068 -> 1675 bytes .../test_mathtext/mathfont_dejavusans_16.png | Bin 7564 -> 3172 bytes .../test_mathtext/mathfont_dejavusans_17.png | Bin 7013 -> 2835 bytes .../test_mathtext/mathfont_dejavusans_18.png | Bin 3859 -> 1800 bytes .../test_mathtext/mathfont_dejavusans_19.png | Bin 7071 -> 2769 bytes .../test_mathtext/mathfont_dejavusans_20.png | Bin 3978 -> 1616 bytes .../test_mathtext/mathfont_dejavusans_21.png | Bin 6595 -> 2641 bytes .../test_mathtext/mathfont_dejavusans_22.png | Bin 6318 -> 2550 bytes .../test_mathtext/mathfont_dejavusans_32.png | Bin 3990 -> 1746 bytes .../test_mathtext/mathfont_dejavusans_33.png | Bin 7854 -> 3267 bytes .../test_mathtext/mathfont_dejavusans_34.png | Bin 7190 -> 2808 bytes .../test_mathtext/mathfont_dejavusans_35.png | Bin 3009 -> 1313 bytes .../test_mathtext/mathfont_dejavusans_36.png | Bin 4187 -> 2186 bytes .../test_mathtext/mathfont_dejavusans_37.png | Bin 7146 -> 3442 bytes .../test_mathtext/mathfont_dejavusans_38.png | Bin 6212 -> 3013 bytes .../test_mathtext/mathfont_dejavusans_39.png | Bin 2852 -> 1662 bytes .../test_mathtext/mathfont_dejavusans_40.png | Bin 4250 -> 2163 bytes .../test_mathtext/mathfont_dejavusans_41.png | Bin 7868 -> 3560 bytes .../test_mathtext/mathfont_dejavusans_42.png | Bin 6774 -> 3200 bytes .../test_mathtext/mathfont_dejavusans_43.png | Bin 3208 -> 1756 bytes .../test_mathtext/mathfont_dejavusans_44.png | Bin 9191 -> 3458 bytes .../test_mathtext/mathfont_dejavusans_45.png | Bin 11289 -> 4399 bytes .../test_mathtext/mathfont_dejavusans_46.png | Bin 6477 -> 2642 bytes .../test_mathtext/mathfont_dejavusans_47.png | Bin 10796 -> 4677 bytes .../test_mathtext/mathfont_dejavusans_48.png | Bin 6949 -> 3141 bytes .../test_mathtext/mathfont_dejavusans_49.png | Bin 11517 -> 3962 bytes .../test_mathtext/mathfont_dejavusans_50.png | Bin 7682 -> 2981 bytes .../test_mathtext/mathfont_dejavusans_51.png | Bin 4327 -> 1664 bytes .../test_mathtext/mathfont_dejavusans_52.png | Bin 7095 -> 2810 bytes .../test_mathtext/mathfont_dejavusans_53.png | Bin 5362 -> 2541 bytes .../test_mathtext/mathfont_dejavusans_54.png | Bin 4608 -> 2042 bytes .../test_mathtext/mathfont_dejavusans_55.png | Bin 7198 -> 3168 bytes .../test_mathtext/mathfont_dejavusans_56.png | Bin 5548 -> 2874 bytes .../test_mathtext/mathfont_dejavusans_57.png | Bin 4776 -> 2087 bytes .../test_mathtext/mathfont_dejavusans_58.png | Bin 7427 -> 3208 bytes .../test_mathtext/mathfont_dejavusans_59.png | Bin 5526 -> 2936 bytes .../test_mathtext/mathfont_dejavusans_60.png | Bin 4664 -> 1868 bytes .../test_mathtext/mathfont_dejavusans_61.png | Bin 7472 -> 3397 bytes .../test_mathtext/mathfont_dejavusans_62.png | Bin 6985 -> 3128 bytes .../test_mathtext/mathfont_dejavusans_63.png | Bin 4454 -> 2033 bytes .../test_mathtext/mathfont_dejavusans_64.png | Bin 7407 -> 3011 bytes .../test_mathtext/mathfont_dejavuserif_00.png | Bin 3311 -> 1313 bytes .../test_mathtext/mathfont_dejavuserif_01.png | Bin 7080 -> 3198 bytes .../test_mathtext/mathfont_dejavuserif_02.png | Bin 6246 -> 2612 bytes .../test_mathtext/mathfont_dejavuserif_03.png | Bin 3377 -> 1487 bytes .../test_mathtext/mathfont_dejavuserif_04.png | Bin 6025 -> 2494 bytes .../test_mathtext/mathfont_dejavuserif_05.png | Bin 4131 -> 1703 bytes .../test_mathtext/mathfont_dejavuserif_06.png | Bin 7192 -> 3132 bytes .../test_mathtext/mathfont_dejavuserif_07.png | Bin 5844 -> 2735 bytes .../test_mathtext/mathfont_dejavuserif_08.png | Bin 4242 -> 1871 bytes .../test_mathtext/mathfont_dejavuserif_09.png | Bin 6136 -> 2676 bytes .../test_mathtext/mathfont_dejavuserif_10.png | Bin 4584 -> 1774 bytes .../test_mathtext/mathfont_dejavuserif_11.png | Bin 7465 -> 3245 bytes .../test_mathtext/mathfont_dejavuserif_12.png | Bin 6318 -> 2808 bytes .../test_mathtext/mathfont_dejavuserif_13.png | Bin 4525 -> 1899 bytes .../test_mathtext/mathfont_dejavuserif_14.png | Bin 6577 -> 2821 bytes .../test_mathtext/mathfont_dejavuserif_15.png | Bin 4175 -> 1685 bytes .../test_mathtext/mathfont_dejavuserif_16.png | Bin 8072 -> 3442 bytes .../test_mathtext/mathfont_dejavuserif_17.png | Bin 7132 -> 2933 bytes .../test_mathtext/mathfont_dejavuserif_18.png | Bin 4227 -> 1929 bytes .../test_mathtext/mathfont_dejavuserif_19.png | Bin 6767 -> 2758 bytes .../test_mathtext/mathfont_dejavuserif_20.png | Bin 3978 -> 1616 bytes .../test_mathtext/mathfont_dejavuserif_21.png | Bin 6595 -> 2641 bytes .../test_mathtext/mathfont_dejavuserif_22.png | Bin 6318 -> 2550 bytes .../test_mathtext/mathfont_dejavuserif_32.png | Bin 3990 -> 1746 bytes .../test_mathtext/mathfont_dejavuserif_33.png | Bin 7854 -> 3267 bytes .../test_mathtext/mathfont_dejavuserif_34.png | Bin 7190 -> 2808 bytes .../test_mathtext/mathfont_dejavuserif_35.png | Bin 3117 -> 1337 bytes .../test_mathtext/mathfont_dejavuserif_36.png | Bin 4187 -> 2186 bytes .../test_mathtext/mathfont_dejavuserif_37.png | Bin 7146 -> 3442 bytes .../test_mathtext/mathfont_dejavuserif_38.png | Bin 6212 -> 3013 bytes .../test_mathtext/mathfont_dejavuserif_39.png | Bin 2852 -> 1662 bytes .../test_mathtext/mathfont_dejavuserif_40.png | Bin 4250 -> 2163 bytes .../test_mathtext/mathfont_dejavuserif_41.png | Bin 7868 -> 3560 bytes .../test_mathtext/mathfont_dejavuserif_42.png | Bin 6774 -> 3200 bytes .../test_mathtext/mathfont_dejavuserif_43.png | Bin 3208 -> 1756 bytes .../test_mathtext/mathfont_dejavuserif_44.png | Bin 9191 -> 3458 bytes .../test_mathtext/mathfont_dejavuserif_45.png | Bin 11289 -> 4399 bytes .../test_mathtext/mathfont_dejavuserif_46.png | Bin 6477 -> 2642 bytes .../test_mathtext/mathfont_dejavuserif_47.png | Bin 10796 -> 4677 bytes .../test_mathtext/mathfont_dejavuserif_48.png | Bin 6949 -> 3141 bytes .../test_mathtext/mathfont_dejavuserif_49.png | Bin 11517 -> 3962 bytes .../test_mathtext/mathfont_dejavuserif_50.png | Bin 7682 -> 2981 bytes .../test_mathtext/mathfont_dejavuserif_51.png | Bin 4327 -> 1664 bytes .../test_mathtext/mathfont_dejavuserif_52.png | Bin 7095 -> 2810 bytes .../test_mathtext/mathfont_dejavuserif_53.png | Bin 5362 -> 2541 bytes .../test_mathtext/mathfont_dejavuserif_54.png | Bin 4608 -> 2042 bytes .../test_mathtext/mathfont_dejavuserif_55.png | Bin 7198 -> 3168 bytes .../test_mathtext/mathfont_dejavuserif_56.png | Bin 5548 -> 2874 bytes .../test_mathtext/mathfont_dejavuserif_57.png | Bin 4776 -> 2087 bytes .../test_mathtext/mathfont_dejavuserif_58.png | Bin 7427 -> 3208 bytes .../test_mathtext/mathfont_dejavuserif_59.png | Bin 5526 -> 2936 bytes .../test_mathtext/mathfont_dejavuserif_60.png | Bin 4863 -> 1918 bytes .../test_mathtext/mathfont_dejavuserif_61.png | Bin 8344 -> 3796 bytes .../test_mathtext/mathfont_dejavuserif_62.png | Bin 7389 -> 3190 bytes .../test_mathtext/mathfont_dejavuserif_63.png | Bin 5157 -> 2148 bytes .../test_mathtext/mathfont_dejavuserif_64.png | Bin 7293 -> 3069 bytes .../test_mathtext/mathfont_stix_00.png | Bin 2882 -> 1170 bytes .../test_mathtext/mathfont_stix_01.png | Bin 7190 -> 2487 bytes .../test_mathtext/mathfont_stix_02.png | Bin 5811 -> 1997 bytes .../test_mathtext/mathfont_stix_03.png | Bin 3521 -> 1420 bytes .../test_mathtext/mathfont_stix_04.png | Bin 5373 -> 1925 bytes .../test_mathtext/mathfont_stix_05.png | Bin 3704 -> 1560 bytes .../test_mathtext/mathfont_stix_06.png | Bin 7584 -> 3064 bytes .../test_mathtext/mathfont_stix_07.png | Bin 6038 -> 2417 bytes .../test_mathtext/mathfont_stix_08.png | Bin 4330 -> 1864 bytes .../test_mathtext/mathfont_stix_09.png | Bin 5939 -> 2393 bytes .../test_mathtext/mathfont_stix_10.png | Bin 4116 -> 1577 bytes .../test_mathtext/mathfont_stix_11.png | Bin 7806 -> 3078 bytes .../test_mathtext/mathfont_stix_12.png | Bin 6241 -> 2469 bytes .../test_mathtext/mathfont_stix_13.png | Bin 4561 -> 1863 bytes .../test_mathtext/mathfont_stix_14.png | Bin 6447 -> 2505 bytes .../test_mathtext/mathfont_stix_15.png | Bin 3700 -> 1469 bytes .../test_mathtext/mathfont_stix_16.png | Bin 7950 -> 2859 bytes .../test_mathtext/mathfont_stix_17.png | Bin 6639 -> 2311 bytes .../test_mathtext/mathfont_stix_18.png | Bin 4359 -> 1739 bytes .../test_mathtext/mathfont_stix_19.png | Bin 6288 -> 2238 bytes .../test_mathtext/mathfont_stix_20.png | Bin 3842 -> 1590 bytes .../test_mathtext/mathfont_stix_21.png | Bin 6516 -> 2703 bytes .../test_mathtext/mathfont_stix_22.png | Bin 5877 -> 2477 bytes .../test_mathtext/mathfont_stix_32.png | Bin 3990 -> 1746 bytes .../test_mathtext/mathfont_stix_33.png | Bin 7854 -> 3267 bytes .../test_mathtext/mathfont_stix_34.png | Bin 7190 -> 2808 bytes .../test_mathtext/mathfont_stix_35.png | Bin 3117 -> 1337 bytes .../test_mathtext/mathfont_stix_36.png | Bin 4187 -> 2186 bytes .../test_mathtext/mathfont_stix_37.png | Bin 7146 -> 3442 bytes .../test_mathtext/mathfont_stix_38.png | Bin 6212 -> 3013 bytes .../test_mathtext/mathfont_stix_39.png | Bin 2852 -> 1662 bytes .../test_mathtext/mathfont_stix_40.png | Bin 4250 -> 2163 bytes .../test_mathtext/mathfont_stix_41.png | Bin 7868 -> 3560 bytes .../test_mathtext/mathfont_stix_42.png | Bin 6774 -> 3200 bytes .../test_mathtext/mathfont_stix_43.png | Bin 3208 -> 1756 bytes .../test_mathtext/mathfont_stix_44.png | Bin 9191 -> 3458 bytes .../test_mathtext/mathfont_stix_45.png | Bin 11289 -> 4399 bytes .../test_mathtext/mathfont_stix_46.png | Bin 6477 -> 2642 bytes .../test_mathtext/mathfont_stix_47.png | Bin 10796 -> 4677 bytes .../test_mathtext/mathfont_stix_48.png | Bin 6949 -> 3141 bytes .../test_mathtext/mathfont_stix_49.png | Bin 11517 -> 3962 bytes .../test_mathtext/mathfont_stix_50.png | Bin 7682 -> 2981 bytes .../test_mathtext/mathfont_stix_51.png | Bin 4042 -> 1601 bytes .../test_mathtext/mathfont_stix_52.png | Bin 7084 -> 2997 bytes .../test_mathtext/mathfont_stix_53.png | Bin 6258 -> 2378 bytes .../test_mathtext/mathfont_stix_54.png | Bin 4147 -> 2022 bytes .../test_mathtext/mathfont_stix_55.png | Bin 7032 -> 3137 bytes .../test_mathtext/mathfont_stix_56.png | Bin 6056 -> 2699 bytes .../test_mathtext/mathfont_stix_57.png | Bin 4394 -> 2002 bytes .../test_mathtext/mathfont_stix_58.png | Bin 7611 -> 3176 bytes .../test_mathtext/mathfont_stix_59.png | Bin 6265 -> 2684 bytes .../test_mathtext/mathfont_stix_60.png | Bin 4336 -> 1684 bytes .../test_mathtext/mathfont_stix_61.png | Bin 8477 -> 3478 bytes .../test_mathtext/mathfont_stix_62.png | Bin 7269 -> 2710 bytes .../test_mathtext/mathfont_stix_63.png | Bin 4963 -> 2037 bytes .../test_mathtext/mathfont_stix_64.png | Bin 7005 -> 2646 bytes .../test_mathtext/mathfont_stixsans_00.png | Bin 2911 -> 1181 bytes .../test_mathtext/mathfont_stixsans_01.png | Bin 5947 -> 2596 bytes .../test_mathtext/mathfont_stixsans_02.png | Bin 5126 -> 1949 bytes .../test_mathtext/mathfont_stixsans_03.png | Bin 2926 -> 1252 bytes .../test_mathtext/mathfont_stixsans_04.png | Bin 5524 -> 2075 bytes .../test_mathtext/mathfont_stixsans_05.png | Bin 3768 -> 1587 bytes .../test_mathtext/mathfont_stixsans_06.png | Bin 6613 -> 2757 bytes .../test_mathtext/mathfont_stixsans_07.png | Bin 5596 -> 2334 bytes .../test_mathtext/mathfont_stixsans_08.png | Bin 3800 -> 1634 bytes .../test_mathtext/mathfont_stixsans_09.png | Bin 5984 -> 2351 bytes .../test_mathtext/mathfont_stixsans_10.png | Bin 4049 -> 1586 bytes .../test_mathtext/mathfont_stixsans_11.png | Bin 7274 -> 2800 bytes .../test_mathtext/mathfont_stixsans_12.png | Bin 5898 -> 2350 bytes .../test_mathtext/mathfont_stixsans_13.png | Bin 4362 -> 1721 bytes .../test_mathtext/mathfont_stixsans_14.png | Bin 6132 -> 2456 bytes .../test_mathtext/mathfont_stixsans_15.png | Bin 3776 -> 1533 bytes .../test_mathtext/mathfont_stixsans_16.png | Bin 6965 -> 2899 bytes .../test_mathtext/mathfont_stixsans_17.png | Bin 6119 -> 2325 bytes .../test_mathtext/mathfont_stixsans_18.png | Bin 3790 -> 1563 bytes .../test_mathtext/mathfont_stixsans_19.png | Bin 6241 -> 2433 bytes .../test_mathtext/mathfont_stixsans_20.png | Bin 3842 -> 1590 bytes .../test_mathtext/mathfont_stixsans_21.png | Bin 6516 -> 2703 bytes .../test_mathtext/mathfont_stixsans_22.png | Bin 5877 -> 2477 bytes .../test_mathtext/mathfont_stixsans_32.png | Bin 3990 -> 1746 bytes .../test_mathtext/mathfont_stixsans_33.png | Bin 7854 -> 3267 bytes .../test_mathtext/mathfont_stixsans_34.png | Bin 7190 -> 2808 bytes .../test_mathtext/mathfont_stixsans_35.png | Bin 3009 -> 1313 bytes .../test_mathtext/mathfont_stixsans_36.png | Bin 4187 -> 2186 bytes .../test_mathtext/mathfont_stixsans_37.png | Bin 7146 -> 3442 bytes .../test_mathtext/mathfont_stixsans_38.png | Bin 6212 -> 3013 bytes .../test_mathtext/mathfont_stixsans_39.png | Bin 2852 -> 1662 bytes .../test_mathtext/mathfont_stixsans_40.png | Bin 4250 -> 2163 bytes .../test_mathtext/mathfont_stixsans_41.png | Bin 7868 -> 3560 bytes .../test_mathtext/mathfont_stixsans_42.png | Bin 6774 -> 3200 bytes .../test_mathtext/mathfont_stixsans_43.png | Bin 3208 -> 1756 bytes .../test_mathtext/mathfont_stixsans_44.png | Bin 9191 -> 3458 bytes .../test_mathtext/mathfont_stixsans_45.png | Bin 11289 -> 4399 bytes .../test_mathtext/mathfont_stixsans_46.png | Bin 6477 -> 2642 bytes .../test_mathtext/mathfont_stixsans_47.png | Bin 10796 -> 4677 bytes .../test_mathtext/mathfont_stixsans_48.png | Bin 6949 -> 3141 bytes .../test_mathtext/mathfont_stixsans_49.png | Bin 11517 -> 3962 bytes .../test_mathtext/mathfont_stixsans_50.png | Bin 7682 -> 2981 bytes .../test_mathtext/mathfont_stixsans_51.png | Bin 4042 -> 1601 bytes .../test_mathtext/mathfont_stixsans_52.png | Bin 7084 -> 2997 bytes .../test_mathtext/mathfont_stixsans_53.png | Bin 6258 -> 2378 bytes .../test_mathtext/mathfont_stixsans_54.png | Bin 4147 -> 2022 bytes .../test_mathtext/mathfont_stixsans_55.png | Bin 7032 -> 3137 bytes .../test_mathtext/mathfont_stixsans_56.png | Bin 6056 -> 2699 bytes .../test_mathtext/mathfont_stixsans_57.png | Bin 4394 -> 2002 bytes .../test_mathtext/mathfont_stixsans_58.png | Bin 7611 -> 3176 bytes .../test_mathtext/mathfont_stixsans_59.png | Bin 6265 -> 2684 bytes .../test_mathtext/mathfont_stixsans_60.png | Bin 4336 -> 1684 bytes .../test_mathtext/mathfont_stixsans_61.png | Bin 8433 -> 3557 bytes .../test_mathtext/mathfont_stixsans_62.png | Bin 7138 -> 2827 bytes .../test_mathtext/mathfont_stixsans_63.png | Bin 5079 -> 2011 bytes .../test_mathtext/mathfont_stixsans_64.png | Bin 6997 -> 2686 bytes .../test_mathtext/mathtext0_cm_00.svg | 6 +- .../test_mathtext/mathtext0_cm_01.svg | 74 + .../test_mathtext/mathtext0_cm_02.svg | 74 + .../test_mathtext/mathtext0_cm_03.svg | 74 + .../test_mathtext/mathtext0_cm_04.svg | 74 + .../test_mathtext/mathtext0_cm_05.svg | 74 + .../test_mathtext/mathtext0_cm_06.svg | 74 + .../test_mathtext/mathtext0_dejavusans_00.svg | 5 +- .../test_mathtext/mathtext0_dejavusans_01.svg | 74 + .../test_mathtext/mathtext0_dejavusans_02.svg | 74 + .../test_mathtext/mathtext0_dejavusans_03.svg | 74 + .../test_mathtext/mathtext0_dejavusans_04.svg | 74 + .../test_mathtext/mathtext0_dejavusans_05.svg | 74 + .../test_mathtext/mathtext0_dejavusans_06.svg | 74 + .../test_mathtext/mathtext1_dejavusans_00.png | Bin 1895 -> 807 bytes .../test_mathtext/mathtext1_dejavusans_01.png | Bin 2147 -> 1601 bytes .../test_mathtext/mathtext1_dejavusans_02.png | Bin 2187 -> 2315 bytes .../test_mathtext/mathtext1_dejavusans_03.png | Bin 3853 -> 1811 bytes .../test_mathtext/mathtext1_dejavusans_04.png | Bin 7302 -> 3921 bytes .../test_mathtext/mathtext1_dejavusans_05.png | Bin 4749 -> 1845 bytes .../test_mathtext/mathtext1_dejavusans_06.png | Bin 4782 -> 1921 bytes .../test_mathtext/mathtext1_dejavusans_07.png | Bin 5696 -> 2399 bytes .../test_mathtext/mathtext1_dejavusans_08.png | Bin 6514 -> 3135 bytes .../test_mathtext/mathtext_cm_00.pdf | Bin 9100 -> 7140 bytes .../test_mathtext/mathtext_cm_00.png | Bin 1549 -> 883 bytes .../test_mathtext/mathtext_cm_00.svg | 437 +- .../test_mathtext/mathtext_cm_01.pdf | Bin 6429 -> 4873 bytes .../test_mathtext/mathtext_cm_01.png | Bin 1245 -> 603 bytes .../test_mathtext/mathtext_cm_01.svg | 308 +- .../test_mathtext/mathtext_cm_02.png | Bin 1798 -> 1110 bytes .../test_mathtext/mathtext_cm_02.svg | 321 +- .../test_mathtext/mathtext_cm_03.pdf | Bin 7052 -> 5900 bytes .../test_mathtext/mathtext_cm_03.png | Bin 1230 -> 766 bytes .../test_mathtext/mathtext_cm_03.svg | 423 +- .../test_mathtext/mathtext_cm_04.png | Bin 1092 -> 566 bytes .../test_mathtext/mathtext_cm_04.svg | 265 +- .../test_mathtext/mathtext_cm_05.pdf | Bin 8582 -> 7449 bytes .../test_mathtext/mathtext_cm_05.png | Bin 2220 -> 1664 bytes .../test_mathtext/mathtext_cm_05.svg | 648 +- .../test_mathtext/mathtext_cm_06.pdf | Bin 10776 -> 8901 bytes .../test_mathtext/mathtext_cm_06.png | Bin 2713 -> 1457 bytes .../test_mathtext/mathtext_cm_06.svg | 763 +- .../test_mathtext/mathtext_cm_07.pdf | Bin 7082 -> 6168 bytes .../test_mathtext/mathtext_cm_07.png | Bin 1694 -> 1053 bytes .../test_mathtext/mathtext_cm_07.svg | 403 +- .../test_mathtext/mathtext_cm_08.pdf | Bin 11929 -> 8492 bytes .../test_mathtext/mathtext_cm_08.png | Bin 1780 -> 768 bytes .../test_mathtext/mathtext_cm_08.svg | 468 +- .../test_mathtext/mathtext_cm_09.pdf | Bin 4444 -> 3604 bytes .../test_mathtext/mathtext_cm_09.png | Bin 1273 -> 998 bytes .../test_mathtext/mathtext_cm_09.svg | 277 +- .../test_mathtext/mathtext_cm_10.pdf | Bin 8553 -> 8438 bytes .../test_mathtext/mathtext_cm_10.png | Bin 2193 -> 892 bytes .../test_mathtext/mathtext_cm_10.svg | 644 +- .../test_mathtext/mathtext_cm_11.pdf | Bin 10580 -> 8829 bytes .../test_mathtext/mathtext_cm_11.png | Bin 1943 -> 858 bytes .../test_mathtext/mathtext_cm_11.svg | 638 +- .../test_mathtext/mathtext_cm_12.pdf | Bin 6092 -> 4642 bytes .../test_mathtext/mathtext_cm_12.png | Bin 905 -> 518 bytes .../test_mathtext/mathtext_cm_12.svg | 248 +- .../test_mathtext/mathtext_cm_13.png | Bin 1671 -> 751 bytes .../test_mathtext/mathtext_cm_13.svg | 466 +- .../test_mathtext/mathtext_cm_14.pdf | Bin 5828 -> 4359 bytes .../test_mathtext/mathtext_cm_14.png | Bin 936 -> 528 bytes .../test_mathtext/mathtext_cm_14.svg | 235 +- .../test_mathtext/mathtext_cm_15.pdf | Bin 5828 -> 4387 bytes .../test_mathtext/mathtext_cm_15.png | Bin 955 -> 524 bytes .../test_mathtext/mathtext_cm_15.svg | 235 +- .../test_mathtext/mathtext_cm_16.pdf | Bin 6554 -> 5071 bytes .../test_mathtext/mathtext_cm_16.png | Bin 1164 -> 588 bytes .../test_mathtext/mathtext_cm_16.svg | 346 +- .../test_mathtext/mathtext_cm_17.pdf | Bin 6554 -> 5071 bytes .../test_mathtext/mathtext_cm_17.png | Bin 1164 -> 588 bytes .../test_mathtext/mathtext_cm_17.svg | 346 +- .../test_mathtext/mathtext_cm_18.pdf | Bin 21444 -> 20546 bytes .../test_mathtext/mathtext_cm_18.png | Bin 7691 -> 2980 bytes .../test_mathtext/mathtext_cm_18.svg | 234 +- .../test_mathtext/mathtext_cm_19.pdf | Bin 9444 -> 7999 bytes .../test_mathtext/mathtext_cm_19.png | Bin 1862 -> 823 bytes .../test_mathtext/mathtext_cm_19.svg | 804 +- .../test_mathtext/mathtext_cm_20.pdf | Bin 13058 -> 12441 bytes .../test_mathtext/mathtext_cm_20.png | Bin 4001 -> 1688 bytes .../test_mathtext/mathtext_cm_20.svg | 1325 +- .../test_mathtext/mathtext_cm_21.pdf | Bin 17773 -> 16167 bytes .../test_mathtext/mathtext_cm_21.png | Bin 4633 -> 1758 bytes .../test_mathtext/mathtext_cm_21.svg | 112 +- .../test_mathtext/mathtext_cm_23.pdf | Bin 8765 -> 8658 bytes .../test_mathtext/mathtext_cm_23.png | Bin 2823 -> 1445 bytes .../test_mathtext/mathtext_cm_23.svg | 68 +- .../test_mathtext/mathtext_cm_24.pdf | Bin 5880 -> 4435 bytes .../test_mathtext/mathtext_cm_24.png | Bin 1103 -> 564 bytes .../test_mathtext/mathtext_cm_24.svg | 233 +- .../test_mathtext/mathtext_cm_25.pdf | Bin 6520 -> 5555 bytes .../test_mathtext/mathtext_cm_25.png | Bin 1261 -> 644 bytes .../test_mathtext/mathtext_cm_25.svg | 317 +- .../test_mathtext/mathtext_cm_26.pdf | Bin 9672 -> 9546 bytes .../test_mathtext/mathtext_cm_26.png | Bin 2496 -> 1018 bytes .../test_mathtext/mathtext_cm_26.svg | 689 +- .../test_mathtext/mathtext_cm_27.pdf | Bin 9155 -> 8057 bytes .../test_mathtext/mathtext_cm_27.png | Bin 2355 -> 1114 bytes .../test_mathtext/mathtext_cm_27.svg | 727 +- .../test_mathtext/mathtext_cm_28.pdf | Bin 8959 -> 7697 bytes .../test_mathtext/mathtext_cm_28.png | Bin 1849 -> 798 bytes .../test_mathtext/mathtext_cm_28.svg | 707 +- .../test_mathtext/mathtext_cm_29.pdf | Bin 10712 -> 8694 bytes .../test_mathtext/mathtext_cm_29.png | Bin 2120 -> 894 bytes .../test_mathtext/mathtext_cm_29.svg | 748 +- .../test_mathtext/mathtext_cm_31.pdf | Bin 9866 -> 8299 bytes .../test_mathtext/mathtext_cm_31.png | Bin 2145 -> 1088 bytes .../test_mathtext/mathtext_cm_31.svg | 555 +- .../test_mathtext/mathtext_cm_32.pdf | Bin 7256 -> 5780 bytes .../test_mathtext/mathtext_cm_32.png | Bin 1179 -> 701 bytes .../test_mathtext/mathtext_cm_32.svg | 463 +- .../test_mathtext/mathtext_cm_33.pdf | Bin 10184 -> 8045 bytes .../test_mathtext/mathtext_cm_33.png | Bin 2012 -> 876 bytes .../test_mathtext/mathtext_cm_33.svg | 669 +- .../test_mathtext/mathtext_cm_35.pdf | Bin 9049 -> 6920 bytes .../test_mathtext/mathtext_cm_35.png | Bin 1493 -> 708 bytes .../test_mathtext/mathtext_cm_35.svg | 461 +- .../test_mathtext/mathtext_cm_36.pdf | Bin 4273 -> 3487 bytes .../test_mathtext/mathtext_cm_36.png | Bin 961 -> 558 bytes .../test_mathtext/mathtext_cm_36.svg | 291 +- .../test_mathtext/mathtext_cm_37.pdf | Bin 18555 -> 18069 bytes .../test_mathtext/mathtext_cm_37.png | Bin 6965 -> 2832 bytes .../test_mathtext/mathtext_cm_37.svg | 1643 +- .../test_mathtext/mathtext_cm_38.pdf | Bin 15053 -> 13012 bytes .../test_mathtext/mathtext_cm_38.png | Bin 3758 -> 1517 bytes .../test_mathtext/mathtext_cm_38.svg | 1108 +- .../test_mathtext/mathtext_cm_39.pdf | Bin 8522 -> 8435 bytes .../test_mathtext/mathtext_cm_39.png | Bin 2123 -> 948 bytes .../test_mathtext/mathtext_cm_39.svg | 601 +- .../test_mathtext/mathtext_cm_40.pdf | Bin 7454 -> 7342 bytes .../test_mathtext/mathtext_cm_40.png | Bin 3392 -> 1365 bytes .../test_mathtext/mathtext_cm_40.svg | 789 +- .../test_mathtext/mathtext_cm_41.pdf | Bin 15139 -> 15205 bytes .../test_mathtext/mathtext_cm_41.png | Bin 5293 -> 1977 bytes .../test_mathtext/mathtext_cm_41.svg | 1880 +- .../test_mathtext/mathtext_cm_42.pdf | Bin 6559 -> 5076 bytes .../test_mathtext/mathtext_cm_42.png | Bin 1311 -> 672 bytes .../test_mathtext/mathtext_cm_42.svg | 348 +- .../test_mathtext/mathtext_cm_43.pdf | Bin 6467 -> 5000 bytes .../test_mathtext/mathtext_cm_43.png | Bin 1172 -> 616 bytes .../test_mathtext/mathtext_cm_43.svg | 340 +- .../test_mathtext/mathtext_cm_44.pdf | Bin 7948 -> 6539 bytes .../test_mathtext/mathtext_cm_44.png | Bin 1395 -> 708 bytes .../test_mathtext/mathtext_cm_44.svg | 561 +- .../test_mathtext/mathtext_cm_45.pdf | Bin 7956 -> 6545 bytes .../test_mathtext/mathtext_cm_45.png | Bin 1619 -> 750 bytes .../test_mathtext/mathtext_cm_45.svg | 561 +- .../test_mathtext/mathtext_cm_46.pdf | Bin 6400 -> 5143 bytes .../test_mathtext/mathtext_cm_46.png | Bin 1142 -> 588 bytes .../test_mathtext/mathtext_cm_46.svg | 315 +- .../test_mathtext/mathtext_cm_47.pdf | Bin 8006 -> 6559 bytes .../test_mathtext/mathtext_cm_47.png | Bin 2052 -> 900 bytes .../test_mathtext/mathtext_cm_47.svg | 569 +- .../test_mathtext/mathtext_cm_48.pdf | Bin 8006 -> 6420 bytes .../test_mathtext/mathtext_cm_48.png | Bin 2052 -> 1099 bytes .../test_mathtext/mathtext_cm_48.svg | 571 +- .../test_mathtext/mathtext_cm_49.pdf | Bin 9169 -> 7217 bytes .../test_mathtext/mathtext_cm_49.png | Bin 1757 -> 795 bytes .../test_mathtext/mathtext_cm_49.svg | 447 +- .../test_mathtext/mathtext_cm_50.pdf | Bin 10368 -> 9207 bytes .../test_mathtext/mathtext_cm_50.png | Bin 2738 -> 1274 bytes .../test_mathtext/mathtext_cm_50.svg | 640 +- .../test_mathtext/mathtext_cm_51.pdf | Bin 6548 -> 5112 bytes .../test_mathtext/mathtext_cm_51.png | Bin 1149 -> 572 bytes .../test_mathtext/mathtext_cm_51.svg | 346 +- .../test_mathtext/mathtext_cm_52.pdf | Bin 12280 -> 10309 bytes .../test_mathtext/mathtext_cm_52.png | Bin 3498 -> 1866 bytes .../test_mathtext/mathtext_cm_52.svg | 110 +- .../test_mathtext/mathtext_cm_53.pdf | Bin 8959 -> 6892 bytes .../test_mathtext/mathtext_cm_53.png | Bin 4408 -> 2397 bytes .../test_mathtext/mathtext_cm_53.svg | 466 +- .../test_mathtext/mathtext_cm_54.pdf | Bin 16633 -> 13485 bytes .../test_mathtext/mathtext_cm_54.png | Bin 4195 -> 1819 bytes .../test_mathtext/mathtext_cm_54.svg | 1026 +- .../test_mathtext/mathtext_cm_55.pdf | Bin 5864 -> 4402 bytes .../test_mathtext/mathtext_cm_55.png | Bin 1101 -> 570 bytes .../test_mathtext/mathtext_cm_55.svg | 239 +- .../test_mathtext/mathtext_cm_56.pdf | Bin 9413 -> 7558 bytes .../test_mathtext/mathtext_cm_56.png | Bin 1743 -> 818 bytes .../test_mathtext/mathtext_cm_56.svg | 518 +- .../test_mathtext/mathtext_cm_57.pdf | Bin 9039 -> 6976 bytes .../test_mathtext/mathtext_cm_57.png | Bin 2137 -> 1123 bytes .../test_mathtext/mathtext_cm_57.svg | 476 +- .../test_mathtext/mathtext_cm_58.pdf | Bin 6552 -> 5118 bytes .../test_mathtext/mathtext_cm_58.png | Bin 1111 -> 574 bytes .../test_mathtext/mathtext_cm_58.svg | 346 +- .../test_mathtext/mathtext_cm_59.pdf | Bin 6556 -> 5121 bytes .../test_mathtext/mathtext_cm_59.png | Bin 1093 -> 572 bytes .../test_mathtext/mathtext_cm_59.svg | 346 +- .../test_mathtext/mathtext_cm_60.pdf | Bin 9280 -> 8116 bytes .../test_mathtext/mathtext_cm_60.png | Bin 2063 -> 900 bytes .../test_mathtext/mathtext_cm_60.svg | 762 +- .../test_mathtext/mathtext_cm_61.pdf | Bin 7228 -> 6518 bytes .../test_mathtext/mathtext_cm_61.png | Bin 1475 -> 692 bytes .../test_mathtext/mathtext_cm_61.svg | 705 +- .../test_mathtext/mathtext_cm_62.pdf | Bin 7929 -> 5788 bytes .../test_mathtext/mathtext_cm_62.png | Bin 1125 -> 607 bytes .../test_mathtext/mathtext_cm_62.svg | 288 +- .../test_mathtext/mathtext_cm_63.pdf | Bin 8318 -> 6223 bytes .../test_mathtext/mathtext_cm_63.png | Bin 1442 -> 856 bytes .../test_mathtext/mathtext_cm_63.svg | 310 +- .../test_mathtext/mathtext_cm_64.pdf | Bin 7307 -> 5921 bytes .../test_mathtext/mathtext_cm_64.png | Bin 1603 -> 750 bytes .../test_mathtext/mathtext_cm_64.svg | 416 +- .../test_mathtext/mathtext_cm_65.png | Bin 1299 -> 637 bytes .../test_mathtext/mathtext_cm_65.svg | 308 +- .../test_mathtext/mathtext_cm_68.pdf | Bin 6262 -> 4892 bytes .../test_mathtext/mathtext_cm_68.png | Bin 1825 -> 1406 bytes .../test_mathtext/mathtext_cm_68.svg | 432 +- .../test_mathtext/mathtext_cm_69.pdf | Bin 7451 -> 5458 bytes .../test_mathtext/mathtext_cm_69.png | Bin 1215 -> 625 bytes .../test_mathtext/mathtext_cm_69.svg | 32 +- .../test_mathtext/mathtext_cm_70.pdf | Bin 3606 -> 2805 bytes .../test_mathtext/mathtext_cm_70.png | Bin 1248 -> 2121 bytes .../test_mathtext/mathtext_cm_70.svg | 166 +- .../test_mathtext/mathtext_cm_71.pdf | Bin 8292 -> 5986 bytes .../test_mathtext/mathtext_cm_71.png | Bin 1581 -> 719 bytes .../test_mathtext/mathtext_cm_71.svg | 271 +- .../test_mathtext/mathtext_cm_72.pdf | Bin 6428 -> 5598 bytes .../test_mathtext/mathtext_cm_72.png | Bin 1019 -> 583 bytes .../test_mathtext/mathtext_cm_72.svg | 249 +- .../test_mathtext/mathtext_cm_73.pdf | Bin 15149 -> 13196 bytes .../test_mathtext/mathtext_cm_73.png | Bin 3912 -> 2044 bytes .../test_mathtext/mathtext_cm_73.svg | 1436 +- .../test_mathtext/mathtext_cm_74.pdf | Bin 15149 -> 13196 bytes .../test_mathtext/mathtext_cm_74.png | Bin 3912 -> 2044 bytes .../test_mathtext/mathtext_cm_74.svg | 1436 +- .../test_mathtext/mathtext_cm_75.pdf | Bin 8166 -> 6836 bytes .../test_mathtext/mathtext_cm_75.png | Bin 3257 -> 3263 bytes .../test_mathtext/mathtext_cm_75.svg | 609 +- .../test_mathtext/mathtext_cm_76.pdf | Bin 8098 -> 6692 bytes .../test_mathtext/mathtext_cm_76.png | Bin 2295 -> 986 bytes .../test_mathtext/mathtext_cm_76.svg | 537 +- .../test_mathtext/mathtext_cm_78.pdf | Bin 9683 -> 7672 bytes .../test_mathtext/mathtext_cm_78.png | Bin 2120 -> 1526 bytes .../test_mathtext/mathtext_cm_78.svg | 541 +- .../test_mathtext/mathtext_cm_79.pdf | Bin 7232 -> 6104 bytes .../test_mathtext/mathtext_cm_79.png | Bin 1462 -> 722 bytes .../test_mathtext/mathtext_cm_79.svg | 439 +- .../test_mathtext/mathtext_cm_80.pdf | Bin 13268 -> 11424 bytes .../test_mathtext/mathtext_cm_80.png | Bin 4059 -> 2221 bytes .../test_mathtext/mathtext_cm_80.svg | 1098 +- .../test_mathtext/mathtext_cm_81.pdf | Bin 7171 -> 5730 bytes .../test_mathtext/mathtext_cm_81.png | Bin 1541 -> 678 bytes .../test_mathtext/mathtext_cm_81.svg | 420 +- .../test_mathtext/mathtext_cm_82.pdf | Bin 6940 -> 5898 bytes .../test_mathtext/mathtext_cm_82.png | Bin 1805 -> 989 bytes .../test_mathtext/mathtext_cm_82.svg | 418 +- .../test_mathtext/mathtext_cm_83.pdf | Bin 8267 -> 6208 bytes .../test_mathtext/mathtext_cm_83.png | Bin 1459 -> 677 bytes .../test_mathtext/mathtext_cm_83.svg | 28 +- .../test_mathtext/mathtext_dejavusans_00.pdf | Bin 6741 -> 6241 bytes .../test_mathtext/mathtext_dejavusans_00.png | Bin 1759 -> 1044 bytes .../test_mathtext/mathtext_dejavusans_00.svg | 312 +- .../test_mathtext/mathtext_dejavusans_01.pdf | Bin 5391 -> 3828 bytes .../test_mathtext/mathtext_dejavusans_01.png | Bin 1270 -> 634 bytes .../test_mathtext/mathtext_dejavusans_01.svg | 124 +- .../test_mathtext/mathtext_dejavusans_02.pdf | Bin 6635 -> 5370 bytes .../test_mathtext/mathtext_dejavusans_02.png | Bin 1858 -> 1133 bytes .../test_mathtext/mathtext_dejavusans_02.svg | 276 +- .../test_mathtext/mathtext_dejavusans_03.pdf | Bin 6101 -> 4722 bytes .../test_mathtext/mathtext_dejavusans_03.png | Bin 1326 -> 875 bytes .../test_mathtext/mathtext_dejavusans_03.svg | 243 +- .../test_mathtext/mathtext_dejavusans_04.pdf | Bin 3410 -> 2617 bytes .../test_mathtext/mathtext_dejavusans_04.png | Bin 1118 -> 584 bytes .../test_mathtext/mathtext_dejavusans_04.svg | 91 +- .../test_mathtext/mathtext_dejavusans_05.pdf | Bin 6813 -> 5507 bytes .../test_mathtext/mathtext_dejavusans_05.png | Bin 2399 -> 1857 bytes .../test_mathtext/mathtext_dejavusans_05.svg | 334 +- .../test_mathtext/mathtext_dejavusans_06.png | Bin 2834 -> 1655 bytes .../test_mathtext/mathtext_dejavusans_06.svg | 412 +- .../test_mathtext/mathtext_dejavusans_07.pdf | Bin 5908 -> 5342 bytes .../test_mathtext/mathtext_dejavusans_07.png | Bin 1690 -> 1163 bytes .../test_mathtext/mathtext_dejavusans_07.svg | 165 +- .../test_mathtext/mathtext_dejavusans_08.pdf | Bin 9345 -> 6458 bytes .../test_mathtext/mathtext_dejavusans_08.png | Bin 1650 -> 832 bytes .../test_mathtext/mathtext_dejavusans_08.svg | 219 +- .../test_mathtext/mathtext_dejavusans_09.pdf | Bin 3469 -> 2675 bytes .../test_mathtext/mathtext_dejavusans_09.png | Bin 1277 -> 1091 bytes .../test_mathtext/mathtext_dejavusans_09.svg | 103 +- .../test_mathtext/mathtext_dejavusans_10.pdf | Bin 5951 -> 5813 bytes .../test_mathtext/mathtext_dejavusans_10.png | Bin 2476 -> 1037 bytes .../test_mathtext/mathtext_dejavusans_10.svg | 456 +- .../test_mathtext/mathtext_dejavusans_11.pdf | Bin 9235 -> 8369 bytes .../test_mathtext/mathtext_dejavusans_11.png | Bin 2110 -> 918 bytes .../test_mathtext/mathtext_dejavusans_11.svg | 366 +- .../test_mathtext/mathtext_dejavusans_12.png | Bin 1238 -> 625 bytes .../test_mathtext/mathtext_dejavusans_12.svg | 110 +- .../test_mathtext/mathtext_dejavusans_13.png | Bin 1753 -> 806 bytes .../test_mathtext/mathtext_dejavusans_13.svg | 234 +- .../test_mathtext/mathtext_dejavusans_14.pdf | Bin 5193 -> 3730 bytes .../test_mathtext/mathtext_dejavusans_14.png | Bin 981 -> 535 bytes .../test_mathtext/mathtext_dejavusans_14.svg | 107 +- .../test_mathtext/mathtext_dejavusans_15.pdf | Bin 5189 -> 3715 bytes .../test_mathtext/mathtext_dejavusans_15.png | Bin 982 -> 527 bytes .../test_mathtext/mathtext_dejavusans_15.svg | 107 +- .../test_mathtext/mathtext_dejavusans_16.pdf | Bin 5447 -> 3991 bytes .../test_mathtext/mathtext_dejavusans_16.png | Bin 1198 -> 608 bytes .../test_mathtext/mathtext_dejavusans_16.svg | 140 +- .../test_mathtext/mathtext_dejavusans_17.pdf | Bin 5447 -> 3991 bytes .../test_mathtext/mathtext_dejavusans_17.png | Bin 1198 -> 608 bytes .../test_mathtext/mathtext_dejavusans_17.svg | 140 +- .../test_mathtext/mathtext_dejavusans_18.pdf | Bin 18976 -> 17155 bytes .../test_mathtext/mathtext_dejavusans_18.png | Bin 7175 -> 2991 bytes .../test_mathtext/mathtext_dejavusans_18.svg | 234 +- .../test_mathtext/mathtext_dejavusans_19.pdf | Bin 7324 -> 5971 bytes .../test_mathtext/mathtext_dejavusans_19.png | Bin 1958 -> 885 bytes .../test_mathtext/mathtext_dejavusans_19.svg | 416 +- .../test_mathtext/mathtext_dejavusans_20.pdf | Bin 9626 -> 9583 bytes .../test_mathtext/mathtext_dejavusans_20.png | Bin 4473 -> 1841 bytes .../test_mathtext/mathtext_dejavusans_20.svg | 657 +- .../test_mathtext/mathtext_dejavusans_21.pdf | Bin 11422 -> 12232 bytes .../test_mathtext/mathtext_dejavusans_21.png | Bin 4762 -> 1868 bytes .../test_mathtext/mathtext_dejavusans_21.svg | 112 +- .../test_mathtext/mathtext_dejavusans_23.pdf | Bin 8464 -> 8370 bytes .../test_mathtext/mathtext_dejavusans_23.png | Bin 2822 -> 1524 bytes .../test_mathtext/mathtext_dejavusans_23.svg | 68 +- .../test_mathtext/mathtext_dejavusans_24.pdf | Bin 5346 -> 3811 bytes .../test_mathtext/mathtext_dejavusans_24.png | Bin 1065 -> 593 bytes .../test_mathtext/mathtext_dejavusans_24.svg | 109 +- .../test_mathtext/mathtext_dejavusans_25.pdf | Bin 5755 -> 5256 bytes .../test_mathtext/mathtext_dejavusans_25.png | Bin 1290 -> 653 bytes .../test_mathtext/mathtext_dejavusans_25.svg | 165 +- .../test_mathtext/mathtext_dejavusans_26.pdf | Bin 9048 -> 9340 bytes .../test_mathtext/mathtext_dejavusans_26.png | Bin 2716 -> 1172 bytes .../test_mathtext/mathtext_dejavusans_26.svg | 499 +- .../test_mathtext/mathtext_dejavusans_27.png | Bin 2464 -> 1249 bytes .../test_mathtext/mathtext_dejavusans_27.svg | 48 +- .../test_mathtext/mathtext_dejavusans_28.pdf | Bin 7176 -> 6611 bytes .../test_mathtext/mathtext_dejavusans_28.png | Bin 2109 -> 882 bytes .../test_mathtext/mathtext_dejavusans_28.svg | 361 +- .../test_mathtext/mathtext_dejavusans_29.pdf | Bin 7527 -> 7000 bytes .../test_mathtext/mathtext_dejavusans_29.png | Bin 2064 -> 905 bytes .../test_mathtext/mathtext_dejavusans_29.svg | 68 +- .../test_mathtext/mathtext_dejavusans_31.png | Bin 2183 -> 1096 bytes .../test_mathtext/mathtext_dejavusans_31.svg | 271 +- .../test_mathtext/mathtext_dejavusans_32.pdf | Bin 6017 -> 4594 bytes .../test_mathtext/mathtext_dejavusans_32.png | Bin 1291 -> 779 bytes .../test_mathtext/mathtext_dejavusans_32.svg | 231 +- .../test_mathtext/mathtext_dejavusans_33.pdf | Bin 8532 -> 6387 bytes .../test_mathtext/mathtext_dejavusans_33.png | Bin 2110 -> 882 bytes .../test_mathtext/mathtext_dejavusans_33.svg | 317 +- .../test_mathtext/mathtext_dejavusans_35.pdf | Bin 6197 -> 5705 bytes .../test_mathtext/mathtext_dejavusans_35.png | Bin 1614 -> 734 bytes .../test_mathtext/mathtext_dejavusans_35.svg | 229 +- .../test_mathtext/mathtext_dejavusans_36.pdf | Bin 3392 -> 2603 bytes .../test_mathtext/mathtext_dejavusans_36.png | Bin 987 -> 542 bytes .../test_mathtext/mathtext_dejavusans_36.svg | 103 +- .../test_mathtext/mathtext_dejavusans_37.pdf | Bin 17434 -> 15461 bytes .../test_mathtext/mathtext_dejavusans_37.png | Bin 7615 -> 3265 bytes .../test_mathtext/mathtext_dejavusans_37.svg | 1019 +- .../test_mathtext/mathtext_dejavusans_38.pdf | Bin 14291 -> 11686 bytes .../test_mathtext/mathtext_dejavusans_38.png | Bin 3547 -> 1592 bytes .../test_mathtext/mathtext_dejavusans_38.svg | 586 +- .../test_mathtext/mathtext_dejavusans_39.pdf | Bin 7864 -> 6305 bytes .../test_mathtext/mathtext_dejavusans_39.png | Bin 2653 -> 1055 bytes .../test_mathtext/mathtext_dejavusans_39.svg | 437 +- .../test_mathtext/mathtext_dejavusans_40.pdf | Bin 6360 -> 5075 bytes .../test_mathtext/mathtext_dejavusans_40.png | Bin 3090 -> 1384 bytes .../test_mathtext/mathtext_dejavusans_40.svg | 425 +- .../test_mathtext/mathtext_dejavusans_41.pdf | Bin 11666 -> 9554 bytes .../test_mathtext/mathtext_dejavusans_41.png | Bin 6324 -> 2453 bytes .../test_mathtext/mathtext_dejavusans_41.svg | 1035 +- .../test_mathtext/mathtext_dejavusans_42.png | Bin 1315 -> 708 bytes .../test_mathtext/mathtext_dejavusans_42.svg | 142 +- .../test_mathtext/mathtext_dejavusans_43.png | Bin 1096 -> 585 bytes .../test_mathtext/mathtext_dejavusans_43.svg | 168 +- .../test_mathtext/mathtext_dejavusans_44.pdf | Bin 6097 -> 4755 bytes .../test_mathtext/mathtext_dejavusans_44.png | Bin 1535 -> 751 bytes .../test_mathtext/mathtext_dejavusans_44.svg | 235 +- .../test_mathtext/mathtext_dejavusans_45.pdf | Bin 6110 -> 4760 bytes .../test_mathtext/mathtext_dejavusans_45.png | Bin 1648 -> 770 bytes .../test_mathtext/mathtext_dejavusans_45.svg | 235 +- .../test_mathtext/mathtext_dejavusans_46.pdf | Bin 6095 -> 4648 bytes .../test_mathtext/mathtext_dejavusans_46.png | Bin 1266 -> 635 bytes .../test_mathtext/mathtext_dejavusans_46.svg | 32 +- .../test_mathtext/mathtext_dejavusans_47.pdf | Bin 7144 -> 5727 bytes .../test_mathtext/mathtext_dejavusans_47.png | Bin 2458 -> 1002 bytes .../test_mathtext/mathtext_dejavusans_47.svg | 409 +- .../test_mathtext/mathtext_dejavusans_48.pdf | Bin 7144 -> 5572 bytes .../test_mathtext/mathtext_dejavusans_48.png | Bin 2458 -> 1185 bytes .../test_mathtext/mathtext_dejavusans_48.svg | 411 +- .../test_mathtext/mathtext_dejavusans_49.pdf | Bin 7926 -> 5862 bytes .../test_mathtext/mathtext_dejavusans_49.png | Bin 1691 -> 792 bytes .../test_mathtext/mathtext_dejavusans_49.svg | 30 +- .../test_mathtext/mathtext_dejavusans_50.pdf | Bin 8758 -> 7587 bytes .../test_mathtext/mathtext_dejavusans_50.png | Bin 2981 -> 1421 bytes .../test_mathtext/mathtext_dejavusans_50.svg | 332 +- .../test_mathtext/mathtext_dejavusans_51.pdf | Bin 5450 -> 3991 bytes .../test_mathtext/mathtext_dejavusans_51.png | Bin 1214 -> 589 bytes .../test_mathtext/mathtext_dejavusans_51.svg | 140 +- .../test_mathtext/mathtext_dejavusans_52.pdf | Bin 10407 -> 8124 bytes .../test_mathtext/mathtext_dejavusans_52.png | Bin 3564 -> 1709 bytes .../test_mathtext/mathtext_dejavusans_52.svg | 110 +- .../test_mathtext/mathtext_dejavusans_53.pdf | Bin 11647 -> 7958 bytes .../test_mathtext/mathtext_dejavusans_53.png | Bin 4426 -> 2514 bytes .../test_mathtext/mathtext_dejavusans_53.svg | 309 +- .../test_mathtext/mathtext_dejavusans_54.pdf | Bin 10591 -> 10752 bytes .../test_mathtext/mathtext_dejavusans_54.png | Bin 4581 -> 2012 bytes .../test_mathtext/mathtext_dejavusans_54.svg | 530 +- .../test_mathtext/mathtext_dejavusans_55.pdf | Bin 5228 -> 3759 bytes .../test_mathtext/mathtext_dejavusans_55.png | Bin 1171 -> 600 bytes .../test_mathtext/mathtext_dejavusans_55.svg | 111 +- .../test_mathtext/mathtext_dejavusans_56.pdf | Bin 8061 -> 6177 bytes .../test_mathtext/mathtext_dejavusans_56.png | Bin 1599 -> 758 bytes .../test_mathtext/mathtext_dejavusans_56.svg | 274 +- .../test_mathtext/mathtext_dejavusans_57.pdf | Bin 7855 -> 5734 bytes .../test_mathtext/mathtext_dejavusans_57.png | Bin 2082 -> 1074 bytes .../test_mathtext/mathtext_dejavusans_57.svg | 222 +- .../test_mathtext/mathtext_dejavusans_58.pdf | Bin 5454 -> 3997 bytes .../test_mathtext/mathtext_dejavusans_58.png | Bin 1111 -> 609 bytes .../test_mathtext/mathtext_dejavusans_58.svg | 140 +- .../test_mathtext/mathtext_dejavusans_59.pdf | Bin 5459 -> 4003 bytes .../test_mathtext/mathtext_dejavusans_59.png | Bin 1124 -> 589 bytes .../test_mathtext/mathtext_dejavusans_59.svg | 140 +- .../test_mathtext/mathtext_dejavusans_60.pdf | Bin 7472 -> 7013 bytes .../test_mathtext/mathtext_dejavusans_60.png | Bin 2257 -> 1037 bytes .../test_mathtext/mathtext_dejavusans_60.svg | 42 +- .../test_mathtext/mathtext_dejavusans_61.pdf | Bin 5391 -> 4697 bytes .../test_mathtext/mathtext_dejavusans_61.png | Bin 1634 -> 742 bytes .../test_mathtext/mathtext_dejavusans_61.svg | 363 +- .../test_mathtext/mathtext_dejavusans_62.pdf | Bin 7266 -> 5127 bytes .../test_mathtext/mathtext_dejavusans_62.png | Bin 1148 -> 636 bytes .../test_mathtext/mathtext_dejavusans_62.svg | 160 +- .../test_mathtext/mathtext_dejavusans_63.pdf | Bin 6114 -> 5532 bytes .../test_mathtext/mathtext_dejavusans_63.png | Bin 1591 -> 987 bytes .../test_mathtext/mathtext_dejavusans_63.svg | 178 +- .../test_mathtext/mathtext_dejavusans_64.png | Bin 2034 -> 870 bytes .../test_mathtext/mathtext_dejavusans_64.svg | 286 +- .../test_mathtext/mathtext_dejavusans_65.pdf | Bin 4103 -> 3971 bytes .../test_mathtext/mathtext_dejavusans_65.png | Bin 1302 -> 672 bytes .../test_mathtext/mathtext_dejavusans_65.svg | 195 +- .../test_mathtext/mathtext_dejavusans_68.pdf | Bin 6116 -> 5571 bytes .../test_mathtext/mathtext_dejavusans_68.png | Bin 2089 -> 1734 bytes .../test_mathtext/mathtext_dejavusans_68.svg | 368 +- .../test_mathtext/mathtext_dejavusans_69.pdf | Bin 5553 -> 4661 bytes .../test_mathtext/mathtext_dejavusans_69.png | Bin 1176 -> 660 bytes .../test_mathtext/mathtext_dejavusans_69.svg | 161 +- .../test_mathtext/mathtext_dejavusans_70.png | Bin 1259 -> 1941 bytes .../test_mathtext/mathtext_dejavusans_70.svg | 82 +- .../test_mathtext/mathtext_dejavusans_71.pdf | Bin 4688 -> 5802 bytes .../test_mathtext/mathtext_dejavusans_71.png | Bin 1722 -> 789 bytes .../test_mathtext/mathtext_dejavusans_71.svg | 36 +- .../test_mathtext/mathtext_dejavusans_72.pdf | Bin 4251 -> 5061 bytes .../test_mathtext/mathtext_dejavusans_72.png | Bin 930 -> 572 bytes .../test_mathtext/mathtext_dejavusans_72.svg | 179 +- .../test_mathtext/mathtext_dejavusans_73.pdf | Bin 9259 -> 8981 bytes .../test_mathtext/mathtext_dejavusans_73.png | Bin 4018 -> 2307 bytes .../test_mathtext/mathtext_dejavusans_73.svg | 646 +- .../test_mathtext/mathtext_dejavusans_74.pdf | Bin 9259 -> 8981 bytes .../test_mathtext/mathtext_dejavusans_74.png | Bin 4018 -> 2307 bytes .../test_mathtext/mathtext_dejavusans_74.svg | 646 +- .../test_mathtext/mathtext_dejavusans_75.pdf | Bin 6257 -> 4705 bytes .../test_mathtext/mathtext_dejavusans_75.png | Bin 2714 -> 2854 bytes .../test_mathtext/mathtext_dejavusans_75.svg | 257 +- .../test_mathtext/mathtext_dejavusans_76.png | Bin 2353 -> 1007 bytes .../test_mathtext/mathtext_dejavusans_76.svg | 451 +- .../test_mathtext/mathtext_dejavusans_78.pdf | Bin 5432 -> 5647 bytes .../test_mathtext/mathtext_dejavusans_78.png | Bin 2458 -> 1502 bytes .../test_mathtext/mathtext_dejavusans_78.svg | 355 +- .../test_mathtext/mathtext_dejavusans_79.pdf | Bin 6199 -> 5680 bytes .../test_mathtext/mathtext_dejavusans_79.png | Bin 1672 -> 821 bytes .../test_mathtext/mathtext_dejavusans_79.svg | 235 +- .../test_mathtext/mathtext_dejavusans_80.png | Bin 4242 -> 2500 bytes .../test_mathtext/mathtext_dejavusans_80.svg | 738 +- .../test_mathtext/mathtext_dejavusans_81.pdf | Bin 6308 -> 4882 bytes .../test_mathtext/mathtext_dejavusans_81.png | Bin 1857 -> 795 bytes .../test_mathtext/mathtext_dejavusans_81.svg | 244 +- .../test_mathtext/mathtext_dejavusans_82.pdf | Bin 5955 -> 4722 bytes .../test_mathtext/mathtext_dejavusans_82.png | Bin 1892 -> 1091 bytes .../test_mathtext/mathtext_dejavusans_82.svg | 239 +- .../test_mathtext/mathtext_dejavusans_83.pdf | Bin 6304 -> 5841 bytes .../test_mathtext/mathtext_dejavusans_83.png | Bin 1736 -> 771 bytes .../test_mathtext/mathtext_dejavusans_83.svg | 28 +- .../test_mathtext/mathtext_dejavuserif_00.pdf | Bin 6884 -> 7335 bytes .../test_mathtext/mathtext_dejavuserif_00.png | Bin 1700 -> 1031 bytes .../test_mathtext/mathtext_dejavuserif_00.svg | 327 +- .../test_mathtext/mathtext_dejavuserif_01.pdf | Bin 5538 -> 4000 bytes .../test_mathtext/mathtext_dejavuserif_01.png | Bin 1292 -> 642 bytes .../test_mathtext/mathtext_dejavuserif_01.svg | 156 +- .../test_mathtext/mathtext_dejavuserif_02.pdf | Bin 8388 -> 6255 bytes .../test_mathtext/mathtext_dejavuserif_02.png | Bin 1824 -> 1123 bytes .../test_mathtext/mathtext_dejavuserif_02.svg | 295 +- .../test_mathtext/mathtext_dejavuserif_03.pdf | Bin 6277 -> 4877 bytes .../test_mathtext/mathtext_dejavuserif_03.png | Bin 1404 -> 868 bytes .../test_mathtext/mathtext_dejavuserif_03.svg | 269 +- .../test_mathtext/mathtext_dejavuserif_04.png | Bin 1080 -> 604 bytes .../test_mathtext/mathtext_dejavuserif_04.svg | 113 +- .../test_mathtext/mathtext_dejavuserif_05.pdf | Bin 7085 -> 5770 bytes .../test_mathtext/mathtext_dejavuserif_05.png | Bin 2374 -> 1906 bytes .../test_mathtext/mathtext_dejavuserif_05.svg | 380 +- .../test_mathtext/mathtext_dejavuserif_06.pdf | Bin 7184 -> 7089 bytes .../test_mathtext/mathtext_dejavuserif_06.png | Bin 2968 -> 1727 bytes .../test_mathtext/mathtext_dejavuserif_06.svg | 438 +- .../test_mathtext/mathtext_dejavuserif_07.pdf | Bin 5995 -> 5423 bytes .../test_mathtext/mathtext_dejavuserif_07.png | Bin 1574 -> 1125 bytes .../test_mathtext/mathtext_dejavuserif_07.svg | 187 +- .../test_mathtext/mathtext_dejavuserif_08.pdf | Bin 11311 -> 7752 bytes .../test_mathtext/mathtext_dejavuserif_08.png | Bin 1827 -> 852 bytes .../test_mathtext/mathtext_dejavuserif_08.svg | 316 +- .../test_mathtext/mathtext_dejavuserif_09.png | Bin 1209 -> 1033 bytes .../test_mathtext/mathtext_dejavuserif_09.svg | 125 +- .../test_mathtext/mathtext_dejavuserif_10.png | Bin 2379 -> 1064 bytes .../test_mathtext/mathtext_dejavuserif_10.svg | 492 +- .../test_mathtext/mathtext_dejavuserif_11.pdf | Bin 9340 -> 8467 bytes .../test_mathtext/mathtext_dejavuserif_11.png | Bin 2071 -> 918 bytes .../test_mathtext/mathtext_dejavuserif_11.svg | 394 +- .../test_mathtext/mathtext_dejavuserif_12.png | Bin 1194 -> 630 bytes .../test_mathtext/mathtext_dejavuserif_12.svg | 118 +- .../test_mathtext/mathtext_dejavuserif_13.png | Bin 1736 -> 834 bytes .../test_mathtext/mathtext_dejavuserif_13.svg | 286 +- .../test_mathtext/mathtext_dejavuserif_14.pdf | Bin 5182 -> 3707 bytes .../test_mathtext/mathtext_dejavuserif_14.png | Bin 943 -> 540 bytes .../test_mathtext/mathtext_dejavuserif_14.svg | 117 +- .../test_mathtext/mathtext_dejavuserif_15.pdf | Bin 5182 -> 3703 bytes .../test_mathtext/mathtext_dejavuserif_15.png | Bin 968 -> 535 bytes .../test_mathtext/mathtext_dejavuserif_15.svg | 117 +- .../test_mathtext/mathtext_dejavuserif_16.pdf | Bin 5517 -> 4057 bytes .../test_mathtext/mathtext_dejavuserif_16.png | Bin 1212 -> 613 bytes .../test_mathtext/mathtext_dejavuserif_16.svg | 164 +- .../test_mathtext/mathtext_dejavuserif_17.pdf | Bin 5517 -> 4057 bytes .../test_mathtext/mathtext_dejavuserif_17.png | Bin 1212 -> 613 bytes .../test_mathtext/mathtext_dejavuserif_17.svg | 164 +- .../test_mathtext/mathtext_dejavuserif_18.pdf | Bin 19530 -> 17692 bytes .../test_mathtext/mathtext_dejavuserif_18.png | Bin 7368 -> 3040 bytes .../test_mathtext/mathtext_dejavuserif_18.svg | 262 +- .../test_mathtext/mathtext_dejavuserif_19.pdf | Bin 7388 -> 6028 bytes .../test_mathtext/mathtext_dejavuserif_19.png | Bin 1954 -> 864 bytes .../test_mathtext/mathtext_dejavuserif_19.svg | 446 +- .../test_mathtext/mathtext_dejavuserif_20.pdf | Bin 10040 -> 9978 bytes .../test_mathtext/mathtext_dejavuserif_20.png | Bin 4462 -> 1852 bytes .../test_mathtext/mathtext_dejavuserif_20.svg | 769 +- .../test_mathtext/mathtext_dejavuserif_21.pdf | Bin 13587 -> 14003 bytes .../test_mathtext/mathtext_dejavuserif_21.png | Bin 4769 -> 1885 bytes .../test_mathtext/mathtext_dejavuserif_21.svg | 112 +- .../test_mathtext/mathtext_dejavuserif_23.pdf | Bin 8584 -> 8487 bytes .../test_mathtext/mathtext_dejavuserif_23.png | Bin 2853 -> 1466 bytes .../test_mathtext/mathtext_dejavuserif_23.svg | 68 +- .../test_mathtext/mathtext_dejavuserif_24.pdf | Bin 5608 -> 4065 bytes .../test_mathtext/mathtext_dejavuserif_24.png | Bin 1083 -> 586 bytes .../test_mathtext/mathtext_dejavuserif_24.svg | 153 +- .../test_mathtext/mathtext_dejavuserif_25.pdf | Bin 6026 -> 5517 bytes .../test_mathtext/mathtext_dejavuserif_25.png | Bin 1263 -> 613 bytes .../test_mathtext/mathtext_dejavuserif_25.svg | 209 +- .../test_mathtext/mathtext_dejavuserif_26.pdf | Bin 10855 -> 9435 bytes .../test_mathtext/mathtext_dejavuserif_26.png | Bin 2671 -> 1262 bytes .../test_mathtext/mathtext_dejavuserif_26.svg | 505 +- .../test_mathtext/mathtext_dejavuserif_27.png | Bin 2425 -> 1278 bytes .../test_mathtext/mathtext_dejavuserif_27.svg | 441 +- .../test_mathtext/mathtext_dejavuserif_28.pdf | Bin 7408 -> 6844 bytes .../test_mathtext/mathtext_dejavuserif_28.png | Bin 2130 -> 879 bytes .../test_mathtext/mathtext_dejavuserif_28.svg | 409 +- .../test_mathtext/mathtext_dejavuserif_29.pdf | Bin 7693 -> 7223 bytes .../test_mathtext/mathtext_dejavuserif_29.png | Bin 2229 -> 955 bytes .../test_mathtext/mathtext_dejavuserif_29.svg | 506 +- .../test_mathtext/mathtext_dejavuserif_31.pdf | Bin 8509 -> 8453 bytes .../test_mathtext/mathtext_dejavuserif_31.png | Bin 2277 -> 1128 bytes .../test_mathtext/mathtext_dejavuserif_31.svg | 335 +- .../test_mathtext/mathtext_dejavuserif_32.pdf | Bin 6076 -> 4638 bytes .../test_mathtext/mathtext_dejavuserif_32.png | Bin 1313 -> 769 bytes .../test_mathtext/mathtext_dejavuserif_32.svg | 255 +- .../test_mathtext/mathtext_dejavuserif_33.pdf | Bin 8616 -> 6457 bytes .../test_mathtext/mathtext_dejavuserif_33.png | Bin 2179 -> 901 bytes .../test_mathtext/mathtext_dejavuserif_33.svg | 381 +- .../test_mathtext/mathtext_dejavuserif_35.pdf | Bin 6222 -> 5727 bytes .../test_mathtext/mathtext_dejavuserif_35.png | Bin 1613 -> 736 bytes .../test_mathtext/mathtext_dejavuserif_35.svg | 243 +- .../test_mathtext/mathtext_dejavuserif_36.pdf | Bin 3480 -> 2685 bytes .../test_mathtext/mathtext_dejavuserif_36.png | Bin 1030 -> 557 bytes .../test_mathtext/mathtext_dejavuserif_36.svg | 159 +- .../test_mathtext/mathtext_dejavuserif_37.pdf | Bin 17722 -> 15758 bytes .../test_mathtext/mathtext_dejavuserif_37.png | Bin 7570 -> 3259 bytes .../test_mathtext/mathtext_dejavuserif_37.svg | 1120 +- .../test_mathtext/mathtext_dejavuserif_38.pdf | Bin 14339 -> 11761 bytes .../test_mathtext/mathtext_dejavuserif_38.png | Bin 3576 -> 1626 bytes .../test_mathtext/mathtext_dejavuserif_38.svg | 654 +- .../test_mathtext/mathtext_dejavuserif_39.pdf | Bin 7721 -> 6111 bytes .../test_mathtext/mathtext_dejavuserif_39.png | Bin 2681 -> 1116 bytes .../test_mathtext/mathtext_dejavuserif_39.svg | 417 +- .../test_mathtext/mathtext_dejavuserif_40.pdf | Bin 6870 -> 5574 bytes .../test_mathtext/mathtext_dejavuserif_40.png | Bin 3373 -> 1497 bytes .../test_mathtext/mathtext_dejavuserif_40.svg | 624 +- .../test_mathtext/mathtext_dejavuserif_41.pdf | Bin 12354 -> 10281 bytes .../test_mathtext/mathtext_dejavuserif_41.png | Bin 6040 -> 2442 bytes .../test_mathtext/mathtext_dejavuserif_41.svg | 1242 +- .../test_mathtext/mathtext_dejavuserif_42.png | Bin 1325 -> 713 bytes .../test_mathtext/mathtext_dejavuserif_42.svg | 166 +- .../test_mathtext/mathtext_dejavuserif_43.png | Bin 1285 -> 641 bytes .../test_mathtext/mathtext_dejavuserif_43.svg | 196 +- .../test_mathtext/mathtext_dejavuserif_44.pdf | Bin 6195 -> 4846 bytes .../test_mathtext/mathtext_dejavuserif_44.png | Bin 1556 -> 742 bytes .../test_mathtext/mathtext_dejavuserif_44.svg | 275 +- .../test_mathtext/mathtext_dejavuserif_45.pdf | Bin 6203 -> 4844 bytes .../test_mathtext/mathtext_dejavuserif_45.png | Bin 1596 -> 766 bytes .../test_mathtext/mathtext_dejavuserif_45.svg | 275 +- .../test_mathtext/mathtext_dejavuserif_46.pdf | Bin 5915 -> 4467 bytes .../test_mathtext/mathtext_dejavuserif_46.png | Bin 1265 -> 622 bytes .../test_mathtext/mathtext_dejavuserif_46.svg | 213 +- .../test_mathtext/mathtext_dejavuserif_47.pdf | Bin 7049 -> 5616 bytes .../test_mathtext/mathtext_dejavuserif_47.png | Bin 2268 -> 1023 bytes .../test_mathtext/mathtext_dejavuserif_47.svg | 399 +- .../test_mathtext/mathtext_dejavuserif_48.pdf | Bin 7049 -> 5457 bytes .../test_mathtext/mathtext_dejavuserif_48.png | Bin 2268 -> 1141 bytes .../test_mathtext/mathtext_dejavuserif_48.svg | 401 +- .../test_mathtext/mathtext_dejavuserif_49.pdf | Bin 7928 -> 5849 bytes .../test_mathtext/mathtext_dejavuserif_49.png | Bin 1725 -> 786 bytes .../test_mathtext/mathtext_dejavuserif_49.svg | 231 +- .../test_mathtext/mathtext_dejavuserif_50.pdf | Bin 8812 -> 7639 bytes .../test_mathtext/mathtext_dejavuserif_50.png | Bin 3054 -> 1389 bytes .../test_mathtext/mathtext_dejavuserif_50.svg | 356 +- .../test_mathtext/mathtext_dejavuserif_51.pdf | Bin 5516 -> 4057 bytes .../test_mathtext/mathtext_dejavuserif_51.png | Bin 1191 -> 607 bytes .../test_mathtext/mathtext_dejavuserif_51.svg | 164 +- .../test_mathtext/mathtext_dejavuserif_52.pdf | Bin 10552 -> 8282 bytes .../test_mathtext/mathtext_dejavuserif_52.png | Bin 3730 -> 1978 bytes .../test_mathtext/mathtext_dejavuserif_52.svg | 122 +- .../test_mathtext/mathtext_dejavuserif_53.pdf | Bin 11663 -> 7965 bytes .../test_mathtext/mathtext_dejavuserif_53.png | Bin 4356 -> 2443 bytes .../test_mathtext/mathtext_dejavuserif_53.svg | 317 +- .../test_mathtext/mathtext_dejavuserif_54.pdf | Bin 10891 -> 11051 bytes .../test_mathtext/mathtext_dejavuserif_54.png | Bin 4533 -> 1864 bytes .../test_mathtext/mathtext_dejavuserif_54.svg | 594 +- .../test_mathtext/mathtext_dejavuserif_55.pdf | Bin 5219 -> 3738 bytes .../test_mathtext/mathtext_dejavuserif_55.png | Bin 1186 -> 610 bytes .../test_mathtext/mathtext_dejavuserif_55.svg | 121 +- .../test_mathtext/mathtext_dejavuserif_56.pdf | Bin 8294 -> 6394 bytes .../test_mathtext/mathtext_dejavuserif_56.png | Bin 1664 -> 787 bytes .../test_mathtext/mathtext_dejavuserif_56.svg | 312 +- .../test_mathtext/mathtext_dejavuserif_57.pdf | Bin 8112 -> 5973 bytes .../test_mathtext/mathtext_dejavuserif_57.png | Bin 2016 -> 1135 bytes .../test_mathtext/mathtext_dejavuserif_57.svg | 308 +- .../test_mathtext/mathtext_dejavuserif_58.pdf | Bin 5524 -> 4067 bytes .../test_mathtext/mathtext_dejavuserif_58.png | Bin 1097 -> 598 bytes .../test_mathtext/mathtext_dejavuserif_58.svg | 164 +- .../test_mathtext/mathtext_dejavuserif_59.pdf | Bin 5523 -> 4065 bytes .../test_mathtext/mathtext_dejavuserif_59.png | Bin 1094 -> 589 bytes .../test_mathtext/mathtext_dejavuserif_59.svg | 164 +- .../test_mathtext/mathtext_dejavuserif_60.pdf | Bin 7444 -> 6960 bytes .../test_mathtext/mathtext_dejavuserif_60.png | Bin 2245 -> 1013 bytes .../test_mathtext/mathtext_dejavuserif_60.svg | 44 +- .../test_mathtext/mathtext_dejavuserif_61.pdf | Bin 5481 -> 4793 bytes .../test_mathtext/mathtext_dejavuserif_61.png | Bin 1683 -> 735 bytes .../test_mathtext/mathtext_dejavuserif_61.svg | 393 +- .../test_mathtext/mathtext_dejavuserif_62.pdf | Bin 7355 -> 5209 bytes .../test_mathtext/mathtext_dejavuserif_62.png | Bin 1207 -> 637 bytes .../test_mathtext/mathtext_dejavuserif_62.svg | 176 +- .../test_mathtext/mathtext_dejavuserif_63.pdf | Bin 6122 -> 5546 bytes .../test_mathtext/mathtext_dejavuserif_63.png | Bin 1549 -> 1024 bytes .../test_mathtext/mathtext_dejavuserif_63.svg | 184 +- .../test_mathtext/mathtext_dejavuserif_64.png | Bin 1981 -> 882 bytes .../test_mathtext/mathtext_dejavuserif_64.svg | 264 +- .../test_mathtext/mathtext_dejavuserif_65.png | Bin 1445 -> 696 bytes .../test_mathtext/mathtext_dejavuserif_65.svg | 215 +- .../test_mathtext/mathtext_dejavuserif_68.pdf | Bin 5959 -> 5429 bytes .../test_mathtext/mathtext_dejavuserif_68.png | Bin 2134 -> 1739 bytes .../test_mathtext/mathtext_dejavuserif_68.svg | 346 +- .../test_mathtext/mathtext_dejavuserif_69.pdf | Bin 5574 -> 4704 bytes .../test_mathtext/mathtext_dejavuserif_69.png | Bin 1387 -> 664 bytes .../test_mathtext/mathtext_dejavuserif_69.svg | 46 +- .../test_mathtext/mathtext_dejavuserif_70.png | Bin 1318 -> 2136 bytes .../test_mathtext/mathtext_dejavuserif_70.svg | 106 +- .../test_mathtext/mathtext_dejavuserif_71.pdf | Bin 8137 -> 5824 bytes .../test_mathtext/mathtext_dejavuserif_71.png | Bin 1576 -> 712 bytes .../test_mathtext/mathtext_dejavuserif_71.svg | 231 +- .../test_mathtext/mathtext_dejavuserif_72.pdf | Bin 8086 -> 5937 bytes .../test_mathtext/mathtext_dejavuserif_72.png | Bin 1016 -> 590 bytes .../test_mathtext/mathtext_dejavuserif_72.svg | 249 +- .../test_mathtext/mathtext_dejavuserif_73.pdf | Bin 9740 -> 9471 bytes .../test_mathtext/mathtext_dejavuserif_73.png | Bin 4283 -> 2409 bytes .../test_mathtext/mathtext_dejavuserif_73.svg | 786 +- .../test_mathtext/mathtext_dejavuserif_74.pdf | Bin 9740 -> 9471 bytes .../test_mathtext/mathtext_dejavuserif_74.png | Bin 4283 -> 2409 bytes .../test_mathtext/mathtext_dejavuserif_74.svg | 786 +- .../test_mathtext/mathtext_dejavuserif_75.pdf | Bin 8308 -> 6071 bytes .../test_mathtext/mathtext_dejavuserif_75.png | Bin 3077 -> 2648 bytes .../test_mathtext/mathtext_dejavuserif_75.svg | 345 +- .../test_mathtext/mathtext_dejavuserif_76.png | Bin 2382 -> 1017 bytes .../test_mathtext/mathtext_dejavuserif_76.svg | 455 +- .../test_mathtext/mathtext_dejavuserif_78.pdf | Bin 7106 -> 6677 bytes .../test_mathtext/mathtext_dejavuserif_78.png | Bin 2407 -> 1488 bytes .../test_mathtext/mathtext_dejavuserif_78.svg | 361 +- .../test_mathtext/mathtext_dejavuserif_79.pdf | Bin 6351 -> 5813 bytes .../test_mathtext/mathtext_dejavuserif_79.png | Bin 1655 -> 788 bytes .../test_mathtext/mathtext_dejavuserif_79.svg | 281 +- .../test_mathtext/mathtext_dejavuserif_80.pdf | Bin 9794 -> 9670 bytes .../test_mathtext/mathtext_dejavuserif_80.png | Bin 4289 -> 2580 bytes .../test_mathtext/mathtext_dejavuserif_80.svg | 774 +- .../test_mathtext/mathtext_dejavuserif_81.pdf | Bin 6209 -> 4794 bytes .../test_mathtext/mathtext_dejavuserif_81.png | Bin 1860 -> 799 bytes .../test_mathtext/mathtext_dejavuserif_81.svg | 252 +- .../test_mathtext/mathtext_dejavuserif_82.pdf | Bin 6130 -> 4876 bytes .../test_mathtext/mathtext_dejavuserif_82.png | Bin 1917 -> 1103 bytes .../test_mathtext/mathtext_dejavuserif_82.svg | 265 +- .../test_mathtext/mathtext_dejavuserif_83.pdf | Bin 6140 -> 5679 bytes .../test_mathtext/mathtext_dejavuserif_83.png | Bin 1665 -> 743 bytes .../test_mathtext/mathtext_dejavuserif_83.svg | 28 +- .../test_mathtext/mathtext_stix_00.pdf | Bin 6969 -> 6473 bytes .../test_mathtext/mathtext_stix_00.png | Bin 1597 -> 870 bytes .../test_mathtext/mathtext_stix_00.svg | 341 +- .../test_mathtext/mathtext_stix_01.png | Bin 1075 -> 551 bytes .../test_mathtext/mathtext_stix_01.svg | 240 +- .../test_mathtext/mathtext_stix_02.pdf | Bin 8375 -> 6238 bytes .../test_mathtext/mathtext_stix_02.png | Bin 1799 -> 1106 bytes .../test_mathtext/mathtext_stix_02.svg | 281 +- .../test_mathtext/mathtext_stix_03.pdf | Bin 6545 -> 5170 bytes .../test_mathtext/mathtext_stix_03.png | Bin 1220 -> 726 bytes .../test_mathtext/mathtext_stix_03.svg | 315 +- .../test_mathtext/mathtext_stix_04.png | Bin 932 -> 508 bytes .../test_mathtext/mathtext_stix_04.svg | 197 +- .../test_mathtext/mathtext_stix_05.pdf | Bin 7507 -> 6175 bytes .../test_mathtext/mathtext_stix_05.png | Bin 2183 -> 1421 bytes .../test_mathtext/mathtext_stix_05.svg | 82 +- .../test_mathtext/mathtext_stix_06.pdf | Bin 8478 -> 7046 bytes .../test_mathtext/mathtext_stix_06.png | Bin 2546 -> 1427 bytes .../test_mathtext/mathtext_stix_06.svg | 619 +- .../test_mathtext/mathtext_stix_07.pdf | Bin 6623 -> 4972 bytes .../test_mathtext/mathtext_stix_07.png | Bin 1493 -> 930 bytes .../test_mathtext/mathtext_stix_07.svg | 281 +- .../test_mathtext/mathtext_stix_08.pdf | Bin 10490 -> 8582 bytes .../test_mathtext/mathtext_stix_08.png | Bin 1670 -> 750 bytes .../test_mathtext/mathtext_stix_08.svg | 426 +- .../test_mathtext/mathtext_stix_09.pdf | Bin 4077 -> 3244 bytes .../test_mathtext/mathtext_stix_09.png | Bin 1065 -> 886 bytes .../test_mathtext/mathtext_stix_09.svg | 209 +- .../test_mathtext/mathtext_stix_10.png | Bin 2029 -> 874 bytes .../test_mathtext/mathtext_stix_10.svg | 498 +- .../test_mathtext/mathtext_stix_11.pdf | Bin 9517 -> 8636 bytes .../test_mathtext/mathtext_stix_11.png | Bin 1904 -> 822 bytes .../test_mathtext/mathtext_stix_11.svg | 406 +- .../test_mathtext/mathtext_stix_12.png | Bin 1118 -> 591 bytes .../test_mathtext/mathtext_stix_12.svg | 174 +- .../test_mathtext/mathtext_stix_13.png | Bin 1598 -> 735 bytes .../test_mathtext/mathtext_stix_13.svg | 368 +- .../test_mathtext/mathtext_stix_14.pdf | Bin 5531 -> 4073 bytes .../test_mathtext/mathtext_stix_14.png | Bin 875 -> 488 bytes .../test_mathtext/mathtext_stix_14.svg | 171 +- .../test_mathtext/mathtext_stix_15.pdf | Bin 5529 -> 4089 bytes .../test_mathtext/mathtext_stix_15.png | Bin 892 -> 493 bytes .../test_mathtext/mathtext_stix_15.svg | 171 +- .../test_mathtext/mathtext_stix_16.pdf | Bin 6043 -> 4597 bytes .../test_mathtext/mathtext_stix_16.png | Bin 1082 -> 539 bytes .../test_mathtext/mathtext_stix_16.svg | 244 +- .../test_mathtext/mathtext_stix_17.pdf | Bin 6043 -> 4597 bytes .../test_mathtext/mathtext_stix_17.png | Bin 1082 -> 539 bytes .../test_mathtext/mathtext_stix_17.svg | 244 +- .../test_mathtext/mathtext_stix_18.pdf | Bin 19237 -> 18301 bytes .../test_mathtext/mathtext_stix_18.png | Bin 6921 -> 2735 bytes .../test_mathtext/mathtext_stix_18.svg | 234 +- .../test_mathtext/mathtext_stix_19.pdf | Bin 7990 -> 6605 bytes .../test_mathtext/mathtext_stix_19.png | Bin 1795 -> 781 bytes .../test_mathtext/mathtext_stix_19.svg | 524 +- .../test_mathtext/mathtext_stix_20.pdf | Bin 11247 -> 11010 bytes .../test_mathtext/mathtext_stix_20.png | Bin 3943 -> 1556 bytes .../test_mathtext/mathtext_stix_20.svg | 945 +- .../test_mathtext/mathtext_stix_21.pdf | Bin 14370 -> 14751 bytes .../test_mathtext/mathtext_stix_21.png | Bin 4468 -> 1661 bytes .../test_mathtext/mathtext_stix_21.svg | 112 +- .../test_mathtext/mathtext_stix_23.pdf | Bin 8672 -> 8572 bytes .../test_mathtext/mathtext_stix_23.png | Bin 2826 -> 1515 bytes .../test_mathtext/mathtext_stix_23.svg | 68 +- .../test_mathtext/mathtext_stix_24.pdf | Bin 5743 -> 4236 bytes .../test_mathtext/mathtext_stix_24.png | Bin 1068 -> 555 bytes .../test_mathtext/mathtext_stix_24.svg | 173 +- .../test_mathtext/mathtext_stix_25.pdf | Bin 6246 -> 5770 bytes .../test_mathtext/mathtext_stix_25.png | Bin 1273 -> 617 bytes .../test_mathtext/mathtext_stix_25.svg | 237 +- .../test_mathtext/mathtext_stix_26.pdf | Bin 9382 -> 9723 bytes .../test_mathtext/mathtext_stix_26.png | Bin 2393 -> 984 bytes .../test_mathtext/mathtext_stix_26.svg | 94 +- .../test_mathtext/mathtext_stix_27.pdf | Bin 8223 -> 7169 bytes .../test_mathtext/mathtext_stix_27.png | Bin 2197 -> 1058 bytes .../test_mathtext/mathtext_stix_27.svg | 539 +- .../test_mathtext/mathtext_stix_28.pdf | Bin 8113 -> 7533 bytes .../test_mathtext/mathtext_stix_28.png | Bin 1799 -> 772 bytes .../test_mathtext/mathtext_stix_28.svg | 509 +- .../test_mathtext/mathtext_stix_29.pdf | Bin 8703 -> 8181 bytes .../test_mathtext/mathtext_stix_29.png | Bin 1987 -> 878 bytes .../test_mathtext/mathtext_stix_29.svg | 650 +- .../test_mathtext/mathtext_stix_31.pdf | Bin 7628 -> 7498 bytes .../test_mathtext/mathtext_stix_31.png | Bin 1993 -> 1010 bytes .../test_mathtext/mathtext_stix_31.svg | 413 +- .../test_mathtext/mathtext_stix_32.pdf | Bin 6633 -> 5197 bytes .../test_mathtext/mathtext_stix_32.png | Bin 1235 -> 648 bytes .../test_mathtext/mathtext_stix_32.svg | 337 +- .../test_mathtext/mathtext_stix_33.pdf | Bin 8975 -> 6804 bytes .../test_mathtext/mathtext_stix_33.png | Bin 1984 -> 838 bytes .../test_mathtext/mathtext_stix_33.svg | 413 +- .../test_mathtext/mathtext_stix_35.pdf | Bin 6616 -> 6124 bytes .../test_mathtext/mathtext_stix_35.png | Bin 1665 -> 747 bytes .../test_mathtext/mathtext_stix_35.svg | 301 +- .../test_mathtext/mathtext_stix_36.pdf | Bin 3784 -> 3024 bytes .../test_mathtext/mathtext_stix_36.png | Bin 985 -> 517 bytes .../test_mathtext/mathtext_stix_36.svg | 199 +- .../test_mathtext/mathtext_stix_37.pdf | Bin 15573 -> 14892 bytes .../test_mathtext/mathtext_stix_37.png | Bin 6602 -> 2509 bytes .../test_mathtext/mathtext_stix_37.svg | 1266 +- .../test_mathtext/mathtext_stix_38.pdf | Bin 13431 -> 12538 bytes .../test_mathtext/mathtext_stix_38.png | Bin 3449 -> 1381 bytes .../test_mathtext/mathtext_stix_38.svg | 756 +- .../test_mathtext/mathtext_stix_39.pdf | Bin 8060 -> 6454 bytes .../test_mathtext/mathtext_stix_39.png | Bin 2416 -> 900 bytes .../test_mathtext/mathtext_stix_39.svg | 479 +- .../test_mathtext/mathtext_stix_40.pdf | Bin 7991 -> 6598 bytes .../test_mathtext/mathtext_stix_40.png | Bin 3519 -> 1419 bytes .../test_mathtext/mathtext_stix_40.svg | 745 +- .../test_mathtext/mathtext_stix_41.pdf | Bin 14395 -> 12372 bytes .../test_mathtext/mathtext_stix_41.png | Bin 5368 -> 1939 bytes .../test_mathtext/mathtext_stix_41.svg | 1486 +- .../test_mathtext/mathtext_stix_42.pdf | Bin 6043 -> 4592 bytes .../test_mathtext/mathtext_stix_42.png | Bin 1147 -> 607 bytes .../test_mathtext/mathtext_stix_42.svg | 246 +- .../test_mathtext/mathtext_stix_43.pdf | Bin 5899 -> 4430 bytes .../test_mathtext/mathtext_stix_43.png | Bin 1167 -> 585 bytes .../test_mathtext/mathtext_stix_43.svg | 214 +- .../test_mathtext/mathtext_stix_44.pdf | Bin 6964 -> 5597 bytes .../test_mathtext/mathtext_stix_44.png | Bin 1372 -> 672 bytes .../test_mathtext/mathtext_stix_44.svg | 385 +- .../test_mathtext/mathtext_stix_45.pdf | Bin 6987 -> 5610 bytes .../test_mathtext/mathtext_stix_45.png | Bin 1498 -> 696 bytes .../test_mathtext/mathtext_stix_45.svg | 385 +- .../test_mathtext/mathtext_stix_46.pdf | Bin 6033 -> 4643 bytes .../test_mathtext/mathtext_stix_46.png | Bin 1107 -> 574 bytes .../test_mathtext/mathtext_stix_46.svg | 231 +- .../test_mathtext/mathtext_stix_47.pdf | Bin 7262 -> 5829 bytes .../test_mathtext/mathtext_stix_47.png | Bin 2119 -> 862 bytes .../test_mathtext/mathtext_stix_47.svg | 415 +- .../test_mathtext/mathtext_stix_48.pdf | Bin 7262 -> 5658 bytes .../test_mathtext/mathtext_stix_48.png | Bin 2119 -> 1102 bytes .../test_mathtext/mathtext_stix_48.svg | 417 +- .../test_mathtext/mathtext_stix_49.pdf | Bin 8228 -> 6179 bytes .../test_mathtext/mathtext_stix_49.png | Bin 1485 -> 705 bytes .../test_mathtext/mathtext_stix_49.svg | 273 +- .../test_mathtext/mathtext_stix_50.pdf | Bin 9485 -> 8315 bytes .../test_mathtext/mathtext_stix_50.png | Bin 2540 -> 1169 bytes .../test_mathtext/mathtext_stix_50.svg | 458 +- .../test_mathtext/mathtext_stix_51.pdf | Bin 6044 -> 4611 bytes .../test_mathtext/mathtext_stix_51.png | Bin 1028 -> 529 bytes .../test_mathtext/mathtext_stix_51.svg | 244 +- .../test_mathtext/mathtext_stix_52.pdf | Bin 9306 -> 8947 bytes .../test_mathtext/mathtext_stix_52.png | Bin 3248 -> 1621 bytes .../test_mathtext/mathtext_stix_52.svg | 110 +- .../test_mathtext/mathtext_stix_53.pdf | Bin 12379 -> 9635 bytes .../test_mathtext/mathtext_stix_53.png | Bin 4727 -> 2533 bytes .../test_mathtext/mathtext_stix_53.svg | 410 +- .../test_mathtext/mathtext_stix_54.pdf | Bin 11535 -> 11701 bytes .../test_mathtext/mathtext_stix_54.png | Bin 3993 -> 1711 bytes .../test_mathtext/mathtext_stix_54.svg | 696 +- .../test_mathtext/mathtext_stix_55.pdf | Bin 5562 -> 4131 bytes .../test_mathtext/mathtext_stix_55.png | Bin 1075 -> 574 bytes .../test_mathtext/mathtext_stix_55.svg | 175 +- .../test_mathtext/mathtext_stix_56.pdf | Bin 7145 -> 6940 bytes .../test_mathtext/mathtext_stix_56.png | Bin 1399 -> 663 bytes .../test_mathtext/mathtext_stix_56.svg | 396 +- .../test_mathtext/mathtext_stix_57.pdf | Bin 6901 -> 6471 bytes .../test_mathtext/mathtext_stix_57.png | Bin 1802 -> 971 bytes .../test_mathtext/mathtext_stix_57.svg | 370 +- .../test_mathtext/mathtext_stix_58.pdf | Bin 6048 -> 4619 bytes .../test_mathtext/mathtext_stix_58.png | Bin 977 -> 528 bytes .../test_mathtext/mathtext_stix_58.svg | 244 +- .../test_mathtext/mathtext_stix_59.pdf | Bin 6053 -> 4615 bytes .../test_mathtext/mathtext_stix_59.png | Bin 945 -> 521 bytes .../test_mathtext/mathtext_stix_59.svg | 244 +- .../test_mathtext/mathtext_stix_60.pdf | Bin 8056 -> 7572 bytes .../test_mathtext/mathtext_stix_60.png | Bin 1993 -> 840 bytes .../test_mathtext/mathtext_stix_60.svg | 510 +- .../test_mathtext/mathtext_stix_61.pdf | Bin 6214 -> 5530 bytes .../test_mathtext/mathtext_stix_61.png | Bin 1431 -> 664 bytes .../test_mathtext/mathtext_stix_61.svg | 521 +- .../test_mathtext/mathtext_stix_62.pdf | Bin 5941 -> 5418 bytes .../test_mathtext/mathtext_stix_62.png | Bin 989 -> 526 bytes .../test_mathtext/mathtext_stix_62.svg | 188 +- .../test_mathtext/mathtext_stix_63.pdf | Bin 6467 -> 5911 bytes .../test_mathtext/mathtext_stix_63.png | Bin 1430 -> 892 bytes .../test_mathtext/mathtext_stix_63.svg | 234 +- .../test_mathtext/mathtext_stix_64.pdf | Bin 6604 -> 5258 bytes .../test_mathtext/mathtext_stix_64.png | Bin 1776 -> 808 bytes .../test_mathtext/mathtext_stix_64.svg | 280 +- .../test_mathtext/mathtext_stix_65.pdf | Bin 4484 -> 3781 bytes .../test_mathtext/mathtext_stix_65.png | Bin 1320 -> 657 bytes .../test_mathtext/mathtext_stix_65.svg | 246 +- .../test_mathtext/mathtext_stix_68.pdf | Bin 6136 -> 5646 bytes .../test_mathtext/mathtext_stix_68.png | Bin 1961 -> 1474 bytes .../test_mathtext/mathtext_stix_68.svg | 366 +- .../test_mathtext/mathtext_stix_69.pdf | Bin 5744 -> 4889 bytes .../test_mathtext/mathtext_stix_69.png | Bin 1091 -> 618 bytes .../test_mathtext/mathtext_stix_69.svg | 32 +- .../test_mathtext/mathtext_stix_70.pdf | Bin 3381 -> 2556 bytes .../test_mathtext/mathtext_stix_70.png | Bin 1218 -> 1799 bytes .../test_mathtext/mathtext_stix_70.svg | 120 +- .../test_mathtext/mathtext_stix_71.pdf | Bin 6766 -> 4992 bytes .../test_mathtext/mathtext_stix_71.png | Bin 1588 -> 729 bytes .../test_mathtext/mathtext_stix_71.svg | 275 +- .../test_mathtext/mathtext_stix_72.pdf | Bin 6428 -> 5598 bytes .../test_mathtext/mathtext_stix_72.png | Bin 1019 -> 583 bytes .../test_mathtext/mathtext_stix_72.svg | 249 +- .../test_mathtext/mathtext_stix_73.pdf | Bin 11133 -> 10837 bytes .../test_mathtext/mathtext_stix_73.png | Bin 3843 -> 1895 bytes .../test_mathtext/mathtext_stix_73.svg | 994 +- .../test_mathtext/mathtext_stix_74.pdf | Bin 11133 -> 10837 bytes .../test_mathtext/mathtext_stix_74.png | Bin 3843 -> 1895 bytes .../test_mathtext/mathtext_stix_74.svg | 994 +- .../test_mathtext/mathtext_stix_75.pdf | Bin 7132 -> 5585 bytes .../test_mathtext/mathtext_stix_75.png | Bin 2481 -> 2239 bytes .../test_mathtext/mathtext_stix_75.svg | 431 +- .../test_mathtext/mathtext_stix_76.pdf | Bin 7672 -> 6279 bytes .../test_mathtext/mathtext_stix_76.png | Bin 2255 -> 958 bytes .../test_mathtext/mathtext_stix_76.svg | 451 +- .../test_mathtext/mathtext_stix_78.pdf | Bin 7146 -> 6703 bytes .../test_mathtext/mathtext_stix_78.png | Bin 2169 -> 1391 bytes .../test_mathtext/mathtext_stix_78.svg | 347 +- .../test_mathtext/mathtext_stix_79.pdf | Bin 6961 -> 6406 bytes .../test_mathtext/mathtext_stix_79.png | Bin 1501 -> 700 bytes .../test_mathtext/mathtext_stix_79.svg | 367 +- .../test_mathtext/mathtext_stix_80.pdf | Bin 9960 -> 8873 bytes .../test_mathtext/mathtext_stix_80.png | Bin 3964 -> 2295 bytes .../test_mathtext/mathtext_stix_80.svg | 774 +- .../test_mathtext/mathtext_stix_81.pdf | Bin 6514 -> 5110 bytes .../test_mathtext/mathtext_stix_81.png | Bin 1677 -> 702 bytes .../test_mathtext/mathtext_stix_81.svg | 292 +- .../test_mathtext/mathtext_stix_82.pdf | Bin 6427 -> 5165 bytes .../test_mathtext/mathtext_stix_82.png | Bin 1689 -> 980 bytes .../test_mathtext/mathtext_stix_82.svg | 308 +- .../test_mathtext/mathtext_stix_83.pdf | Bin 6299 -> 5857 bytes .../test_mathtext/mathtext_stix_83.png | Bin 1489 -> 673 bytes .../test_mathtext/mathtext_stix_83.svg | 28 +- .../test_mathtext/mathtext_stixsans_00.pdf | Bin 7061 -> 6291 bytes .../test_mathtext/mathtext_stixsans_00.png | Bin 1601 -> 905 bytes .../test_mathtext/mathtext_stixsans_00.svg | 311 +- .../test_mathtext/mathtext_stixsans_01.pdf | Bin 5636 -> 4011 bytes .../test_mathtext/mathtext_stixsans_01.png | Bin 1104 -> 564 bytes .../test_mathtext/mathtext_stixsans_01.svg | 140 +- .../test_mathtext/mathtext_stixsans_02.pdf | Bin 8333 -> 6207 bytes .../test_mathtext/mathtext_stixsans_02.png | Bin 1791 -> 1112 bytes .../test_mathtext/mathtext_stixsans_02.svg | 273 +- .../test_mathtext/mathtext_stixsans_03.pdf | Bin 6610 -> 5973 bytes .../test_mathtext/mathtext_stixsans_03.png | Bin 1239 -> 728 bytes .../test_mathtext/mathtext_stixsans_03.svg | 271 +- .../test_mathtext/mathtext_stixsans_04.pdf | Bin 3588 -> 2685 bytes .../test_mathtext/mathtext_stixsans_04.png | Bin 970 -> 526 bytes .../test_mathtext/mathtext_stixsans_04.svg | 97 +- .../test_mathtext/mathtext_stixsans_05.pdf | Bin 7198 -> 5651 bytes .../test_mathtext/mathtext_stixsans_05.png | Bin 2098 -> 1514 bytes .../test_mathtext/mathtext_stixsans_05.svg | 82 +- .../test_mathtext/mathtext_stixsans_06.pdf | Bin 8244 -> 7514 bytes .../test_mathtext/mathtext_stixsans_06.png | Bin 2560 -> 1409 bytes .../test_mathtext/mathtext_stixsans_06.svg | 509 +- .../test_mathtext/mathtext_stixsans_07.pdf | Bin 6215 -> 4446 bytes .../test_mathtext/mathtext_stixsans_07.png | Bin 1459 -> 855 bytes .../test_mathtext/mathtext_stixsans_07.svg | 181 +- .../test_mathtext/mathtext_stixsans_08.pdf | Bin 9534 -> 6530 bytes .../test_mathtext/mathtext_stixsans_08.png | Bin 1475 -> 751 bytes .../test_mathtext/mathtext_stixsans_08.svg | 219 +- .../test_mathtext/mathtext_stixsans_09.pdf | Bin 3687 -> 2717 bytes .../test_mathtext/mathtext_stixsans_09.png | Bin 1086 -> 887 bytes .../test_mathtext/mathtext_stixsans_09.svg | 109 +- .../test_mathtext/mathtext_stixsans_10.pdf | Bin 6170 -> 6175 bytes .../test_mathtext/mathtext_stixsans_10.png | Bin 2023 -> 883 bytes .../test_mathtext/mathtext_stixsans_10.svg | 408 +- .../test_mathtext/mathtext_stixsans_11.pdf | Bin 9475 -> 9324 bytes .../test_mathtext/mathtext_stixsans_11.png | Bin 2015 -> 826 bytes .../test_mathtext/mathtext_stixsans_11.svg | 354 +- .../test_mathtext/mathtext_stixsans_12.pdf | Bin 5475 -> 3944 bytes .../test_mathtext/mathtext_stixsans_12.png | Bin 1103 -> 602 bytes .../test_mathtext/mathtext_stixsans_12.svg | 108 +- .../test_mathtext/mathtext_stixsans_13.pdf | Bin 6556 -> 5975 bytes .../test_mathtext/mathtext_stixsans_13.png | Bin 1503 -> 714 bytes .../test_mathtext/mathtext_stixsans_13.svg | 228 +- .../test_mathtext/mathtext_stixsans_14.pdf | Bin 5324 -> 3741 bytes .../test_mathtext/mathtext_stixsans_14.png | Bin 882 -> 499 bytes .../test_mathtext/mathtext_stixsans_14.svg | 107 +- .../test_mathtext/mathtext_stixsans_15.pdf | Bin 5323 -> 3745 bytes .../test_mathtext/mathtext_stixsans_15.png | Bin 877 -> 483 bytes .../test_mathtext/mathtext_stixsans_15.svg | 107 +- .../test_mathtext/mathtext_stixsans_16.pdf | Bin 5712 -> 4082 bytes .../test_mathtext/mathtext_stixsans_16.png | Bin 1060 -> 555 bytes .../test_mathtext/mathtext_stixsans_16.svg | 146 +- .../test_mathtext/mathtext_stixsans_17.pdf | Bin 5712 -> 4082 bytes .../test_mathtext/mathtext_stixsans_17.png | Bin 1060 -> 555 bytes .../test_mathtext/mathtext_stixsans_17.svg | 146 +- .../test_mathtext/mathtext_stixsans_18.pdf | Bin 18458 -> 15404 bytes .../test_mathtext/mathtext_stixsans_18.png | Bin 6676 -> 2819 bytes .../test_mathtext/mathtext_stixsans_18.svg | 234 +- .../test_mathtext/mathtext_stixsans_19.pdf | Bin 7691 -> 6963 bytes .../test_mathtext/mathtext_stixsans_19.png | Bin 1737 -> 795 bytes .../test_mathtext/mathtext_stixsans_19.svg | 402 +- .../test_mathtext/mathtext_stixsans_20.pdf | Bin 12111 -> 10440 bytes .../test_mathtext/mathtext_stixsans_20.png | Bin 3754 -> 1571 bytes .../test_mathtext/mathtext_stixsans_20.svg | 675 +- .../test_mathtext/mathtext_stixsans_21.pdf | Bin 15700 -> 13526 bytes .../test_mathtext/mathtext_stixsans_21.png | Bin 4363 -> 1596 bytes .../test_mathtext/mathtext_stixsans_21.svg | 112 +- .../test_mathtext/mathtext_stixsans_23.pdf | Bin 8585 -> 7431 bytes .../test_mathtext/mathtext_stixsans_23.png | Bin 2808 -> 1447 bytes .../test_mathtext/mathtext_stixsans_23.svg | 68 +- .../test_mathtext/mathtext_stixsans_24.pdf | Bin 5508 -> 3878 bytes .../test_mathtext/mathtext_stixsans_24.png | Bin 1029 -> 552 bytes .../test_mathtext/mathtext_stixsans_24.svg | 109 +- .../test_mathtext/mathtext_stixsans_25.pdf | Bin 7712 -> 6347 bytes .../test_mathtext/mathtext_stixsans_25.png | Bin 1215 -> 591 bytes .../test_mathtext/mathtext_stixsans_25.svg | 159 +- .../test_mathtext/mathtext_stixsans_26.pdf | Bin 9505 -> 9536 bytes .../test_mathtext/mathtext_stixsans_26.png | Bin 2370 -> 1009 bytes .../test_mathtext/mathtext_stixsans_26.svg | 94 +- .../test_mathtext/mathtext_stixsans_27.pdf | Bin 7844 -> 7021 bytes .../test_mathtext/mathtext_stixsans_27.png | Bin 2135 -> 1079 bytes .../test_mathtext/mathtext_stixsans_27.svg | 371 +- .../test_mathtext/mathtext_stixsans_28.pdf | Bin 9264 -> 7785 bytes .../test_mathtext/mathtext_stixsans_28.png | Bin 1839 -> 811 bytes .../test_mathtext/mathtext_stixsans_28.svg | 78 +- .../test_mathtext/mathtext_stixsans_29.pdf | Bin 8089 -> 6160 bytes .../test_mathtext/mathtext_stixsans_29.png | Bin 1803 -> 839 bytes .../test_mathtext/mathtext_stixsans_29.svg | 428 +- .../test_mathtext/mathtext_stixsans_31.pdf | Bin 7099 -> 6361 bytes .../test_mathtext/mathtext_stixsans_31.png | Bin 1889 -> 980 bytes .../test_mathtext/mathtext_stixsans_31.svg | 269 +- .../test_mathtext/mathtext_stixsans_32.pdf | Bin 6322 -> 4621 bytes .../test_mathtext/mathtext_stixsans_32.png | Bin 1142 -> 660 bytes .../test_mathtext/mathtext_stixsans_32.svg | 233 +- .../test_mathtext/mathtext_stixsans_33.pdf | Bin 8771 -> 7279 bytes .../test_mathtext/mathtext_stixsans_33.png | Bin 1990 -> 863 bytes .../test_mathtext/mathtext_stixsans_33.svg | 301 +- .../test_mathtext/mathtext_stixsans_35.pdf | Bin 6329 -> 5639 bytes .../test_mathtext/mathtext_stixsans_35.png | Bin 1644 -> 749 bytes .../test_mathtext/mathtext_stixsans_35.svg | 217 +- .../test_mathtext/mathtext_stixsans_36.pdf | Bin 3514 -> 2628 bytes .../test_mathtext/mathtext_stixsans_36.png | Bin 976 -> 531 bytes .../test_mathtext/mathtext_stixsans_36.svg | 103 +- .../test_mathtext/mathtext_stixsans_37.pdf | Bin 16820 -> 13959 bytes .../test_mathtext/mathtext_stixsans_37.png | Bin 6674 -> 2649 bytes .../test_mathtext/mathtext_stixsans_37.svg | 234 +- .../test_mathtext/mathtext_stixsans_38.pdf | Bin 12888 -> 10668 bytes .../test_mathtext/mathtext_stixsans_38.png | Bin 3279 -> 1362 bytes .../test_mathtext/mathtext_stixsans_38.svg | 600 +- .../test_mathtext/mathtext_stixsans_39.pdf | Bin 7928 -> 5996 bytes .../test_mathtext/mathtext_stixsans_39.png | Bin 2237 -> 915 bytes .../test_mathtext/mathtext_stixsans_39.svg | 381 +- .../test_mathtext/mathtext_stixsans_40.pdf | Bin 6724 -> 5582 bytes .../test_mathtext/mathtext_stixsans_40.png | Bin 2926 -> 1247 bytes .../test_mathtext/mathtext_stixsans_40.svg | 80 +- .../test_mathtext/mathtext_stixsans_41.pdf | Bin 12760 -> 10897 bytes .../test_mathtext/mathtext_stixsans_41.png | Bin 5527 -> 2036 bytes .../test_mathtext/mathtext_stixsans_41.svg | 146 +- .../test_mathtext/mathtext_stixsans_42.pdf | Bin 5721 -> 4090 bytes .../test_mathtext/mathtext_stixsans_42.png | Bin 1163 -> 627 bytes .../test_mathtext/mathtext_stixsans_42.svg | 148 +- .../test_mathtext/mathtext_stixsans_43.pdf | Bin 5814 -> 4189 bytes .../test_mathtext/mathtext_stixsans_43.png | Bin 1064 -> 563 bytes .../test_mathtext/mathtext_stixsans_43.svg | 162 +- .../test_mathtext/mathtext_stixsans_44.pdf | Bin 6550 -> 5812 bytes .../test_mathtext/mathtext_stixsans_44.png | Bin 1363 -> 659 bytes .../test_mathtext/mathtext_stixsans_44.svg | 239 +- .../test_mathtext/mathtext_stixsans_45.pdf | Bin 6557 -> 5820 bytes .../test_mathtext/mathtext_stixsans_45.png | Bin 1481 -> 702 bytes .../test_mathtext/mathtext_stixsans_45.svg | 239 +- .../test_mathtext/mathtext_stixsans_46.pdf | Bin 6106 -> 5508 bytes .../test_mathtext/mathtext_stixsans_46.png | Bin 1092 -> 571 bytes .../test_mathtext/mathtext_stixsans_46.svg | 201 +- .../test_mathtext/mathtext_stixsans_47.pdf | Bin 7553 -> 6726 bytes .../test_mathtext/mathtext_stixsans_47.png | Bin 2037 -> 848 bytes .../test_mathtext/mathtext_stixsans_47.svg | 395 +- .../test_mathtext/mathtext_stixsans_48.pdf | Bin 7553 -> 6571 bytes .../test_mathtext/mathtext_stixsans_48.png | Bin 2037 -> 1039 bytes .../test_mathtext/mathtext_stixsans_48.svg | 397 +- .../test_mathtext/mathtext_stixsans_49.pdf | Bin 8118 -> 6855 bytes .../test_mathtext/mathtext_stixsans_49.png | Bin 1453 -> 704 bytes .../test_mathtext/mathtext_stixsans_49.svg | 209 +- .../test_mathtext/mathtext_stixsans_50.pdf | Bin 9064 -> 6599 bytes .../test_mathtext/mathtext_stixsans_50.png | Bin 2500 -> 1188 bytes .../test_mathtext/mathtext_stixsans_50.svg | 320 +- .../test_mathtext/mathtext_stixsans_51.pdf | Bin 5711 -> 4080 bytes .../test_mathtext/mathtext_stixsans_51.png | Bin 1064 -> 548 bytes .../test_mathtext/mathtext_stixsans_51.svg | 146 +- .../test_mathtext/mathtext_stixsans_52.pdf | Bin 8941 -> 7824 bytes .../test_mathtext/mathtext_stixsans_52.png | Bin 3125 -> 1624 bytes .../test_mathtext/mathtext_stixsans_52.svg | 110 +- .../test_mathtext/mathtext_stixsans_53.pdf | Bin 12163 -> 9223 bytes .../test_mathtext/mathtext_stixsans_53.png | Bin 4713 -> 2492 bytes .../test_mathtext/mathtext_stixsans_53.svg | 330 +- .../test_mathtext/mathtext_stixsans_54.pdf | Bin 12811 -> 10937 bytes .../test_mathtext/mathtext_stixsans_54.png | Bin 4106 -> 1739 bytes .../test_mathtext/mathtext_stixsans_54.svg | 560 +- .../test_mathtext/mathtext_stixsans_55.pdf | Bin 5358 -> 3780 bytes .../test_mathtext/mathtext_stixsans_55.png | Bin 1117 -> 576 bytes .../test_mathtext/mathtext_stixsans_55.svg | 111 +- .../test_mathtext/mathtext_stixsans_56.pdf | Bin 6915 -> 5148 bytes .../test_mathtext/mathtext_stixsans_56.png | Bin 1370 -> 672 bytes .../test_mathtext/mathtext_stixsans_56.svg | 306 +- .../test_mathtext/mathtext_stixsans_57.pdf | Bin 6632 -> 4892 bytes .../test_mathtext/mathtext_stixsans_57.png | Bin 1769 -> 967 bytes .../test_mathtext/mathtext_stixsans_57.svg | 256 +- .../test_mathtext/mathtext_stixsans_58.pdf | Bin 5720 -> 4088 bytes .../test_mathtext/mathtext_stixsans_58.png | Bin 993 -> 563 bytes .../test_mathtext/mathtext_stixsans_58.svg | 146 +- .../test_mathtext/mathtext_stixsans_59.pdf | Bin 5720 -> 4079 bytes .../test_mathtext/mathtext_stixsans_59.png | Bin 994 -> 546 bytes .../test_mathtext/mathtext_stixsans_59.svg | 146 +- .../test_mathtext/mathtext_stixsans_60.pdf | Bin 9664 -> 8057 bytes .../test_mathtext/mathtext_stixsans_60.png | Bin 2070 -> 869 bytes .../test_mathtext/mathtext_stixsans_60.svg | 406 +- .../test_mathtext/mathtext_stixsans_61.pdf | Bin 5598 -> 4410 bytes .../test_mathtext/mathtext_stixsans_61.png | Bin 1368 -> 666 bytes .../test_mathtext/mathtext_stixsans_61.svg | 313 +- .../test_mathtext/mathtext_stixsans_62.pdf | Bin 5850 -> 4208 bytes .../test_mathtext/mathtext_stixsans_62.png | Bin 1039 -> 539 bytes .../test_mathtext/mathtext_stixsans_62.svg | 154 +- .../test_mathtext/mathtext_stixsans_63.pdf | Bin 6345 -> 5699 bytes .../test_mathtext/mathtext_stixsans_63.png | Bin 1464 -> 883 bytes .../test_mathtext/mathtext_stixsans_63.svg | 200 +- .../test_mathtext/mathtext_stixsans_64.pdf | Bin 6682 -> 6148 bytes .../test_mathtext/mathtext_stixsans_64.png | Bin 1756 -> 809 bytes .../test_mathtext/mathtext_stixsans_64.svg | 250 +- .../test_mathtext/mathtext_stixsans_65.pdf | Bin 4484 -> 3781 bytes .../test_mathtext/mathtext_stixsans_65.png | Bin 1320 -> 657 bytes .../test_mathtext/mathtext_stixsans_65.svg | 246 +- .../test_mathtext/mathtext_stixsans_68.pdf | Bin 6189 -> 5507 bytes .../test_mathtext/mathtext_stixsans_68.png | Bin 1878 -> 1511 bytes .../test_mathtext/mathtext_stixsans_68.svg | 334 +- .../test_mathtext/mathtext_stixsans_69.pdf | Bin 5726 -> 5265 bytes .../test_mathtext/mathtext_stixsans_69.png | Bin 1259 -> 624 bytes .../test_mathtext/mathtext_stixsans_69.svg | 32 +- .../test_mathtext/mathtext_stixsans_70.pdf | Bin 3335 -> 2406 bytes .../test_mathtext/mathtext_stixsans_70.png | Bin 1229 -> 2041 bytes .../test_mathtext/mathtext_stixsans_70.svg | 82 +- .../test_mathtext/mathtext_stixsans_71.pdf | Bin 6765 -> 4992 bytes .../test_mathtext/mathtext_stixsans_71.png | Bin 1588 -> 729 bytes .../test_mathtext/mathtext_stixsans_71.svg | 275 +- .../test_mathtext/mathtext_stixsans_72.pdf | Bin 6428 -> 5598 bytes .../test_mathtext/mathtext_stixsans_72.png | Bin 1019 -> 583 bytes .../test_mathtext/mathtext_stixsans_72.svg | 249 +- .../test_mathtext/mathtext_stixsans_73.pdf | Bin 10069 -> 7758 bytes .../test_mathtext/mathtext_stixsans_73.png | Bin 3574 -> 1892 bytes .../test_mathtext/mathtext_stixsans_73.svg | 614 +- .../test_mathtext/mathtext_stixsans_74.pdf | Bin 10069 -> 7758 bytes .../test_mathtext/mathtext_stixsans_74.png | Bin 3574 -> 1892 bytes .../test_mathtext/mathtext_stixsans_74.svg | 614 +- .../test_mathtext/mathtext_stixsans_75.pdf | Bin 6781 -> 4893 bytes .../test_mathtext/mathtext_stixsans_75.png | Bin 2345 -> 2176 bytes .../test_mathtext/mathtext_stixsans_75.svg | 313 +- .../test_mathtext/mathtext_stixsans_76.pdf | Bin 7822 -> 6235 bytes .../test_mathtext/mathtext_stixsans_76.png | Bin 2256 -> 972 bytes .../test_mathtext/mathtext_stixsans_76.svg | 439 +- .../test_mathtext/mathtext_stixsans_78.pdf | Bin 7493 -> 6740 bytes .../test_mathtext/mathtext_stixsans_78.png | Bin 2205 -> 1436 bytes .../test_mathtext/mathtext_stixsans_78.svg | 359 +- .../test_mathtext/mathtext_stixsans_79.pdf | Bin 8435 -> 6003 bytes .../test_mathtext/mathtext_stixsans_79.png | Bin 1461 -> 700 bytes .../test_mathtext/mathtext_stixsans_79.svg | 285 +- .../test_mathtext/mathtext_stixsans_80.pdf | Bin 10630 -> 9800 bytes .../test_mathtext/mathtext_stixsans_80.png | Bin 3946 -> 2330 bytes .../test_mathtext/mathtext_stixsans_80.svg | 744 +- .../test_mathtext/mathtext_stixsans_81.pdf | Bin 6361 -> 4711 bytes .../test_mathtext/mathtext_stixsans_81.png | Bin 1641 -> 706 bytes .../test_mathtext/mathtext_stixsans_81.svg | 208 +- .../test_mathtext/mathtext_stixsans_82.pdf | Bin 6460 -> 5970 bytes .../test_mathtext/mathtext_stixsans_82.png | Bin 1731 -> 985 bytes .../test_mathtext/mathtext_stixsans_82.svg | 271 +- .../test_mathtext/mathtext_stixsans_83.pdf | Bin 6281 -> 5653 bytes .../test_mathtext/mathtext_stixsans_83.png | Bin 1449 -> 686 bytes .../test_mathtext/mathtext_stixsans_83.svg | 28 +- .../test_offsetbox/anchoredtext_align.png | Bin 6729 -> 4268 bytes .../test_offsetbox/paddedbox.png | Bin 6014 -> 3255 bytes .../baseline_images/test_patches/annulus.png | Bin 84457 -> 36541 bytes .../test_patches/clip_to_bbox.png | Bin 33548 -> 18469 bytes .../test_patches/units_rectangle.png | Bin 13497 -> 5122 bytes .../test_path/semi_log_with_zero.png | Bin 24929 -> 19055 bytes .../test_patheffects/collection.pdf | Bin 81253 -> 78915 bytes .../test_patheffects/collection.png | Bin 229210 -> 138344 bytes .../test_patheffects/collection.svg | 13384 +++++----- .../test_patheffects/patheffect1.pdf | Bin 8852 -> 3705 bytes .../test_patheffects/patheffect1.png | Bin 33152 -> 12450 bytes .../test_patheffects/patheffect1.svg | 756 +- .../test_patheffects/patheffect2.pdf | Bin 8485 -> 8238 bytes .../test_patheffects/patheffect2.png | Bin 16330 -> 13672 bytes .../test_patheffects/patheffect2.svg | 1150 +- .../test_patheffects/patheffect3.pdf | Bin 27738 -> 23853 bytes .../test_patheffects/patheffect3.png | Bin 81410 -> 47180 bytes .../test_patheffects/patheffect3.svg | 4376 ++- .../test_patheffects/spaces_and_newlines.png | Bin 15040 -> 8776 bytes .../test_patheffects/stroked_text.png | Bin 150781 -> 57220 bytes .../baseline_images/test_png/pngsuite.png | Bin 18026 -> 13875 bytes .../test_polar/polar_alignment.png | Bin 55019 -> 17036 bytes .../baseline_images/test_polar/polar_axes.png | Bin 71122 -> 44666 bytes .../test_polar/polar_coords.png | Bin 9323 -> 6970 bytes .../test_polar/polar_invertedylim.png | Bin 63099 -> 21501 bytes .../test_polar/polar_invertedylim_rorigin.png | Bin 73761 -> 25427 bytes .../baseline_images/test_polar/polar_log.png | Bin 41668 -> 27740 bytes .../test_polar/polar_negative_rmin.png | Bin 73626 -> 46709 bytes .../test_polar/polar_rlabel_position.png | Bin 48771 -> 16699 bytes .../baseline_images/test_polar/polar_rmin.png | Bin 70018 -> 44013 bytes .../test_polar/polar_rorigin.png | Bin 81225 -> 50334 bytes .../test_polar/polar_theta_position.png | Bin 90981 -> 55546 bytes .../test_polar/polar_theta_wedge.png | Bin 167601 -> 95309 bytes .../test_polar/polar_title_position.png | Bin 47252 -> 16846 bytes .../quiver_animated_test_image.png | Bin 32845 -> 10374 bytes .../test_quiver/quiver_key_pivot.png | Bin 59769 -> 15928 bytes .../quiver_with_key_test_image.png | Bin 39273 -> 10786 bytes .../clipping_with_nans.pdf | Bin 6636 -> 6581 bytes .../clipping_with_nans.png | Bin 16013 -> 10685 bytes .../clipping_with_nans.svg | 369 +- .../test_spines/spines_axes_positions.png | Bin 28892 -> 17963 bytes .../test_spines/spines_data_positions.png | Bin 13593 -> 4302 bytes .../test_subplots/subplots_offset_text.png | Bin 35299 -> 21654 bytes .../test_table/table_auto_column.png | Bin 46538 -> 14494 bytes .../test_table/table_labels.png | Bin 16098 -> 11144 bytes .../test_table/table_zorder.png | Bin 36289 -> 18668 bytes .../test_text/agg_text_clip.png | Bin 29843 -> 8287 bytes .../annotation_negative_ax_coords.png | Bin 24796 -> 8267 bytes .../annotation_negative_fig_coords.png | Bin 26134 -> 8341 bytes .../baseline_images/test_text/antialiased.png | Bin 3045 -> 1235 bytes .../baseline_images/test_text/axes_titles.png | Bin 14700 -> 5052 bytes .../test_text/basictext_wrap.png | Bin 215614 -> 47354 bytes .../baseline_images/test_text/complex.eps | 864 + .../baseline_images/test_text/complex.pdf | Bin 0 -> 14724 bytes .../baseline_images/test_text/complex.png | Bin 0 -> 6472 bytes .../baseline_images/test_text/complex.svg | 693 + .../baseline_images/test_text/features.eps | 777 + .../baseline_images/test_text/features.pdf | Bin 0 -> 10223 bytes .../baseline_images/test_text/features.png | Bin 0 -> 5796 bytes .../baseline_images/test_text/features.svg | 620 + .../test_text/font_scaling.pdf | Bin 382245 -> 32136 bytes .../baseline_images/test_text/font_styles.pdf | Bin 17067 -> 16306 bytes .../baseline_images/test_text/font_styles.png | Bin 15705 -> 4666 bytes .../baseline_images/test_text/font_styles.svg | 254 +- .../test_text/fonttext_wrap.png | Bin 186004 -> 46661 bytes .../baseline_images/test_text/language.eps | 657 + .../baseline_images/test_text/language.pdf | Bin 0 -> 9570 bytes .../baseline_images/test_text/language.png | Bin 0 -> 7863 bytes .../baseline_images/test_text/language.svg | 580 + .../test_text/large_subscript_title.png | Bin 11944 -> 5208 bytes .../baseline_images/test_text/multiline.pdf | Bin 9665 -> 8421 bytes .../baseline_images/test_text/multiline.png | Bin 16327 -> 6068 bytes .../baseline_images/test_text/multiline.svg | 366 +- .../baseline_images/test_text/multiline2.pdf | Bin 16879 -> 15120 bytes .../baseline_images/test_text/multiline2.png | Bin 47547 -> 34460 bytes .../baseline_images/test_text/multiline2.svg | 1102 +- .../test_text/rotation_anchor.png | Bin 15484 -> 14156 bytes .../test_text/text_alignment.pdf | Bin 14030 -> 12011 bytes .../test_text/text_alignment.png | Bin 35520 -> 21730 bytes .../test_text/text_alignment.svg | 502 +- .../test_text/text_bboxclip.pdf | Bin 10613 -> 10428 bytes .../test_text/text_bboxclip.png | Bin 13220 -> 8830 bytes .../test_text/text_bboxclip.svg | 1411 +- .../test_text/text_contains.png | Bin 30495 -> 17135 bytes .../baseline_images/test_text/titles.pdf | Bin 5357 -> 5043 bytes .../baseline_images/test_text/titles.png | Bin 7018 -> 2248 bytes .../baseline_images/test_text/titles.svg | 410 +- .../test_text/xtick_rotation_mode.png | Bin 43243 -> 13492 bytes .../test_text/ytick_rotation_mode.png | Bin 37406 -> 14515 bytes .../test_triangulation/tripcolor1.png | Bin 43755 -> 30063 bytes .../test_units/jpl_bar_units.png | Bin 20363 -> 13461 bytes .../test_units/jpl_barh_units.png | Bin 14626 -> 12225 bytes .../baseline_images/test_units/plot_pint.png | Bin 28590 -> 19127 bytes .../baseline_images/test_usetex/eqnarray.png | Bin 1322 -> 735 bytes .../baseline_images/test_usetex/rotation.png | Bin 41784 -> 43635 bytes .../baseline_images/test_usetex/rotation.svg | 834 +- .../test_usetex/test_usetex.pdf | Bin 125933 -> 39233 bytes .../test_usetex/test_usetex.png | Bin 13512 -> 13253 bytes .../test_widgets/check_radio_buttons.png | Bin 23386 -> 17294 bytes .../test_widgets/check_radio_grid_buttons.png | Bin 22050 -> 14356 bytes .../test_axes_grid1/anchored_artists.png | Bin 8380 -> 5027 bytes .../anchored_direction_arrows.png | Bin 10784 -> 6742 bytes .../anchored_direction_arrows_many_args.png | Bin 11039 -> 7062 bytes .../image_grid_each_left_label_mode_all.png | Bin 10424 -> 10963 bytes .../image_grid_single_bottom_label_mode_1.png | Bin 5210 -> 4070 bytes .../test_axes_grid1/inset_axes.png | Bin 9897 -> 7673 bytes .../test_axes_grid1/inset_locator.png | Bin 9553 -> 7380 bytes .../test_axes_grid1/inverted_zoomed_axes.png | Bin 25997 -> 17557 bytes .../twin_axes_empty_and_removed.png | Bin 37701 -> 16341 bytes .../test_axes_grid1/zoomed_axes.png | Bin 25893 -> 17454 bytes .../test_axis_artist/axis_artist.png | Bin 10151 -> 5456 bytes .../axis_artist_labelbase.png | Bin 10598 -> 8728 bytes .../axis_artist_ticklabels.png | Bin 5696 -> 3020 bytes .../test_axislines/Subplot.png | Bin 26919 -> 17944 bytes .../test_axislines/SubplotZero.png | Bin 28682 -> 18556 bytes .../test_axislines/subplotzero_ylabel.png | Bin 6872 -> 3100 bytes .../test_floating_axes/curvelinear3.png | Bin 52835 -> 31160 bytes .../test_floating_axes/curvelinear4.png | Bin 29374 -> 18265 bytes .../axis_direction.png | Bin 40536 -> 13401 bytes .../custom_transform.png | Bin 15118 -> 12740 bytes .../polar_box.png | Bin 64346 -> 36320 bytes .../baseline_images/test_axes3d/aspects.png | Bin 90753 -> 72957 bytes .../test_axes3d/aspects_adjust_box.png | Bin 81910 -> 65799 bytes .../test_axes3d/axes3d_cla.png | Bin 56647 -> 21888 bytes .../test_axes3d/axes3d_focal_length.png | Bin 64443 -> 25185 bytes .../test_axes3d/axes3d_labelpad.png | Bin 74765 -> 28395 bytes .../test_axes3d/axes3d_ortho.png | Bin 47677 -> 15761 bytes .../test_axes3d/axes3d_primary_views.png | Bin 10427 -> 4029 bytes .../test_axes3d/axes3d_rotated.png | Bin 20905 -> 9098 bytes .../test_axes3d/axis_positions.png | Bin 95870 -> 38880 bytes .../test_axes3d/errorbar3d.png | Bin 58282 -> 38744 bytes .../test_axes3d/minor_ticks.png | Bin 62299 -> 24206 bytes .../test_axes3d/proj3d_axes_cube.png | Bin 23182 -> 16293 bytes .../test_axes3d/proj3d_axes_cube_ortho.png | Bin 16210 -> 12865 bytes .../test_axes3d/scale3d_all_scales.png | Bin 98739 -> 78943 bytes .../test_axes3d/scale3d_artists_log.png | Bin 628220 -> 515139 bytes .../test_axes3d/scale3d_log_bases.png | Bin 177781 -> 145227 bytes .../test_axes3d/scale3d_symlog_params.png | Bin 53730 -> 48187 bytes .../baseline_images/test_axes3d/stem3d.png | Bin 236147 -> 163742 bytes .../surface3d_label_offset_tick_position.png | Bin 101663 -> 76097 bytes .../baseline_images/test_axes3d/text3d.png | Bin 75710 -> 43950 bytes .../test_axes3d/voxels-xyz.png | Bin 94388 -> 74072 bytes .../baseline_images/test_legend3d/fancy.png | Bin 58708 -> 39328 bytes .../test_legend3d/legend_bar.png | Bin 53492 -> 39530 bytes .../test_legend3d/legend_plot.png | Bin 46476 -> 30967 bytes 1826 files changed, 134744 insertions(+), 97875 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_cm_01.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_cm_02.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_cm_03.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_cm_04.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_cm_05.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_cm_06.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_dejavusans_01.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_dejavusans_02.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_dejavusans_03.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_dejavusans_04.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_dejavusans_05.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext0_dejavusans_06.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_text/complex.eps create mode 100644 lib/matplotlib/tests/baseline_images/test_text/complex.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_text/complex.png create mode 100644 lib/matplotlib/tests/baseline_images/test_text/complex.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_text/features.eps create mode 100644 lib/matplotlib/tests/baseline_images/test_text/features.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_text/features.png create mode 100644 lib/matplotlib/tests/baseline_images/test_text/features.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_text/language.eps create mode 100644 lib/matplotlib/tests/baseline_images/test_text/language.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_text/language.png create mode 100644 lib/matplotlib/tests/baseline_images/test_text/language.svg diff --git a/.appveyor.yml b/.appveyor.yml index 83bdfd08ce79..13705adc99f9 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -60,26 +60,6 @@ install: - micromamba env create -f environment.yml python=%PYTHON_VERSION% pywin32 - micromamba activate mpl-dev -before_test: - - git config --global user.name 'Matplotlib' - - git config --global user.email 'nobody@matplotlib.org' - - git fetch https://github.com/QuLogic/matplotlib.git text-overhaul-figures:text-overhaul-figures - - git merge --no-commit text-overhaul-figures || true - # If there are any conflicts in baseline images, then pick "ours", - # which should be the updated images in the PR. - - ps: | - $conflicts = git diff --name-only --diff-filter=U ` - lib/matplotlib/tests/baseline_images ` - lib/mpl_toolkits/*/tests/baseline_images - if ($conflicts) { - git checkout --ours -- $conflicts - git add -- $conflicts - } - git status - # If committing fails, there were conflicts other than the baseline images, - # which should not be allowed to happen, and should fail the build. - - git commit -m "Preload test images from branch text-overhaul-figures" - test_script: # Now build the thing.. - set LINK=/LIBPATH:%cd%\lib diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f13a018ab07b..a784787d140b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -102,25 +102,6 @@ jobs: fetch-depth: 0 persist-credentials: false - - name: Preload test images - run: | - git config --global user.name 'Matplotlib' - git config --global user.email 'nobody@matplotlib.org' - git fetch https://github.com/QuLogic/matplotlib.git text-overhaul-figures:text-overhaul-figures - git merge --no-commit text-overhaul-figures || true - # If there are any conflicts in baseline images, then pick "ours", - # which should be the updated images in the PR. - conflicts=$(git diff --name-only --diff-filter=U \ - lib/matplotlib/tests/baseline_images \ - lib/mpl_toolkits/*/tests/baseline_images) - if [ -n "${conflicts}" ]; then - git checkout --ours -- ${conflicts} - git add -- ${conflicts} - fi - # If committing fails, there were conflicts other than the baseline images, - # which should not be allowed to happen, and should fail the build. - git commit -m 'Preload test images from branch text-overhaul-figures' - - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml index 725daa918566..dd6f689ec0d9 100644 --- a/.github/workflows/wasm.yml +++ b/.github/workflows/wasm.yml @@ -44,25 +44,6 @@ jobs: fetch-depth: 0 persist-credentials: false - - name: Preload test images - run: | - git config --global user.name 'Matplotlib' - git config --global user.email 'nobody@matplotlib.org' - git fetch https://github.com/QuLogic/matplotlib.git text-overhaul-figures:text-overhaul-figures - git merge --no-commit text-overhaul-figures || true - # If there are any conflicts in baseline images, then pick "ours", - # which should be the updated images in the PR. - conflicts=$(git diff --name-only --diff-filter=U \ - lib/matplotlib/tests/baseline_images \ - lib/mpl_toolkits/*/tests/baseline_images) - if [ -n "${conflicts}" ]; then - git checkout --ours -- ${conflicts} - git add -- ${conflicts} - fi - # If committing fails, there were conflicts other than the baseline images, - # which should not be allowed to happen, and should fail the build. - git commit -m 'Preload test images from branch text-overhaul-figures' - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 name: Install Python with: diff --git a/azure-pipelines.yml b/azure-pipelines.yml index cad8192de001..829a1c7b9005 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -68,25 +68,6 @@ stages: architecture: 'x64' displayName: 'Use Python $(python.version)' - - bash: | - git config --global user.name 'Matplotlib' - git config --global user.email 'nobody@matplotlib.org' - git fetch https://github.com/QuLogic/matplotlib.git text-overhaul-figures:text-overhaul-figures - git merge --no-commit text-overhaul-figures || true - # If there are any conflicts in baseline images, then pick "ours", - # which should be the updated images in the PR. - conflicts=$(git diff --name-only --diff-filter=U \ - lib/matplotlib/tests/baseline_images \ - lib/mpl_toolkits/*/tests/baseline_images) - if [ -n "${conflicts}" ]; then - git checkout --ours -- ${conflicts} - git add -- ${conflicts} - fi - # If committing fails, there were conflicts other than the baseline images, - # which should not be allowed to happen, and should fail the build. - git commit -m 'Preload test images from branch text-overhaul-figures' - displayName: Preload test images - - bash: | choco install ninja displayName: 'Install dependencies' diff --git a/lib/matplotlib/tests/baseline_images/test_agg_filter/agg_filter_alpha.gif b/lib/matplotlib/tests/baseline_images/test_agg_filter/agg_filter_alpha.gif index 01a2d0bc288e1afcad3702514c9d8f52f6db46e9..a99e5c7456a31faef338c2104fc01c3015e44a56 100644 GIT binary patch delta 10570 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 B=ivYV literal 9724 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 OKwnY2oPWvG@Bacepsu3; diff --git a/lib/matplotlib/tests/baseline_images/test_arrow_patches/boxarrow_adjustment_test_image.png b/lib/matplotlib/tests/baseline_images/test_arrow_patches/boxarrow_adjustment_test_image.png index 02b8d39d6b98b5c48aa13ee331d5d4cb4c25da13..976c830edcbd91388a70047478231d14100fcb3d 100644 GIT binary patch literal 23390 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