Skip to main content

A (new) cairo backend for Matplotlib.

Project description

GitHub PyPI Fedora Rawhide

This is a new, essentially complete implementation of a cairo backend for Matplotlib. It can be used in combination with a Qt, GTK, Tk, wx, or macOS UI, or non-interactively (i.e., to save figure to various file formats).

Noteworthy points include:

  • Improved accuracy (e.g., with marker positioning, quad meshes, and text kerning; floating point surfaces are supported with cairo≥1.17.2).

  • Optional multithreaded drawing of markers and path collections.

  • Optional support for complex text layout (right-to-left languages, etc.) and OpenType font features (see examples/opentype_features.py) and variations (see examples/opentype_variations.py) (requires cairo≥1.16.0), and partial support for color fonts (e.g., emojis), using Raqm. Note that Raqm depends by default on Fribidi, which is licensed under the LGPLv2.1+.

  • Support for embedding URLs in PDF (but not SVG) output (requires cairo≥1.15.4).

  • Support for multi-page output both for PDF and PS (Matplotlib only supports multi-page PDF).

  • Support for custom blend modes (see examples/operators.py).

  • Improved font embedding in vector formats: fonts are typically subsetted and embedded in their native format (Matplotlib≥3.5 also provides improved font embedding).

Installation

mplcairo requires

  • Python≥3.7,

  • Matplotlib≥2.2 (declared as install_requires),

  • on Linux and macOS, pycairo≥1.16.0 [1] (declared as install_requires),

  • on Windows, cairo≥1.13.1 [2] (shipped with the wheel).

It is recommended to use cairo≥1.17.4.

Additionally, building mplcairo from source requires

  • pybind11≥2.6.0 [3] (declared as setup_requires),

  • pycairo≥1.16.0 (declared as setup_requires).

As usual, install using pip:

$ pip install mplcairo  # from PyPI
$ pip install git+https://github.com/matplotlib/mplcairo  # from Github

Note that wheels are not available for macOS<10.13, because the libc++ included with these versions is too old and vendoring of libc++ appears to be fragile.

mplcairo can use Raqm (≥0.7.0; ≥0.7.2 is recommended as it provides better emoji support, especially in the presence of ligatures) for complex text layout and handling of OpenType font features. Refer to the instructions on that project’s website for installation on Linux and macOS. On Windows, consider using Christoph Gohlke’s build (the directory containing libraqm.dll and libfribidi-0.dll need to be added to the DLL search path).

On Fedora, the package is available as python-mplcairo.

Building/packaging

This section is only relevant if you wish to build mplcairo yourself, or package it for redistribution. Otherwise, proceed to the Use section.

In all cases, once the dependencies described below are installed, mplcairo can be built and installed using any of the standard commands (pip wheel --no-deps ., pip install ., pip install -e . and python setup.py build_ext -i being the most relevant ones).

Unix

The following additional dependencies are required:

  • a C++ compiler with C++17 support, e.g. GCC≥7.2 or Clang≥5.0.

  • cairo and FreeType headers, and pkg-config information to locate them.

    If using conda, they can be installed using

    conda install -y -c conda-forge pycairo pkg-config

    as pycairo (also a dependency) depends on cairo, which depends on freetype. Note that cairo and pkg-config from the anaconda channel will not work.

    On Linux, they can also be installed with your distribution’s package manager (Arch: cairo, Debian/Ubuntu: libcairo2-dev, Fedora: cairo-devel).

Raqm (≥0.2) headers are also needed, but will be automatically downloaded if not found.

Linux

conda’s compilers (gxx_linux-64 on the anaconda channel) currently interact poorly with installing cairo and pkg-config from conda-forge, so you are on your own to install a recent compiler (e.g., using your distribution’s package manager). You may want to set the CC and CXX environment variables to point to your C++ compiler if it is nonstandard [4]. In that case, be careful to set them to e.g. g++-7 and not gcc-7, otherwise the compilation will succeed but the shared object will be mis-linked and fail to load.

The manylinux wheel is built using tools/build-manylinux-wheel.sh.

macOS

Clang≥5.0 can be installed from conda’s anaconda channel (conda install -c anaconda clangxx_osx-64), or can also be installed with Homebrew (brew install llvm). Note that Homebrew’s llvm formula is keg-only, i.e. it requires manual modifications to the PATH and LDFLAGS (as documented by brew info llvm).

