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.1.tar.gz (97.7 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.13 Windows x86-64

mplcairo-0.6.1-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.1-cp313-cp313-macosx_10_13_universal2.whl (654.2 kB view details)

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

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

Uploaded CPython 3.12 Windows x86-64

mplcairo-0.6.1-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.1-cp312-cp312-macosx_10_13_universal2.whl (654.1 kB view details)

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

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

Uploaded CPython 3.11 Windows x86-64

mplcairo-0.6.1-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.1-cp311-cp311-macosx_10_13_universal2.whl (648.7 kB view details)

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

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

Uploaded CPython 3.10 Windows x86-64

mplcairo-0.6.1-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.1-cp310-cp310-macosx_10_13_x86_64.whl (344.1 kB view details)

Uploaded CPython 3.10 macOS 10.13+ x86-64

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

Uploaded CPython 3.9 Windows x86-64

mplcairo-0.6.1-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.1-cp39-cp39-macosx_10_13_x86_64.whl (344.2 kB view details)

Uploaded CPython 3.9 macOS 10.13+ x86-64

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

Uploaded CPython 3.8 Windows x86-64

mplcairo-0.6.1-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.1-cp38-cp38-macosx_10_13_x86_64.whl (343.8 kB view details)

Uploaded CPython 3.8 macOS 10.13+ x86-64

File details

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

File metadata

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

File hashes

Hashes for mplcairo-0.6.1.tar.gz
Algorithm Hash digest
SHA256 eac1d408cf4101db0ab4d0d57e6c3840bd5434818dc6cd295fc923062f9180d5
MD5 2633fc08f36a3dd2a06da44279a7a369
BLAKE2b-256 1fd62d24fc6152db8161075b18070eda687b9c5c2428980b309184fb0653fab6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 766aed941791e25ce8809aafc007fefe58603dc91e427934068315babd700ada
MD5 f8b9c02f6cb26050921d50abd3e50490
BLAKE2b-256 185560c897bafbd4ba30b09670f63a9ef2ded590114f20a60b79397536a7ba84

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1feb86c96201b492be8a6f655212942630e997f940e7d9600f549d09da02fb87
MD5 924b19f306f4b7d1b60c8e98416ada75
BLAKE2b-256 dcd9f3edd122e2df1cdb35cad6ac23ef2e51b74aef92836ac84497192ead5cc9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 aa86452e3b895e431928c20d97f830903a076e6ab7c6df40ecc5a5eb055349b3
MD5 3bca6fca3f300072cb2f3607e4340585
BLAKE2b-256 901a6abac6f9ddb9184a5ab341383e56c38ea6afd4a2d5f84b9f292d3b5a1960

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7a451d3c9b287a6a9b15d9131ab9574c86c219608a0401974d55c0340a82f8ca
MD5 0a863e83d5eb715d80fe399fea7b1f59
BLAKE2b-256 fba5908f2fc1a1a463a2731be75aea5e67165b5597c91471978f95d01cc32a74

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 351046cc6c6ed4f37031947dc88a4bfb104dff474631b1cfa6ee7274e9a6031d
MD5 28a7558f40ec3e615a00d1c6753105df
BLAKE2b-256 ccb2c4cfa9796e73227205a98e82a68ad5af85c858848ee50752c4c1fcd8ef66

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 ea23c0c65ddf402d605ebf8917620284eb003f8e7a20f43f8c1459ee5a0a661e
MD5 17feed28ea3acad2aaf5cb861df5d268
BLAKE2b-256 895d141c35306da22994c3a39cebba1eebe0f5e4e36e94c8221034e88de8c6b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 5849c849db22526b330f3b34a0100e8febe764dc043ba1e5667d33c725356f7c
MD5 063224520b7d53943ea90266c0653a82
BLAKE2b-256 5529819040ad9d660fca50b4139c1f140b68fbea7e1716ffbfdba25c01a21ebd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0664ab68744b78228b6c38b4be301bcd0e864b23a2f7c8472e020c8daab5210b
MD5 816445ceb60b4ef5a6c258e05107a4b7
BLAKE2b-256 eb69c1a0b9c37811e6caa3ff9101a743b5e1e52badd4e5f1e3e8064e34009e31

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp311-cp311-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 9e3896053cb0443616119298c590d087b25a71452a099853049a9d26ffda8f48
MD5 33e541e9a28e681e7baa663c8e86d9dc
BLAKE2b-256 122760a504541cfa4d1338905a69a5d506ce95dbc1c9c895df21dfeb6fe8d485

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3c1b7868b6b33ee5b5ec5bd2df2a7a125c1e8ca80cad2d74e8a20c0fbde99efd
MD5 42182ddf3e24ebca62c4a9dc6d608265
BLAKE2b-256 531e863f3ef2cf40c71b9a4009ebcb2cfe76beab2bbcd6ba20ffb4bb086b2d94

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a4a10e20aa8eda7200abc9849cc9d2e5b5726a728bb951bdee8a54b63433dc03
MD5 39964767bf716e6b01ddf10e3de450b8
BLAKE2b-256 fcc09a818d0403e67330832acc08cbee5b768330e58f3cc726db4ae2854d0664

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp310-cp310-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 eb4616787c4996b93fc4be77e8893e86dc4af0489fd03bf92e7c14ede4c6ed97
MD5 7bd60a3faa6182487f21d5c6e9ea95b2
BLAKE2b-256 61685868b26a7ae3a664e68ad33a4b3946678e66f77331dd546bb4a0aa48b163

See more details on using hashes here.

File details

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

File metadata

  • Download URL: mplcairo-0.6.1-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.13.0

File hashes

Hashes for mplcairo-0.6.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 263f77ac751af375692cc96e9c2e6cd47951c9470e650963f8d71d11273dacb0
MD5 81945e2cfb5df0fd2866bb23f22e96ce
BLAKE2b-256 8c2a18dfbd001f816d439359e50abea114b6be06f99a7a2df7bb5d8d07c718c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e78d1c8770e0daaef93960b4bd35143c536cec2ac77a612ceeb6fb0353710492
MD5 ae7ceae22f3781f0b24451caed1dadde
BLAKE2b-256 fcc4102be31ace72b08e4f13935dfc53df94b79c72c0adb23416d271b409d467

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp39-cp39-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 71b88c91ebe5deda83809083e8871dea32bf149697a1c5212df4d8ae5104d83f
MD5 1e3543e1457213de2c839ba911d7763e
BLAKE2b-256 90aedf1746d60ed179a012544976a9855a69882ffc016b87ed94d1ae85a93c4b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: mplcairo-0.6.1-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.13.0

File hashes

Hashes for mplcairo-0.6.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 398dde54a85d6ced839dc236c5bb41b8af4d46a669ae08cbb0c665ce774babb7
MD5 93ebf77d4ff12c6d927ea9d226091d63
BLAKE2b-256 63935379c0cff063c957a8070d4aa1ee4de32262605557a8860ecc02c7277b54

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 64fe49b09040709b4e70e16e89977ca30e5778047ca8c75928ff34982c02825e
MD5 0dc51170e0d468bd7b3dd5d9666fe507
BLAKE2b-256 987da66c24e1a2801500d5c648a5ab35e2e49d9c4beb3b5a0cf98e4f381c8797

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mplcairo-0.6.1-cp38-cp38-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 856f302a8832cd24116880cd8cc6e20309b387ba713b17339bd968404b88af45
MD5 5579500cb67bc7c05be3f54308c692de
BLAKE2b-256 edc3d33019a8add63c113f3dfb0093413b81c285803d707fad4cb02d52f9240d

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