Skip to main content

A (new) cairo backend for Matplotlib.

Project description

GitHub PyPI Fedora Rawhide Azure Pipelines

This is a new, essentially complete implementation of a cairo backend for Matplotlib. It can be used in combination with a Qt5, GTK3, 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).

  • Improved font embedding in vector formats (fonts are typically subsetted and embedded in their native format).

  • Optional support for complex text layout (right-to-left languages, etc.) and OpenType font features (see examples/opentype_features.py), and partial support for color fonts (e.g., emojis), using Raqm. Note that Raqm depends 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).

Installation

mplcairo requires

  • Python≥3.7,

  • Matplotlib≥2.2 (declared as install_requires),

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

  • on Windows, cairo≥1.11.4 [4] (shipped with the wheel).

It is recommended to use cairo≥1.17.4.

Additionally, building mplcairo from source requires

  • pybind11≥2.6.0 [5] (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. Help for packaging would be welcome.

mplcairo can use Raqm (≥0.2) 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 [6]. 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…).

As I can personally only test the macOS build on CI, any help with the build and the packaging on that platform would be welcome.

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 Azure vs2017-win2016 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 Christoph Gohlke’s pycairo build, 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 a Gohlke 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 (GTK3 widget, copying data from a cairo image surface),

  • module://mplcairo.gtk_native (GTK3 widget, directly drawn onto as a native surface; does not and cannot support blitting),

  • module://mplcairo.qt (Qt4/5 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, it is necessary to explicitly import mplcairo before importing Matplotlib due to incompatibilities associated with the use of a recent libc++. As such, the most practical option is to import mplcairo, then call e.g. matplotlib.use("module://mplcairo.macosx").

To use cairo rendering in Jupyter’s inline mode, patch, in your ipython_config.py:

import mplcairo.base
import ipykernel.pylab.backend_inline
ipykernel.pylab.backend_inline.new_figure_manager = \
    mplcairo.base.new_figure_manager

Alternatively, set the MPLCAIRO_PATCH_AGG environment variable to a non-empty value to fully replace 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) are supported.

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, 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 artifacts 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.

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

Color fonts (e.g. emojis) are handled, but emojis that rely on ligatures (1, 2) run into limitations of HarfBuzz and are currently rendered correctly only if they are the only glyph in the rendered string.

Note that Matplotlib’s (default) Agg backend will handle most single-face monochrome fonts equally well (ultimately, both backends relies on FreeType for rasterization). It is Matplotlib’s vector backends (PS, PDF, and, for pfb fonts, SVG) that do not support these fonts, whereas mplcairo support these fonts in all output formats.

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.

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 this may crash the process after the file is written, due to cairo issue #277.

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.

  • Path simplification (although cairo appears to use vertex reduction and Douglas-Peucker internally?).

  • Use QtOpenGLWidget and the cairo-gl backend.