On macOS<10.14, it is additionally necessary to use clang<8.0 (e.g. with brew install llvm@7) as clang 8.0 appears to believe that code relying on C++17 can only be run on macOS≥10.14+.

The macOS wheel is built using tools/build-macos-wheel.sh, which relies on delocate-wheel (to vendor a recent version of libc++). Currently, it can only be built from a Homebrew-clang wheel, not a conda-clang wheel (due to some path intricacies…).

Windows

The following additional dependencies are required:

  • VS2019 (The exact minimum version is unknown, but it is known that mplcairo fails to build on the Github Actions windows-2016 agent and requires the windows-2019 agent.)

  • cairo headers and import and dynamic libraries (cairo.lib and cairo.dll) with FreeType support. Note that this excludes, in particular, most Anaconda and conda-forge builds: they do not include FreeType support.

    The currently preferred solution is to get the headers e.g. from a Linux distribution package, the DLL from a pycairo wheel (e.g. from PyPI), and generate the import library oneself using dumpbin and lib.

    Alternatively, very recent conda-forge builds (≥1.16.0 build 1005) do include FreeType support. In order to use them, the include path needs to be modified as described below. (This is currently intentionally disabled by default to avoid confusing errors if the cairo build is too old.)

  • FreeType headers and import and dynamic libraries (freetype.lib and freetype.dll), which can be retrieved from https://github.com/ubawurinna/freetype-windows-binaries, or alternatively using conda:

    conda install -y freetype

The (standard) CL and LINK environment variables (which always get prepended respectively to the invocations of the compiler and the linker) should be set as follows:

set CL=/IC:\path\to\dir\containing\cairo.h /IC:\same\for\ft2build.h
set LINK=/LIBPATH:C:\path\to\dir\containing\cairo.lib /LIBPATH:C:\same\for\freetype.lib

In particular, in order to use a conda-forge cairo (as described above), {sys.prefix}\Library\include\cairo needs to be added to the include path.

Moreover, we also need to find cairo.dll and freetype.dll and copy them next to mplcairo’s extension module. As the dynamic libraries are typically found next to import libraries, we search the /LIBPATH: entries in the LINK environment variable and copy the first cairo.dll and freetype.dll found there.

The script tools/build-windows-wheel.py automates the retrieval of the cairo (assuming that pycairo is already installed) and FreeType DLLs, and the wheel build.

Use

On Linux and Windows, mplcairo can be used as any normal Matplotlib backend: call e.g. matplotlib.use("module://mplcairo.qt") before importing pyplot, add a backend: module://mplcairo.qt line in your matplotlibrc, or set the MPLBACKEND environment variable to module://mplcairo.qt. More specifically, the following backends are provided:

  • module://mplcairo.base (No GUI, but can output to EPS, PDF, PS, SVG, and SVGZ using cairo’s implementation, rather than Matplotlib’s),

  • module://mplcairo.gtk (GTK widget, copying data from a cairo image surface — GTK3 or GTK4 can be selected by calling gi.require_version("Gtk", "3.0") or gi.require_version("Gtk", "4.0") before importing the backend),

  • module://mplcairo.gtk_native (GTK widget, directly drawn onto as a native surface; does not and cannot support blitting — see above for version selection),

  • module://mplcairo.qt (Qt widget, copying data from a cairo image surface — select the binding to use by importing it before mplcairo, or by setting the QT_API environment variable),

  • module://mplcairo.tk (Tk widget, copying data from a cairo image surface),

  • module://mplcairo.wx (wx widget, copying data from a cairo image surface),

  • module://mplcairo.macosx (macOS widget, copying data from a cairo image surface).

On macOS, prior to Matplotlib 3.8, it was necessary to explicitly import mplcairo before importing Matplotlib (unless your Matplotlib is built with system_freetype = True). A practical option was to import mplcairo, then call e.g. matplotlib.use("module://mplcairo.macosx").

