{ "info": { "author": "Antony Lee", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "====================================\nA (new) cairo backend for Matplotlib\n====================================\n\n|PyPI| |Fedora Rawhide|\n\n|Azure Pipelines|\n\n.. |PyPI|\n image:: https://img.shields.io/pypi/v/mplcairo.svg\n :target: https://pypi.python.org/pypi/mplcairo\n.. |Fedora Rawhide|\n image:: https://repology.org/badge/version-for-repo/fedora_rawhide/python:mplcairo.svg\n :target: fedora-package_\n.. |Azure Pipelines|\n image:: https://dev.azure.com/matplotlib/mplcairo/_apis/build/status/matplotlib.mplcairo\n :target: https://dev.azure.com/matplotlib/mplcairo/_build/latest?definitionId=1\n\n.. _fedora-package: https://apps.fedoraproject.org/packages/python-mplcairo\n\n.. contents:: :local:\n\nThis is a new, essentially complete implementation of a cairo_ backend for\nMatplotlib_. It can be used in combination with a Qt5, GTK3, Tk, wx, or macOS\nUI, or non-interactively (i.e., to save figure to various file formats).\n\nNoteworthy points include:\n\n.. ... sadly, currently not true.\n\n - Speed (the backend can be up to ~10\u00d7 faster than Agg, e.g., when stamping\n circular markers of variable colors).\n\n- Improved accuracy (e.g., with marker positioning, quad meshes, and text\n kerning; floating point surfaces are supported with cairo\u22651.17.2).\n- Support for a wider variety of font formats, such as otf and pfb, for vector\n (PDF, PS, SVG) backends (Matplotlib's Agg backend also supports such fonts).\n- Optional support for complex text layout (right-to-left languages, etc.)\n using Raqm_. **Note** that Raqm depends on Fribidi, which is licensed under\n the LGPLv2.1+.\n- Support for embedding URLs in PDF (but not SVG) output (requires\n cairo\u22651.15.4).\n- Support for multi-page output both for PDF and PS (Matplotlib only supports\n multi-page PDF).\n- Support for custom blend modes (see `examples/operators.py`_).\n\n.. _cairo: https://www.cairographics.org/\n.. _Matplotlib: http://matplotlib.org/\n.. _Raqm: https://github.com/HOST-Oman/libraqm\n.. _examples/operators.py: examples/operators.py\n\nInstallation\n============\n\nmplcairo requires\n\n- Python\u22653.5 (\u22653.6 on Windows),\n- Matplotlib\u22652.2 (declared as ``install_requires``),\n- pybind11\u22652.2.4 [#]_ (declared as ``install_requires``),\n- on Linux and macOS, pycairo\u22651.16.0 [#]_ (declared as conditional\n ``install_requires``),\n- on Windows, cairo\u22651.11.4 [#]_ (shipped with the wheel).\n\nAs usual, install using pip:\n\n.. code-block:: sh\n\n $ pip install mplcairo # from PyPI\n $ pip install git+https://github.com/matplotlib/mplcairo # from Github\n\nNote that wheels are not available for macOS, because no macOS version ships a\nrecent-enough libc++ by default and vendoring of libc++ appears to be fragile.\nHelp for packaging would be welcome.\n\nmplcairo can use Raqm_ (\u22650.2) for complex text layout if it is available.\nRefer to the instructions on that project's website for installation on Linux\nand macOS. You may want to look at https://github.com/HOST-Oman/libraqm-cmake\nfor Windows build scripts.\n\n.. [#] pybind11 is actually only a build-time requirement, but doesn't play\n well with ``setup_requires``. The version requirement comes from pybind11\n issue `#1362 `_.\n\n.. _pybind11-1362: https://github.com/pybind/pybind11/issues/1362\n\n.. [#] pycairo 1.16.0 added ``get_include()``.\n\n We do not actually rely on pycairo's Python bindings. Rather, specifying a\n dependency on pycairo is a convenient way to specify a dependency on cairo\n (\u22651.13.1, for pycairo\u22651.14.0) itself, and allows us to load cairo at\n runtime instead of linking to it (simplifying the build of self-contained\n wheels).\n\n On Windows, this strategy is (AFAIK) not possible, so we explicitly link\n against the cairo DLL.\n\n.. [#] cairo 1.11.4 added mesh gradient support (used by ``draw_quad_mesh()``).\n\n cairo 1.15.4 added support for PDF metadata and links; the presence of this\n feature is detected at runtime.\n\n cairo 1.17.2 added support for floating point surfaces, usable with\n ``mplcairo.set_options(float_surface=True)``; the presence of this feature\n is detected at runtime.\n\nOn Fedora, the package is available as `python-mplcairo `_.\n\nBuilding/packaging\n==================\n\nThis section is only relevant if you wish to build mplcairo yourself, or\npackage it for redistribution. Otherwise, proceed to the Use_ section.\n\nIn all cases, once the dependencies described below are installed, mplcairo\ncan be built and installed using any of the standard commands (``pip wheel\n--no-deps .``, ``pip install .``, ``pip install -e .`` and ``python setup.py\nbuild_ext -i`` being the most relevant ones).\n\nUnix\n----\n\nThe following additional dependencies are required:\n\n- a C++ compiler with C++17 support, e.g. GCC\u22657.2 or Clang\u22655.0.\n\n- cairo and FreeType headers, and pkg-config information to locate them.\n\n If using conda, they can be installed using ::\n\n conda install -y -c conda-forge pycairo pkg-config\n\n as pycairo (also a dependency) depends on cairo, which depends on freetype.\n Note that cairo and pkg-config from the ``anaconda`` channel will *not* work.\n\n On Linux, they can also be installed with your distribution's package manager\n (Arch: ``cairo``, Debian/Ubuntu: ``libcairo2-dev``, Fedora: ``cairo-devel``).\n\nRaqm (\u22650.2) headers are also needed, but will be automatically downloaded if\nnot found.\n\nLinux\n`````\n\nconda's compilers (``gxx_linux-64`` on the ``anaconda`` channel) `currently\ninteract poorly with installing cairo and pkg-config from conda-forge\n`_, so you are on your own to install a recent compiler\n(e.g., using your distribution's package manager). You may want to set the\n``CC`` and ``CXX`` environment variables to point to your C++ compiler if it is\nnonstandard [#]_. In that case, be careful to set them to e.g. ``g++-7`` and\n**not** ``gcc-7``, otherwise the compilation will succeed but the shared object\nwill be mis-linked and fail to load.\n\nThe manylinux wheel is built using `tools/build-manylinux-wheel.sh`_.\n\nPackagers may want to set the ``MPLCAIRO_BUILD_TYPE`` environment variable to\n``package`` before the build (see the docstring of setup.py_ for details).\n\n.. _tools/build-manylinux-wheel.sh: tools/build-manylinux-wheel.sh\n.. _setup.py: setup.py\n\n**NOTE**: On Arch Linux, the python-pillow (Arch) package includes an invalid\nversion of ``raqm.h`` (https://bugs.archlinux.org/task/57492) and must not be\ninstalled while building mplcairo with the system Python, even in a virtualenv\n(it can be installed when *using* mplcairo without causing any problems). One\nsolution is to temporarily uninstall the package; another one is to package it\nyourself using e.g. pypi2pkgbuild_.\n\n.. [#] ``distutils`` uses ``CC`` for *compiling* C++ sources but ``CXX`` for\n linking them (don't ask). You may run into additional issues if ``CC`` or\n ``CXX`` has multiple words; e.g., if ``CC`` is set to ``ccache g++``, you\n also need to set ``CXX`` to ``ccache gcc``.\n\n.. _conda-build-2523: https://github.com/conda/conda-build/issues/2523\n.. _pypi2pkgbuild: https://github.com/anntzer/pypi2pkgbuild\n\nmacOS\n`````\n\nClang\u22655.0 can be installed from ``conda``'s ``anaconda`` channel (``conda\ninstall -c anaconda clangxx_osx-64``), or can also be installed with Homebrew\n(``brew install llvm``). Note that Homebrew's llvm formula is keg-only, i.e.\nit requires manual modifications to the PATH and LDFLAGS (as documented by\n``brew info llvm``).\n\nOn macOS<10.14, it is additionally necessary to use clang<8.0 (e.g. with ``brew\ninstall llvm@7``) as clang 8.0 appears to believe that code relying on C++17\ncan only be run on macOS\u226510.14+.\n\nThe macOS wheel is built using ``tools/build-macos-wheel.sh``, which relies on\ndelocate-wheel_ (to vendor a recent version of libc++). Currently, it can only\nbe built from a Homebrew-clang wheel, not a conda-clang wheel (due to some path\nintricacies...).\n\nAs I can personally only test the macOS build on CI, any help with the build\nand the packaging on that platform would be welcome.\n\n.. _delocate-wheel: https://github.com/matthew-brett/delocate\n\nWindows\n-------\n\nThe following additional dependencies are required:\n\n- VS2019 (The exact minimum version is unknown, but it is known that mplcairo\n fails to build on the Azure ``vs2017-win2016`` agent and requires the\n ``windows-2019`` agent. This is the reason for restricting support to Python\n 3.6 on Windows: distutils is able to use such a recent MSVC only since Python\n 3.6.4.)\n\n- cairo headers and import and dynamic libraries (``cairo.lib`` and\n ``cairo.dll``) *with FreeType support*. Note that this excludes, in\n particular, the Anaconda and conda-forge builds: they do not include\n FreeType support.\n\n I am in fact not aware of any such build available online, with the exception\n of https://github.com/preshing/cairo-windows/releases; however, this specific\n build appears to `misrender pdfs`_. Instead, a solution is to get the\n headers e.g. from a Linux distribution package, the DLL from Christoph\n Gohlke's cairocffi_ build, and generate the import library oneself using\n ``dumpbin`` and ``lib``.\n\n- FreeType headers and import and dynamic libraries (``freetype.lib`` and\n ``freetype.dll``), which can be retrieved from\n https://github.com/ubawurinna/freetype-windows-binaries, or alternatively\n using conda::\n\n conda install -y freetype\n\n.. _misrender pdfs: https://preshing.com/20170529/heres-a-standalone-cairo-dll-for-windows/#IDComment1047546463\n.. _cairocffi: https://www.lfd.uci.edu/~gohlke/pythonlibs/#cairocffi\n\nThe (standard) |CL|_ and |LINK|_ environment variables (which always get\nprepended respectively to the invocations of the compiler and the linker)\nshould be set as follows::\n\n set CL=/IC:\\path\\to\\dir\\containing\\cairo.h /IC:\\same\\for\\ft2build.h\n set LINK=/LIBPATH:C:\\path\\to\\dir\\containing\\cairo.lib /LIBPATH:C:\\same\\for\\freetype.lib\n\nMoreover, we also need to find ``cairo.dll`` and ``freetype.dll`` and copy\nthem next to ``mplcairo``'s extension module. As the dynamic libraries are\ntypically found next to import libraries, we search the ``/LIBPATH:`` entries\nin the ``LINK`` environment variable and copy the first ``cairo.dll`` and\n``freetype.dll`` found there.\n\nThe script ``tools/build-windows-wheel.py`` automates the retrieval of the\ncairo (assuming that a Gohlke cairocffi is already installed) and FreeType and\nthe wheel build.\n\n.. |CL| replace:: ``CL``\n.. _CL: https://docs.microsoft.com/en-us/cpp/build/reference/cl-environment-variables\n.. |LINK| replace:: ``LINK``\n.. _LINK: https://docs.microsoft.com/en-us/cpp/build/reference/link-environment-variables\n\nUse\n===\n\nOn Linux and Windows, mplcairo can be used as any normal Matplotlib backend:\ncall e.g. ``matplotlib.use(\"module://mplcairo.qt\")`` before importing pyplot,\nadd a ``backend: module://mplcairo.qt`` line in your ``matplotlibrc``, or set\nthe ``MPLBACKEND`` environment variable to ``module://mplcairo.qt``. More\nspecifically, the following backends are provided:\n\n- ``module://mplcairo.base`` (No GUI, but can output to EPS, PDF, PS, SVG, and\n SVGZ using cairo's implementation, rather than Matplotlib's),\n- ``module://mplcairo.gtk`` (GTK3 widget, copying data from a cairo image\n surface),\n- ``module://mplcairo.gtk_native`` (GTK3 widget, directly drawn onto as a\n native surface; does not and cannot support blitting),\n- ``module://mplcairo.qt`` (Qt4/5 widget, copying data from a cairo image\n surface \u2014 select the binding to use by importing it before mplcairo, or by\n setting the ``QT_API`` environment variable),\n- ``module://mplcairo.tk`` (Tk widget, copying data from a cairo image\n surface),\n- ``module://mplcairo.wx`` (wx widget, copying data from a cairo image\n surface),\n- ``module://mplcairo.macosx`` (macOS widget, copying data from a cairo image\n surface).\n\nOn macOS, **it is necessary to explicitly import mplcairo before importing\nMatplotlib** due to incompatibilities associated with the use of a recent\nlibc++. As such, the most practical option is to import mplcairo, then call\ne.g. ``matplotlib.use(\"module://mplcairo.macosx\")``.\n\n.. ... doesn't work now.\n\n To use cairo rendering in Jupyter's ``inline`` mode, patch\n\n .. code-block:: python\n\n ipykernel.pylab.backend_inline.new_figure_manager = \\\n mplcairo.base.new_figure_manager\n\nAlternatively, set the ``MPLCAIRO_PATCH_AGG`` environment variable to a\nnon-empty value to fully replace the Agg renderer by the cairo renderer\nthroughout Matplotlib. However, this approach is inefficient (due to the need\nof copies and conversions between premultiplied ARGB32 and straight RGBA8888\nbuffers); additionally, it does not work with the wx and macosx backends due\nto peculiarities of the corresponding canvas classes. On the other hand, this\nis currently the only way in which the webagg-based backends (e.g., Jupyter's\ninline widget) are supported.\n\nAt import-time, mplcairo will attempt to load Raqm_. The use of that library\ncan be controlled and checked using the ``set_options`` and ``get_options``\nfunctions.\n\nThe examples_ directory contains a few cases where the output of this renderer\nis arguably more accurate than the one of the default renderer, Agg:\n\n- circle_markers.py_ and square_markers.py_: more accurate and faster marker\n stamping.\n- marker_stamping.py_: more accurate marker stamping.\n- quadmesh.py_: better antialiasing of quad meshes, fewer artefacts with\n masked data.\n- text_kerning.py_: improved text kerning.\n\n.. _examples: examples/\n.. _circle_markers.py: examples/circle_markers.py\n.. _square_markers.py: examples/square_markers.py\n.. _marker_stamping.py: examples/marker_stamping.py\n.. _quadmesh.py: examples/quadmesh.py\n.. _text_kerning.py: examples/text_kerning.py\n\nBenchmarks\n==========\n\nInstall (in the virtualenv) ``pytest>=3.1.0`` and ``pytest-benchmark``, then\ncall (e.g.):\n\n.. code-block:: sh\n\n pytest --benchmark-group-by=fullfunc --benchmark-timer=time.process_time\n\nKeep in mind that conda-forge's cairo is (on my setup) ~2\u00d7 slower than a\n\"native\" build of cairo.\n\nTest suite\n==========\n\nRun ``run-mpl-test-suite.py`` (which depends on ``pytest>=3.2.2``) to run the\nMatplotlib test suite with the Agg backend patched by the mplcairo backend.\nNote that Matplotlib must be installed with its test data, which is not the\ncase when it is installed from conda or from most Linux distributions; instead,\nit should be installed from PyPI or from source.\n\nNearly all image comparison tests \"fail\" as the renderers are fundamentally\ndifferent; currently, the intent is to manually check the diff images. Passing\n``--tolerance=inf`` marks these tests as \"passed\" (while still textually\nreporting the image differences) so that one can spot issues not related to\nrendering differences. In practice, ``--tolerance=50`` appears to be enough.\n\nSome other (non-image-comparison) tests are also known to fail (they are listed\nin ``ISSUES.rst``, with the relevant explanations), and automatically skipped.\n\nRun ``run-examples.py`` to run some examples that exercise some more aspects of\nmplcairo.\n\nNotes\n=====\n\nAntialiasing\n------------\n\nThe artist antialiasing property can be set to any of the ``cairo_antialias_t``\nenum values, or ``True`` (the default) or ``False`` (which is synonym to\n``NONE``).\n\nSetting antialiasing to ``True`` uses ``FAST`` antialiasing for lines thicker\nthan 1/3px and ``BEST`` for lines thinner than that: for lines thinner\nthan 1/3px, the former leads to artefacts such as lines disappearing in\ncertain sections (see e.g. ``test_cycles.test_property_collision_plot`` after\nforcing the antialiasing to ``FAST``). The threshold of 1/3px was determined\nempirically, see `examples/thin_line_antialiasing.py`_.\n\n.. _examples/thin_line_antialiasing.py: examples/thin_line_antialiasing.py\n\nNote that in order to set the ``lines.antialiased`` or ``patch.antialiased``\nrcparams to a ``cairo_antialias_t`` enum value, it is necessary to bypass\nrcparam validation, using, e.g.\n\n.. code-block:: python\n\n dict.__setitem__(plt.rcParams, \"lines.antialiased\", antialias_t.FAST)\n\nThe ``text.antialiased`` rcparam can likewise be set to any\n``cairo_antialias_t`` enum value, or ``True`` (the default, which maps to\n``SUBPIXEL`` \u2014 ``GRAY`` is not sufficient to benefit from Raqm_'s subpixel\npositioning; see also `cairo issue #152 `_) or ``False`` (which\nmaps to ``NONE``).\n\n.. _cairo-152: https://gitlab.freedesktop.org/cairo/cairo/issues/152\n\nNote that in rare cases, ``FAST`` antialiasing can trigger a \"double free or\ncorruption\" bug in cairo (`#44 `_). If you hit this problem,\nconsider using ``BEST`` or ``NONE`` antialiasing (depending on your quality and\nspeed requirements).\n\n.. _cairo-44: https://gitlab.freedesktop.org/cairo/cairo/issues/44\n\nFast drawing\n------------\n\nFor fast drawing of path with many segments, the ``agg.path.chunksize`` rcparam\nshould be set to e.g. 1000 (see `examples/time_drawing_per_element.py`_ for the\ndetermination of this value); this causes longer paths to be split into\nindividually rendered sections of 1000 segments each (directly rendering longer\npaths appears to have slightly superlinear complexity).\n\n.. _examples/time_drawing_per_element.py: examples/time_drawing_per_element.py\n\nSimplification threshold\n------------------------\n\nThe ``path.simplify_threshold`` rcparam is used to control the accuracy of\nmarker stamping, down to an arbitrarily chosen threshold of 1/16px. If the\nthreshold is set to a lower value, the exact (slower) marker drawing path will\nbe used. Marker stamping is also implemented for scatter plots (which can have\nmultiple colors). Likewise, markers of different sizes get mapped into markers\nof discretized sizes, with an error bounded by the threshold.\n\n**NOTE**: ``pcolor`` and mplot3d's ``plot_surface`` display some artifacts\nwhere the facets join each other. This is because these functions internally\nuse a ``PathCollection``, thus triggering the approximate stamping.\n``pcolormesh`` (which internally uses a ``QuadMesh``) should generally be\npreferred over ``pcolor`` anyways. ``plot_surface`` should likewise instead\nrepresent the surface using ``QuadMesh``, which is drawn without such\nartefacts.\n\nFont formats\n------------\n\nIn order to use a specific font that Matplotlib may be unable to use, pass a\nfilename directly:\n\n.. code-block:: python\n\n from matplotlib.font_manager import FontProperties\n ax.text(.5, .5, \"hello, world\", fontproperties=FontProperties(fname=\"...\"))\n\nmplcairo still relies on Matplotlib's font cache, so fonts unsupported by\nMatplotlib remain unavailable by other means.\n\nFor ttc fonts (and, more generally, font formats that include multiple font\nfaces in a single file), the *n*\\th font (*n*\\\u22650) can be selected by appending\n``#n`` to the filename (e.g., ``fname=\"/path/to/font.ttc#1\"``).\n\nNote that Matplotlib's (default) Agg backend will handle most (single-face)\nfonts equally well (ultimately, both backends relies on FreeType for\nrasterization). It is Matplotlib's vector backends (PS, PDF, and, for pfb\nfonts, SVG) that do not support these fonts, whereas mplcairo support these\nfonts in all output formats.\n\nMulti-page output\n-----------------\n\nMatplotlib's ``PdfPages`` class is deeply tied with the builtin ``backend_pdf``\n(in fact, it cannot even be used with Matplotlib's own cairo backend).\nInstead, use ``mplcairo.multipage.MultiPage`` for multi-page PDF and PS output.\nThe API is similar:\n\n.. code-block:: python\n\n from mplcairo.multipage import MultiPage\n\n fig1 = ...\n fig2 = ...\n with MultiPage(path_or_stream, metadata=...) as mp:\n mp.savefig(fig1)\n mp.savefig(fig2)\n\nSee the class' docstring for additional information.\n\n``cairo-script`` output\n-----------------------\n\nSetting the ``MPLCAIRO_SCRIPT_SURFACE`` environment variable *before mplcairo\nis imported* to ``vector`` or ``raster`` allows one to save figures (with\n``savefig``) in the ``.cairoscript`` format, which is a \"native script that\nmatches the cairo drawing model\". The value of the variable determines the\nrendering path used (e.g., whether marker stamping is used at all). This may\nbe helpful for troubleshooting purposes.\n\nNote that this may crash the process after the file is written, due to `cairo\nissue #277 `_.\n\n.. _cairo-277: https://gitlab.freedesktop.org/cairo/cairo/issues/277\n\nMarkers at B\u00e9zier control points\n--------------------------------\n\n``draw_markers`` draws a marker at each control point of the given path, which\nis the documented behavior, even though all builtin renderers only draw markers\nat straight or B\u00e9zier segment ends.\n\nKnown issues\n============\n\nMissing support from cairo\n--------------------------\n\n- SVG output does not set URLs or ids on any element, as cairo provides no\n support to do so.\n- PS output does not respect SOURCE_DATE_EPOCH.\n- PS output does not support the ``Creator`` metadata key; however it supports\n the ``Title`` key.\n- The following rcparams have no effect:\n\n - ``pdf.fonttype`` (font type is selected by cairo internally),\n - ``pdf.inheritcolor`` (effectively always ``False``),\n - ``pdf.use14corefonts`` (effectively always ``False``),\n - ``ps.fonttype`` (font type is selected by cairo internally),\n - ``ps.useafm`` (effectively always ``False``),\n - ``svg.fonttype`` (effectively always ``\"path\"``, see `cairo issue #253\n `_),\n - ``svg.hashsalt``.\n\n.. _cairo-253: https://gitlab.freedesktop.org/cairo/cairo/issues/253\n\nPossible optimizations\n======================\n\n- Cache eviction policy and persistent cache for ``draw_path_collection``.\n- Path simplification (although cairo appears to use vertex reduction and\n Douglas-Peucker internally?).\n- Use QtOpenGLWidget and the cairo-gl backend.\n- ``hexbin`` currently falls back on the slow implementation due to its use of\n the ``offset_position`` parameter. This should be fixed on Matplotlib's\n side.\n\nWhat about the already existing cairo (gtk3/qt4/qt5/wx/tk/...cairo) backends?\n=============================================================================\n\nThey are very slow (try running `examples/mplot3d/wire3d_animation.py`_) and\nrender math poorly (try ``title(r\"$\\sqrt{2}$\")``).\n\n.. _examples/mplot3d/wire3d_animation.py: examples/mplot3d/wire3d_animation.py\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/matplotlib/mplcairo", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "mplcairo", "package_url": "https://pypi.org/project/mplcairo/", "platform": "", "project_url": "https://pypi.org/project/mplcairo/", "project_urls": { "Homepage": "https://github.com/matplotlib/mplcairo" }, "release_url": "https://pypi.org/project/mplcairo/0.2/", "requires_dist": [ "matplotlib (>=2.2)", "pycairo (>=1.16.0)" ], "requires_python": ">=3.5", "summary": "A (new) cairo backend for Matplotlib.", "version": "0.2" }, "last_serial": 5869909, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "cafe9240f2948dac972f9d4e3067b14c", "sha256": "0bd5ec45584a6f9a9f316eed5784b8ba0bc7026f7e7a236041487f8b43e88e7f" }, "downloads": -1, "filename": "mplcairo-0.1-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "cafe9240f2948dac972f9d4e3067b14c", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.4", "size": 2762190, "upload_time": "2018-07-22T20:42:53", "url": "https://files.pythonhosted.org/packages/4a/8e/ce2a482c675634c0b3ec93eb01d1db4dfe6dea46c2348dcc3a377ce1ee42/mplcairo-0.1-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "30f5f706c39375725ec596458b42074a", "sha256": "79cb03a6dc29b67de3a7010dfc6c4d26f65c25cbe8f4f99ce7a09a74500d0140" }, "downloads": -1, "filename": "mplcairo-0.1-cp36-cp36m-win_amd64.whl", "has_sig": false, "md5_digest": "30f5f706c39375725ec596458b42074a", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.4", "size": 1339087, "upload_time": "2018-07-22T20:42:56", "url": "https://files.pythonhosted.org/packages/6a/70/45f26f57cfd23f4bfaa63c24562cd523144071f3fcea11f7de85d3122a5b/mplcairo-0.1-cp36-cp36m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "6f98e6bc91da9ac309a66448604b0c95", "sha256": "4b627b057ecf13a39405d62c02bc38cff713944a18f6a64e9c85d5e226469838" }, "downloads": -1, "filename": "mplcairo-0.1.tar.gz", "has_sig": false, "md5_digest": "6f98e6bc91da9ac309a66448604b0c95", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 102800, "upload_time": "2018-07-22T20:42:58", "url": "https://files.pythonhosted.org/packages/2a/0a/c2a79cff380d45689f6ee0f9f81550e4437ec4c4dbddf3173340140e08ce/mplcairo-0.1.tar.gz" } ], "0.1a1": [ { "comment_text": "", "digests": { "md5": "12178e5869774732241d089e149d1d6b", "sha256": "76b498d3b2818e4eed1d7b5451af8a1db312205d00e7af02fae93a7a4e88a6d7" }, "downloads": -1, "filename": "mplcairo-0.1a1-cp36-cp36m-macosx_10_12_x86_64.whl", "has_sig": false, "md5_digest": "12178e5869774732241d089e149d1d6b", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.4", "size": 449991, "upload_time": "2018-03-13T07:41:28", "url": "https://files.pythonhosted.org/packages/8b/64/0a96d01f7c5cc1eeaa32213d9a84d2af866fac4f10b5e050182b015134e4/mplcairo-0.1a1-cp36-cp36m-macosx_10_12_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "75dff4f37d0b502edbce44351c35940d", "sha256": "3ed149bc183063e8a7e44bfb9bb87b74f4a72e176c9e03f521a438cbc16684ac" }, "downloads": -1, "filename": "mplcairo-0.1a1-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "75dff4f37d0b502edbce44351c35940d", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.4", "size": 2726599, "upload_time": "2018-03-13T07:40:46", "url": "https://files.pythonhosted.org/packages/51/6d/47a75ea58d2345b4fca3b39723f71950da168fa718f07821cb92e66db204/mplcairo-0.1a1-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "ebacd992880c435ec984eeef2a7924de", "sha256": "c71e9ae20221e47915f692b372d39318ee9c36dcd2e7a8387d6ba4ff27f10821" }, "downloads": -1, "filename": "mplcairo-0.1a1-cp36-cp36m-win_amd64.whl", "has_sig": false, "md5_digest": "ebacd992880c435ec984eeef2a7924de", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.4", "size": 1339420, "upload_time": "2018-03-13T07:41:40", "url": "https://files.pythonhosted.org/packages/a2/06/e1ddc36ed74684a8605ba17e43ad34b6cbb1d80e5abe0a6e4c6dc20fa1a4/mplcairo-0.1a1-cp36-cp36m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "13db3ae4800bfc5f2492ef8eec28c1dd", "sha256": "e728f4fbb58ae0124ac8e9efc72cf0797cb914011cdc0050f85920a95ea831e6" }, "downloads": -1, "filename": "mplcairo-0.1a1.tar.gz", "has_sig": false, "md5_digest": "13db3ae4800bfc5f2492ef8eec28c1dd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 90457, "upload_time": "2018-03-13T07:47:04", "url": "https://files.pythonhosted.org/packages/df/9d/87fd894a4423e3ee6a46c602ebc21be49a47731f1e239c35ada2b5b9a864/mplcairo-0.1a1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "9e485c537b9b42825a1d2e5e1e741911", "sha256": "a35ff59a314c0d59d165f502c2d8b86b316f60900db954825fc0d7aa0fb07639" }, "downloads": -1, "filename": "mplcairo-0.2-cp35-cp35m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "9e485c537b9b42825a1d2e5e1e741911", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 299734, "upload_time": "2019-09-22T18:05:43", "url": "https://files.pythonhosted.org/packages/7a/e9/ea397d3077db063fe6ba9807e1720fc0eed804d5027f7ca4c76a651bc7e4/mplcairo-0.2-cp35-cp35m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "583b02da6fcaacd43aa04a6f7ed5de58", "sha256": "1426c3dabef11f27b2f8444391ccde0e47743fe1443077a4172f05722d78ecba" }, "downloads": -1, "filename": "mplcairo-0.2-cp35-cp35m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "583b02da6fcaacd43aa04a6f7ed5de58", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 815589, "upload_time": "2019-09-22T18:05:47", "url": "https://files.pythonhosted.org/packages/82/2a/efc63131f5e7f51e442be03c88dd765735873d0cb05fbdbaf3a810665cc5/mplcairo-0.2-cp35-cp35m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "b90d60428d18093640d7cd6cb6b32465", "sha256": "134a0bb4fbb7946d85f2339957d021fd6f64e35103fec9d8f82edbad2c797a0a" }, "downloads": -1, "filename": "mplcairo-0.2-cp36-cp36m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "b90d60428d18093640d7cd6cb6b32465", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 299907, "upload_time": "2019-09-22T18:05:51", "url": "https://files.pythonhosted.org/packages/e4/65/5d82385c4b0800e2590d9709b3a82c4fa8ee7008ae6e0dadd95dcdee6739/mplcairo-0.2-cp36-cp36m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "8558a850d82361952eb17b5e110fefd2", "sha256": "adee11a4213863f10e5b34e04e8df1a9010ff879b1f4dfd95c2aa2e0bac69021" }, "downloads": -1, "filename": "mplcairo-0.2-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "8558a850d82361952eb17b5e110fefd2", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 815874, "upload_time": "2019-09-22T18:05:55", "url": "https://files.pythonhosted.org/packages/7c/3f/17c51e757ef9d13b3dc1dafa29ad31a3b75cb0653a4b9c764f6fac9a4bb4/mplcairo-0.2-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "13ad880fc2064f94c3dacaaca9ad8f06", "sha256": "2bb83bdd6a1cd4b5c5e954b843bea322d658dc56e1fb93b2537d5ffbeac3db96" }, "downloads": -1, "filename": "mplcairo-0.2-cp36-cp36m-win_amd64.whl", "has_sig": false, "md5_digest": "13ad880fc2064f94c3dacaaca9ad8f06", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 1658394, "upload_time": "2019-09-22T18:06:03", "url": "https://files.pythonhosted.org/packages/19/47/55812358e50327dbc0d9b6616065a54aa11d5eb4a798f4d70014cca2e674/mplcairo-0.2-cp36-cp36m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "5365ef4ee97cab41b4e27f1147f0780a", "sha256": "f69b8f14183f627f608ef8df1ca57b17f8436d717a861f5d6ffd56368313a5d7" }, "downloads": -1, "filename": "mplcairo-0.2-cp37-cp37m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "5365ef4ee97cab41b4e27f1147f0780a", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 299936, "upload_time": "2019-09-22T18:06:07", "url": "https://files.pythonhosted.org/packages/62/71/344af4b2f546a0a5fa74e4761b080c0164b76bf25757e9d759a9935c7c14/mplcairo-0.2-cp37-cp37m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "6cd9d160291316da2085b20ab02e79ba", "sha256": "03cacf3bb34d0832ce29657721cbd342dda4ef6f987c62b35df3cc28e6d59fc8" }, "downloads": -1, "filename": "mplcairo-0.2-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "6cd9d160291316da2085b20ab02e79ba", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 815880, "upload_time": "2019-09-22T18:06:12", "url": "https://files.pythonhosted.org/packages/6d/9b/c5aee8db7be8d2ff6bf4735c6184d698ce9574e3f49d0dcf35ca9a702d5f/mplcairo-0.2-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "75dd287f5432a14d2a1e25eda3f502ba", "sha256": "1accb1c0baa54909ee811b3fa8ec618f40fddf214fe8060fff77f097c5cc2345" }, "downloads": -1, "filename": "mplcairo-0.2-cp37-cp37m-win_amd64.whl", "has_sig": false, "md5_digest": "75dd287f5432a14d2a1e25eda3f502ba", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 1671236, "upload_time": "2019-09-22T18:06:21", "url": "https://files.pythonhosted.org/packages/aa/fe/5d66d0e0a6c4ceb6bad24077fc5d5f7594b002f3a49538747b389998da9d/mplcairo-0.2-cp37-cp37m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "1c70daba57e3e2669e84d0537e322090", "sha256": "b384429f80873d5ba728931fa118ed25b2a5a144847ff767b245c95f0a17c3a6" }, "downloads": -1, "filename": "mplcairo-0.2.tar.gz", "has_sig": false, "md5_digest": "1c70daba57e3e2669e84d0537e322090", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 113679, "upload_time": "2019-09-22T18:06:23", "url": "https://files.pythonhosted.org/packages/4f/40/05b259a7746dc9a5ef6438910ef5b3ab7e9110bb1a462ce895358bd028d4/mplcairo-0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9e485c537b9b42825a1d2e5e1e741911", "sha256": "a35ff59a314c0d59d165f502c2d8b86b316f60900db954825fc0d7aa0fb07639" }, "downloads": -1, "filename": "mplcairo-0.2-cp35-cp35m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "9e485c537b9b42825a1d2e5e1e741911", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 299734, "upload_time": "2019-09-22T18:05:43", "url": "https://files.pythonhosted.org/packages/7a/e9/ea397d3077db063fe6ba9807e1720fc0eed804d5027f7ca4c76a651bc7e4/mplcairo-0.2-cp35-cp35m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "583b02da6fcaacd43aa04a6f7ed5de58", "sha256": "1426c3dabef11f27b2f8444391ccde0e47743fe1443077a4172f05722d78ecba" }, "downloads": -1, "filename": "mplcairo-0.2-cp35-cp35m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "583b02da6fcaacd43aa04a6f7ed5de58", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">=3.5", "size": 815589, "upload_time": "2019-09-22T18:05:47", "url": "https://files.pythonhosted.org/packages/82/2a/efc63131f5e7f51e442be03c88dd765735873d0cb05fbdbaf3a810665cc5/mplcairo-0.2-cp35-cp35m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "b90d60428d18093640d7cd6cb6b32465", "sha256": "134a0bb4fbb7946d85f2339957d021fd6f64e35103fec9d8f82edbad2c797a0a" }, "downloads": -1, "filename": "mplcairo-0.2-cp36-cp36m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "b90d60428d18093640d7cd6cb6b32465", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 299907, "upload_time": "2019-09-22T18:05:51", "url": "https://files.pythonhosted.org/packages/e4/65/5d82385c4b0800e2590d9709b3a82c4fa8ee7008ae6e0dadd95dcdee6739/mplcairo-0.2-cp36-cp36m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "8558a850d82361952eb17b5e110fefd2", "sha256": "adee11a4213863f10e5b34e04e8df1a9010ff879b1f4dfd95c2aa2e0bac69021" }, "downloads": -1, "filename": "mplcairo-0.2-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "8558a850d82361952eb17b5e110fefd2", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 815874, "upload_time": "2019-09-22T18:05:55", "url": "https://files.pythonhosted.org/packages/7c/3f/17c51e757ef9d13b3dc1dafa29ad31a3b75cb0653a4b9c764f6fac9a4bb4/mplcairo-0.2-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "13ad880fc2064f94c3dacaaca9ad8f06", "sha256": "2bb83bdd6a1cd4b5c5e954b843bea322d658dc56e1fb93b2537d5ffbeac3db96" }, "downloads": -1, "filename": "mplcairo-0.2-cp36-cp36m-win_amd64.whl", "has_sig": false, "md5_digest": "13ad880fc2064f94c3dacaaca9ad8f06", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">=3.5", "size": 1658394, "upload_time": "2019-09-22T18:06:03", "url": "https://files.pythonhosted.org/packages/19/47/55812358e50327dbc0d9b6616065a54aa11d5eb4a798f4d70014cca2e674/mplcairo-0.2-cp36-cp36m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "5365ef4ee97cab41b4e27f1147f0780a", "sha256": "f69b8f14183f627f608ef8df1ca57b17f8436d717a861f5d6ffd56368313a5d7" }, "downloads": -1, "filename": "mplcairo-0.2-cp37-cp37m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "5365ef4ee97cab41b4e27f1147f0780a", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 299936, "upload_time": "2019-09-22T18:06:07", "url": "https://files.pythonhosted.org/packages/62/71/344af4b2f546a0a5fa74e4761b080c0164b76bf25757e9d759a9935c7c14/mplcairo-0.2-cp37-cp37m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "6cd9d160291316da2085b20ab02e79ba", "sha256": "03cacf3bb34d0832ce29657721cbd342dda4ef6f987c62b35df3cc28e6d59fc8" }, "downloads": -1, "filename": "mplcairo-0.2-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "6cd9d160291316da2085b20ab02e79ba", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 815880, "upload_time": "2019-09-22T18:06:12", "url": "https://files.pythonhosted.org/packages/6d/9b/c5aee8db7be8d2ff6bf4735c6184d698ce9574e3f49d0dcf35ca9a702d5f/mplcairo-0.2-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "75dd287f5432a14d2a1e25eda3f502ba", "sha256": "1accb1c0baa54909ee811b3fa8ec618f40fddf214fe8060fff77f097c5cc2345" }, "downloads": -1, "filename": "mplcairo-0.2-cp37-cp37m-win_amd64.whl", "has_sig": false, "md5_digest": "75dd287f5432a14d2a1e25eda3f502ba", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.5", "size": 1671236, "upload_time": "2019-09-22T18:06:21", "url": "https://files.pythonhosted.org/packages/aa/fe/5d66d0e0a6c4ceb6bad24077fc5d5f7594b002f3a49538747b389998da9d/mplcairo-0.2-cp37-cp37m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "1c70daba57e3e2669e84d0537e322090", "sha256": "b384429f80873d5ba728931fa118ed25b2a5a144847ff767b245c95f0a17c3a6" }, "downloads": -1, "filename": "mplcairo-0.2.tar.gz", "has_sig": false, "md5_digest": "1c70daba57e3e2669e84d0537e322090", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 113679, "upload_time": "2019-09-22T18:06:23", "url": "https://files.pythonhosted.org/packages/4f/40/05b259a7746dc9a5ef6438910ef5b3ab7e9110bb1a462ce895358bd028d4/mplcairo-0.2.tar.gz" } ] }