What about the already existing cairo (gtk3/qt4/qt5/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.4.tar.gz (92.2 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.9 Windows x86-64

mplcairo-0.4-cp39-cp39-manylinux1_x86_64.whl (858.8 kB view details)

Uploaded CPython 3.9

mplcairo-0.4-cp39-cp39-macosx_10_14_x86_64.whl (314.2 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

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

Uploaded CPython 3.8 Windows x86-64

mplcairo-0.4-cp38-cp38-manylinux1_x86_64.whl (858.5 kB view details)

Uploaded CPython 3.8

mplcairo-0.4-cp38-cp38-macosx_10_14_x86_64.whl (314.2 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

mplcairo-0.4-cp37-cp37m-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.7m Windows x86-64

mplcairo-0.4-cp37-cp37m-manylinux1_x86_64.whl (865.8 kB view details)

Uploaded CPython 3.7m

mplcairo-0.4-cp37-cp37m-macosx_10_14_x86_64.whl (310.0 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: mplcairo-0.4.tar.gz
  • Upload date:
  • Size: 92.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for mplcairo-0.4.tar.gz
Algorithm Hash digest
SHA256 8feb09f8ce0af27e9e5b3f8e53bf267b11bfbff5c854e2c95c625a8d48bd6a08
MD5 8d6ba6a0c5b28ca9457a430477058eb3
BLAKE2b-256 b20a7208eaaca3481f08e76cddf473cd08b6578e43fbf2e568b545c3947c4d18

See more details on using hashes here.

File details

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

File metadata

  • Download URL: mplcairo-0.4-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/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for mplcairo-0.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 e7fe8030f9f603cb880d1ecd3f8343a2c5f3e407a84bb062a25361d469aa980c
MD5 25eeddcb2ecc22eb9e892934e4047ec9
BLAKE2b-256 96bd1e5d7bc08912b26a2dc52c7656ca9864117bfe91547a72995e4fc99101c4

See more details on using hashes here.

File details

Details for the file mplcairo-0.4-cp39-cp39-manylinux1_x86_64.whl.

File metadata

  • Download URL: mplcairo-0.4-cp39-cp39-manylinux1_x86_64.whl
  • Upload date:
  • Size: 858.8 kB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for mplcairo-0.4-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1b0d0ff34474d00bc3dd1338027c735000af60239a924f8310a05696ee125d82
MD5 44b7e5b3e18ac1ca7893ad9aaa326490
BLAKE2b-256 85026717d15eb6af77d883a693d6d59e4de8f886f8b179494f6ec367ae9b06ab

See more details on using hashes here.

File details

Details for the file mplcairo-0.4-cp39-cp39-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: mplcairo-0.4-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 314.2 kB
  • Tags: CPython 3.9, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for mplcairo-0.4-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e7e359e0d16c04e23ad1f432d0dc862ef406e44e6c88fdb60b1eed30225f0b21
MD5 17278efe9dba3d6e3a022ebab87ae7e0
BLAKE2b-256 898ffb28e1d5b94ee768cb60bd4f4d6412907ebfcbfd39161266ef94a457981b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: mplcairo-0.4-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/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for mplcairo-0.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 51794e0b3d115a2bc3d455fc45002cc4c959e13b6111a728baa428d973d913fb
MD5 0696994257aabcd8061152ed918402c4
BLAKE2b-256 06ed5886229eae4191504bab8e43b42dacb3a7e529ead44cc9851b13084bf4b3

See more details on using hashes here.

File details

Details for the file mplcairo-0.4-cp38-cp38-manylinux1_x86_64.whl.

File metadata

  • Download URL: mplcairo-0.4-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 858.5 kB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for mplcairo-0.4-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5452ada635915a54ec68f5b91ffb0ca69c8f203205bba1bb84125365b9e247c5
MD5 f15551c9746bf1fbe9eef7932bcf8d52
BLAKE2b-256 d88167a535e32f5c94c4da05691884202c654ac2d4e14d212458cde7248cf565

See more details on using hashes here.

File details

Details for the file mplcairo-0.4-cp38-cp38-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: mplcairo-0.4-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 314.2 kB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for mplcairo-0.4-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 f480eb2f230203863212360a96261f0315c6bfb2253126d55ba2115d6da8d756
MD5 2da79d9fc26de1f7a6b1c1da20c06723
BLAKE2b-256 057517fdc4b552995814ac55a565c3868f9f0f5a72f79b07a3fee95acf34e009

See more details on using hashes here.

File details

Details for the file mplcairo-0.4-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: mplcairo-0.4-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for mplcairo-0.4-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 6cfea3ab0d3f363779a1e5ec2f18c2f8cfc30c3126f93dcb9e9f2cad33ddb79b
MD5 18e6bbaf47bf5bf713b4eb79dd68d76d
BLAKE2b-256 ef1a2573e3f42f87c5743f6c5aeb124bf48e61ab3eca9f827be4946677f8624c

See more details on using hashes here.

File details

Details for the file mplcairo-0.4-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: mplcairo-0.4-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 865.8 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for mplcairo-0.4-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9ff54864ec68a9c70148fd12d1eb3a13430d2af1afe58f3de52ae6ef7161966a
MD5 7e627dbaf21310c96d57438990a58b46
BLAKE2b-256 67612a98df798262b8688be1f1cb1c9939fde25a9a6cde51b58cc3886d93bd5d

See more details on using hashes here.

File details

Details for the file mplcairo-0.4-cp37-cp37m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: mplcairo-0.4-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 310.0 kB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for mplcairo-0.4-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 b4ef2b9a02f6cc83223e501c846216f71ee0c13da59ecd9b17a529784bc58964
MD5 dc8597c1caaeff3ffcb217e475030e0d
BLAKE2b-256 e86c0b62cfa162355fd8c1ad3187a8eb86c52b6452c168ba7968ce74f2cca503

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