Jupyter is entirely unsupported (patches would be appreciated). One possibility is to set the MPLCAIRO_PATCH_AGG environment variable to a non-empty value before importing Matplotlib; this fully replaces the Agg renderer by the cairo renderer throughout Matplotlib. However, this approach is inefficient (due to the need of copies and conversions between premultiplied ARGB32 and straight RGBA8888 buffers); additionally, it does not work with the wx and macosx backends due to peculiarities of the corresponding canvas classes. On the other hand, this is currently the only way in which the webagg-based backends (e.g., Jupyter’s interactive widgets) can use mplcairo.

At import-time, mplcairo will attempt to load Raqm. The use of that library can be controlled and checked using the set_options and get_options functions.

The examples directory contains a few cases where the output of this renderer is arguably more accurate than the one of the default renderer, Agg:

Benchmarks

Install (in the virtualenv) pytest>=3.1.0 and pytest-benchmark, then call (e.g.):

pytest --benchmark-group-by=fullfunc --benchmark-timer=time.process_time

Keep in mind that conda-forge’s cairo is (on my setup) ~2× slower than a “native” build of cairo.

Test suite

Run run-mpl-test-suite.py (which depends on pytest>=3.2.2) to run the Matplotlib test suite with the Agg backend patched by the mplcairo backend. Note that Matplotlib must be installed with its test data, which is not the case when it is installed from conda or from most Linux distributions; instead, it should be installed from PyPI or from source.

Nearly all image comparison tests “fail” as the renderers are fundamentally different; currently, the intent is to manually check the diff images. Passing --tolerance=inf marks these tests as “passed” (while still textually reporting the image differences) so that one can spot issues not related to rendering differences. In practice, --tolerance=50 appears to be enough.

Some other (non-image-comparison) tests are also known to fail (they are listed in ISSUES.rst, with the relevant explanations), and automatically skipped.

Run run-examples.py to run some examples that exercise some more aspects of mplcairo.

Notes

Antialiasing

The artist antialiasing property can be set to any of the cairo_antialias_t enum values, or True (the default) or False (which is synonym to NONE).

Setting antialiasing to True uses FAST antialiasing for lines thicker than 1/3px and BEST for lines thinner than that: for lines thinner than 1/3px, the former leads to artefacts such as lines disappearing in certain sections (see e.g. test_cycles.test_property_collision_plot after forcing the antialiasing to FAST). The threshold of 1/3px was determined empirically, see examples/thin_line_antialiasing.py.

Note that in order to set the lines.antialiased or patch.antialiased rcparams to a cairo_antialias_t enum value, it is necessary to bypass rcparam validation, using, e.g.

dict.__setitem__(plt.rcParams, "lines.antialiased", antialias_t.FAST)

The text.antialiased rcparam can likewise be set to any cairo_antialias_t enum value, or True (the default, which maps to SUBPIXELGRAY is not sufficient to benefit from Raqm’s subpixel positioning; see also cairo issue #152) or False (which maps to NONE).

Note that in rare cases, on cairo<1.17.4, FAST antialiasing can trigger a “double free or corruption” bug in cairo (#44). If you hit this problem, consider using BEST or NONE antialiasing (depending on your quality and speed requirements).

Fast drawing

For fast drawing of path with many segments, the agg.path.chunksize rcparam should be set to e.g. 1000 (see examples/time_drawing_per_element.py for the determination of this value); this causes longer paths to be split into individually rendered sections of 1000 segments each (directly rendering longer paths appears to have slightly superlinear complexity).

Simplification threshold

The path.simplify_threshold rcparam is used to control the accuracy of marker stamping, down to an arbitrarily chosen threshold of 1/16px. If the threshold is set to a lower value, the exact (slower) marker drawing path will be used. Marker stamping is also implemented for scatter plots (which can have multiple colors). Likewise, markers of different sizes get mapped into markers of discretized sizes, with an error bounded by the threshold.

NOTE: pcolor and mplot3d’s plot_surface display some artefacts where the facets join each other. This is because these functions internally use a PathCollection; this triggers the approximate stamping, and even without it (by setting path.simplify_threshold to zero), cairo’s rasterization of the edge between the facets is poor. pcolormesh (which internally uses a QuadMesh) should generally be preferred over pcolor anyways. plot_surface could likewise instead represent the surface using QuadMesh, which is drawn without such artefacts.

Font formats and features

In order to use a specific font that Matplotlib may be unable to use, pass a filename directly:

from matplotlib.font_manager import FontProperties
fig.text(.5, .5, "hello, world",
         fontproperties=FontProperties(fname="/path/to/font.ttf"))

or more simply, with Matplotlib≥3.3:

from pathlib import Path
fig.text(.5, .5, "hello, world", font=Path("/path/to/font.ttf"))

mplcairo still relies on Matplotlib’s font cache, so fonts unsupported by Matplotlib remain unavailable by other means.

For TTC fonts (and, more generally, font formats that include multiple font faces in a single file), the nth font (n≥0) can be selected by appending #n to the filename (e.g., "/path/to/font.ttc#1").

OpenType font features can be selected by appending |feature,... to the filename, followed by a HarfBuzz feature string (e.g., "/path/to/font.otf|frac,onum"); see examples/opentype_features.py. A language tag can likewise be set with |language=...; currently, this always applies to the whole buffer, but a PR adding support for slicing syntax (similar to font features) would be considered.

OpenType font variations can be selected by appending an additional | to the filename, followed by a Cairo font variation string (e.g., "/path/to/font.otf||wdth=75"); see examples/opentype_variations.py. This support requires Cairo>=1.16. Note that features are parsed first, so if you do not wish to specify any features, you must specify an empty set with two pipes, i.e., font.otf|variations will treat variations as features, not variations.

The syntaxes for selecting TTC subfonts and OpenType font features and language tags are experimental and may change, especially if such features are implemented in Matplotlib itself.

Color fonts (e.g. emojis) are handled.

Multi-page output

Matplotlib’s PdfPages class is deeply tied with the builtin backend_pdf (in fact, it cannot even be used with Matplotlib’s own cairo backend). Instead, use mplcairo.multipage.MultiPage for multi-page PDF and PS output. The API is similar:

from mplcairo.multipage import MultiPage

fig1 = ...
fig2 = ...
with MultiPage(path_or_stream, metadata=...) as mp:
    mp.savefig(fig1)
    mp.savefig(fig2)

See the class’ docstring for additional information.

Version control for vector formats

cairo is able to write PDF 1.4 and 1.5 (defaulting to 1.5), PostScript levels 2 and 3 (defaulting to 3), and SVG versions 1.1 and 1.2 (defaulting to 1.1). This can be controlled by passing a metadata dict to savefig with a MaxVersion entry, which must be one of the strings "1.4"/"1.5" (for pdf), "2"/"3" (for ps), or "1.1"/"1.2" (for svg).

cairo-script output

Setting the MPLCAIRO_SCRIPT_SURFACE environment variable before mplcairo is imported to vector or raster allows one to save figures (with savefig) in the .cairoscript format, which is a “native script that matches the cairo drawing model”. The value of the variable determines the rendering path used (e.g., whether marker stamping is used at all). This may be helpful for troubleshooting purposes.

Note that cairo-script output is generally broken on cairo≤1.17.8.

Markers at Bézier control points

draw_markers draws a marker at each control point of the given path, which is the documented behavior, even though all builtin renderers only draw markers at straight or Bézier segment ends.

Known differences

Due to missing support from cairo:

  • SVG output does not support global metadata or set URLs or ids on any element, as cairo provides no support to do so.

  • PS output does not respect SOURCE_DATE_EPOCH.

  • PS output does not support the Creator metadata key; however it supports the Title key.

  • The following rcparams have no effect:

    • pdf.fonttype (font type is selected by cairo internally),

    • pdf.inheritcolor (effectively always False),

    • pdf.use14corefonts (effectively always False),

    • ps.fonttype (font type is selected by cairo internally),

    • ps.useafm (effectively always False),

    • svg.fonttype (effectively always "path", see cairo issue #253),

    • svg.hashsalt.

Additionally, the quality, optimize, and progressive parameters to savefig, which have been removed in Matplotlib 3.5, are not supported.

Possible optimizations

  • Cache eviction policy and persistent cache for draw_path_collection.

  • Use QtOpenGLWidget and the cairo-gl backend.

What about the already existing cairo (gtk/qt/wx/tk/…cairo) backends?

They are very slow (try running examples/mplot3d/wire3d_animation.py) and render math poorly (try title(r"$\sqrt{2}$")).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mplcairo-0.6.tar.gz (98.1 kB view details)

Uploaded Source

Built Distributions

mplcairo-0.6-cp313-cp313-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.13 Windows x86-64

mplcairo-0.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

mplcairo-0.6-cp313-cp313-macosx_10_13_universal2.whl (654.9 kB view details)

Uploaded CPython 3.13 macOS 10.13+ universal2 (ARM64, x86-64)

mplcairo-0.6-cp312-cp312-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.12 Windows x86-64

mplcairo-0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

mplcairo-0.6-cp312-cp312-macosx_10_13_universal2.whl (654.7 kB view details)

Uploaded CPython 3.12 macOS 10.13+ universal2 (ARM64, x86-64)

mplcairo-0.6-cp311-cp311-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.11 Windows x86-64

mplcairo-0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

mplcairo-0.6-cp311-cp311-macosx_10_13_universal2.whl (649.3 kB view details)

Uploaded CPython 3.11 macOS 10.13+ universal2 (ARM64, x86-64)

mplcairo-0.6-cp310-cp310-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.10 Windows x86-64

mplcairo-0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

mplcairo-0.6-cp310-cp310-macosx_10_13_x86_64.whl (344.4 kB view details)

Uploaded CPython 3.10 macOS 10.13+ x86-64

mplcairo-0.6-cp39-cp39-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.9 Windows x86-64

mplcairo-0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

mplcairo-0.6-cp39-cp39-macosx_10_13_x86_64.whl (344.6 kB view details)

Uploaded CPython 3.9 macOS 10.13+ x86-64

mplcairo-0.6-cp38-cp38-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.8 Windows x86-64

mplcairo-0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

mplcairo-0.6-cp38-cp38-macosx_10_13_x86_64.whl (344.4 kB view details)

Uploaded CPython 3.8 macOS 10.13+ x86-64

File details

Details for the file mplcairo-0.6.tar.gz.

File metadata

  • Download URL: mplcairo-0.6.tar.gz
  • Upload date:
  • Size: 98.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for mplcairo-0.6.tar.gz
Algorithm Hash digest
SHA256 2eb27fe251913531ab6583ab7f12b7120b83370f8623ba8c9eb50658689f546e
MD5 1a7af108d68db23ef3b345ebdc6ae935
BLAKE2b-256 25553dbb33e5090880c7d69bbfa0c6d8978c7372e27920592fc4535de5df6b5a

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: mplcairo-0.6-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for mplcairo-0.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c6b52ab4f7951de685acd69acb89f230ef3faf18dd0d9f9505afd41bbd9888d7
MD5 1235c948813e875e91f0e39c42a41dc0
BLAKE2b-256 e9c0bd90ec2916107307e23414ba6e3cd882d5b7a6d7059403eef0703f46f54b

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5e42e917df8c8a3ec9d923ca7b96e921b88971a5f01e3101cfdaad063e741ed6
MD5 474229605a4ef1c5ad862a8bb615e4ab
BLAKE2b-256 a3164f1e447b846e236447a2dc8c5b2978b75d821c3eeb468f9ca2a3ff79a1f2

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 50e2599025451fff8efd1e55b52eaffe6509ad31a7865fb2b8b4dd17441da31f
MD5 237c749e2e14d55bd209543e76866f50
BLAKE2b-256 b2e7837efc41cc7391b3fac93449715dc34fa371150a0ab8b63f98b6ade2a07a

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: mplcairo-0.6-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for mplcairo-0.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e51bfa3432c92fd7c97fca910e30f1f4db896364c7ccb80626a586a598121910
MD5 b3be2be5a02b38e68be738d0454aac77
BLAKE2b-256 91a7df970b234502959e41f7b5a56a833b5b9454155821400c260eb297e87d35

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3afa29d0e2140ebc145b1f59906b51e102b397f052df85f040b9edb03976608a
MD5 d8d61cb68df3ecb41aedc39bb3abdcf0
BLAKE2b-256 4f4abc4e96eb8f4655af5eff59646dd4ffdf2b13a37835761f97195c23b70a47

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 70cb727de48170d3f0be8f3120c03c39e41544ece70b2dab45ffe860657683e9
MD5 bbb3e86a2a2bf9c329e10ff210216883
BLAKE2b-256 26b04cf42ba362e179228c1450c91bb4555500b000cb61251cafee559020f19a

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: mplcairo-0.6-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for mplcairo-0.6-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2a79c4a0237f62de2ee04ccaeabde4f59594256d1ffeb693f988beeaa7376f72
MD5 560baa0a30db6dbc739b544505a1d0b7
BLAKE2b-256 2273df3068bd4dbd7d3834b20cc6d72f4add12807f1b3233dac2445d0d0ef3ec

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cafdb579434ae027853b78bfe24af595960b58ff68b3060dc38f8969e7ebe5b8
MD5 2f6581a4ecf09b05831017187ed1565d
BLAKE2b-256 39e36a00f19a0379b3424293afdb7e12797a98ed229a81e3085f087a49f5f463

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp311-cp311-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp311-cp311-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 7fdd52fa0b85f58e51ffc328bc643273f319546870baf4e38937eb30d141d001
MD5 16a743858e69c7579ed7f756c687c7d2
BLAKE2b-256 c1aa410d3785d65419963867070460388367dc79aec0844f5889967144de18c6

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: mplcairo-0.6-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for mplcairo-0.6-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9020d2eadd6194d08a99b847405a0466c43d39532abf1039f4b1fbefb6a73410
MD5 b1b4c87010445e5bfeb227579d8072ee
BLAKE2b-256 72662c37f4d1d8a579e471de9409d492f96972811f1594e003d6d7c99a15c38e

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5a7b56b78bc57b58e3d98dbe414fd92a15935327909d2752d43a13deb6b7091d
MD5 f9b79411f6fd61345965e0de97081ab0
BLAKE2b-256 22970c2058f5fab013c455127e252c181bddb108a0fb9a27f0f28d741d6a0dd0

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp310-cp310-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp310-cp310-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 de26c1f1ef170bda0f7b39e4ec22e1385600354b9b8a0559ef622079b4b6f5b9
MD5 e845d7fbc79769b5fd0bbec9d7c6dfd4
BLAKE2b-256 148d6653f0904c180652f9989d59f5ff0cdb86579eec0588d3c2d13834bfb87b

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: mplcairo-0.6-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for mplcairo-0.6-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 69625220a43ca157f498652a15188c982c5f20b6a6fa96c858b0b679dc375ade
MD5 7319db01cf7cbdd675ff06959f6a66eb
BLAKE2b-256 582054fead34c2fd080fc2bfc33c67e17c4ecbbde993e95b6d400bd8ec186a4d

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 04b3fac3f91298f74ef459df728f672b87fcc9e1102bb9fcb7fba1ef6f3d23b3
MD5 1e661ae7e46a1779a512f0b3c61cc754
BLAKE2b-256 b0dfde885d849a15dd1c261d153c12162bb7960ab70b875901f9276ac1b302b9

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp39-cp39-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp39-cp39-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 eca21ac730e2599f226cdf2e2194713e3e62fec68cd69b62e29c81ac160bdc86
MD5 f085267a44aa29eb865864483f9b871a
BLAKE2b-256 3eab83074b8fcdbe57476a3a60fdaad8039139092456af0407147a07166befa4

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: mplcairo-0.6-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for mplcairo-0.6-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 8265f627e717bfc2e1ac79e626387bf974e67d3ae2a01361ea5c1a229cc5d618
MD5 2703c670c15e3dab833ad644bb9c2953
BLAKE2b-256 d3ecdac098e44455d8548036429b1d31b0146afbc6c1b2c0229d4cfdbf7f151d

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bfaafd24cf706eab54f71327e44a8b7e5343514da9c1ab1762c3e8e0027a04f7
MD5 ac7963a25cd74e4f7a46faac06da3cc5
BLAKE2b-256 20bee3c2f137cbfe11233604d71bed93681e04266d6a3876121bf5b30d93f1f0

See more details on using hashes here.

File details

Details for the file mplcairo-0.6-cp38-cp38-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for mplcairo-0.6-cp38-cp38-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 95b201c815e1b0d5da6b1fced480a357d8603b8b26943187c6420bf02902b5ed
MD5 cd25295331e210806d2736d23f0fcab7
BLAKE2b-256 c973e706e91a85766a541f481340c5cbbd37d0aad24c84641ec85a4e38d1bfbc

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page