|
| 1 | +.. _backends: |
| 2 | + |
| 3 | +======== |
| 4 | +Backends |
| 5 | +======== |
| 6 | + |
| 7 | +.. _what-is-a-backend: |
| 8 | + |
| 9 | +What is a backend? |
| 10 | +------------------ |
| 11 | + |
| 12 | +A lot of documentation on the website and in the mailing lists refers |
| 13 | +to the "backend" and many new users are confused by this term. |
| 14 | +Matplotlib targets many different use cases and output formats. Some |
| 15 | +people use Matplotlib interactively from the Python shell and have |
| 16 | +plotting windows pop up when they type commands. Some people run |
| 17 | +`Jupyter <https://jupyter.org>`_ notebooks and draw inline plots for |
| 18 | +quick data analysis. Others embed Matplotlib into graphical user |
| 19 | +interfaces like PyQt or PyGObject to build rich applications. Some |
| 20 | +people use Matplotlib in batch scripts to generate postscript images |
| 21 | +from numerical simulations, and still others run web application |
| 22 | +servers to dynamically serve up graphs. |
| 23 | + |
| 24 | +To support all of these use cases, Matplotlib can target different |
| 25 | +outputs, and each of these capabilities is called a backend; the |
| 26 | +"frontend" is the user facing code, i.e., the plotting code, whereas the |
| 27 | +"backend" does all the hard work behind-the-scenes to make the figure. |
| 28 | +There are two types of backends: user interface backends (for use in |
| 29 | +PyQt/PySide, PyGObject, Tkinter, wxPython, or macOS/Cocoa); also referred to |
| 30 | +as "interactive backends") and hardcopy backends to make image files |
| 31 | +(PNG, SVG, PDF, PS; also referred to as "non-interactive backends"). |
| 32 | + |
| 33 | +Selecting a backend |
| 34 | +------------------- |
| 35 | + |
| 36 | +There are three ways to configure your backend: |
| 37 | + |
| 38 | +- The :rc:`backend` parameter in your :file:`matplotlibrc` file |
| 39 | +- The :envvar:`MPLBACKEND` environment variable |
| 40 | +- The function :func:`matplotlib.use` |
| 41 | + |
| 42 | +Below is a more detailed description. |
| 43 | + |
| 44 | +If there is more than one configuration present, the last one from the |
| 45 | +list takes precedence; e.g. calling :func:`matplotlib.use()` will override |
| 46 | +the setting in your :file:`matplotlibrc`. |
| 47 | + |
| 48 | +Without a backend explicitly set, Matplotlib automatically detects a usable |
| 49 | +backend based on what is available on your system and on whether a GUI event |
| 50 | +loop is already running. The first usable backend in the following list is |
| 51 | +selected: MacOSX, QtAgg, GTK4Agg, Gtk3Agg, TkAgg, WxAgg, Agg. The last, Agg, |
| 52 | +is a non-interactive backend that can only write to files. It is used on |
| 53 | +Linux, if Matplotlib cannot connect to either an X display or a Wayland |
| 54 | +display. |
| 55 | + |
| 56 | +Here is a detailed description of the configuration methods: |
| 57 | + |
| 58 | +#. Setting :rc:`backend` in your :file:`matplotlibrc` file:: |
| 59 | + |
| 60 | + backend : qtagg # use pyqt with antigrain (agg) rendering |
| 61 | + |
| 62 | + See also :doc:`/tutorials/introductory/customizing`. |
| 63 | + |
| 64 | +#. Setting the :envvar:`MPLBACKEND` environment variable: |
| 65 | + |
| 66 | + You can set the environment variable either for your current shell or for |
| 67 | + a single script. |
| 68 | + |
| 69 | + On Unix:: |
| 70 | + |
| 71 | + > export MPLBACKEND=qtagg |
| 72 | + > python simple_plot.py |
| 73 | + |
| 74 | + > MPLBACKEND=qtagg python simple_plot.py |
| 75 | + |
| 76 | + On Windows, only the former is possible:: |
| 77 | + |
| 78 | + > set MPLBACKEND=qtagg |
| 79 | + > python simple_plot.py |
| 80 | + |
| 81 | + Setting this environment variable will override the ``backend`` parameter |
| 82 | + in *any* :file:`matplotlibrc`, even if there is a :file:`matplotlibrc` in |
| 83 | + your current working directory. Therefore, setting :envvar:`MPLBACKEND` |
| 84 | + globally, e.g. in your :file:`.bashrc` or :file:`.profile`, is discouraged |
| 85 | + as it might lead to counter-intuitive behavior. |
| 86 | + |
| 87 | +#. If your script depends on a specific backend you can use the function |
| 88 | + :func:`matplotlib.use`:: |
| 89 | + |
| 90 | + import matplotlib |
| 91 | + matplotlib.use('qtagg') |
| 92 | + |
| 93 | + This should be done before any figure is created, otherwise Matplotlib may |
| 94 | + fail to switch the backend and raise an ImportError. |
| 95 | + |
| 96 | + Using `~matplotlib.use` will require changes in your code if users want to |
| 97 | + use a different backend. Therefore, you should avoid explicitly calling |
| 98 | + `~matplotlib.use` unless absolutely necessary. |
| 99 | + |
| 100 | +.. _the-builtin-backends: |
| 101 | + |
| 102 | +The builtin backends |
| 103 | +-------------------- |
| 104 | + |
| 105 | +By default, Matplotlib should automatically select a default backend which |
| 106 | +allows both interactive work and plotting from scripts, with output to the |
| 107 | +screen and/or to a file, so at least initially, you will not need to worry |
| 108 | +about the backend. The most common exception is if your Python distribution |
| 109 | +comes without :mod:`tkinter` and you have no other GUI toolkit installed. |
| 110 | +This happens on certain Linux distributions, where you need to install a |
| 111 | +Linux package named ``python-tk`` (or similar). |
| 112 | + |
| 113 | +If, however, you want to write graphical user interfaces, or a web |
| 114 | +application server |
| 115 | +(:doc:`/gallery/user_interfaces/web_application_server_sgskip`), or need a |
| 116 | +better understanding of what is going on, read on. To make things easily |
| 117 | +more customizable for graphical user interfaces, Matplotlib separates |
| 118 | +the concept of the renderer (the thing that actually does the drawing) |
| 119 | +from the canvas (the place where the drawing goes). The canonical |
| 120 | +renderer for user interfaces is ``Agg`` which uses the `Anti-Grain |
| 121 | +Geometry`_ C++ library to make a raster (pixel) image of the figure; it |
| 122 | +is used by the ``QtAgg``, ``GTK4Agg``, ``GTK3Agg``, ``wxAgg``, ``TkAgg``, and |
| 123 | +``macosx`` backends. An alternative renderer is based on the Cairo library, |
| 124 | +used by ``QtCairo``, etc. |
| 125 | + |
| 126 | +For the rendering engines, users can also distinguish between `vector |
| 127 | +<https://en.wikipedia.org/wiki/Vector_graphics>`_ or `raster |
| 128 | +<https://en.wikipedia.org/wiki/Raster_graphics>`_ renderers. Vector |
| 129 | +graphics languages issue drawing commands like "draw a line from this |
| 130 | +point to this point" and hence are scale free. Raster backends |
| 131 | +generate a pixel representation of the line whose accuracy depends on a |
| 132 | +DPI setting. |
| 133 | + |
| 134 | +Here is a summary of the Matplotlib renderers (there is an eponymous |
| 135 | +backend for each; these are *non-interactive backends*, capable of |
| 136 | +writing to a file): |
| 137 | + |
| 138 | +======== ========= ======================================================= |
| 139 | +Renderer Filetypes Description |
| 140 | +======== ========= ======================================================= |
| 141 | +AGG png raster_ graphics -- high quality images using the |
| 142 | + `Anti-Grain Geometry`_ engine |
| 143 | +PDF pdf vector_ graphics -- `Portable Document Format`_ |
| 144 | +PS ps, eps vector_ graphics -- Postscript_ output |
| 145 | +SVG svg vector_ graphics -- `Scalable Vector Graphics`_ |
| 146 | +PGF pgf, pdf vector_ graphics -- using the pgf_ package |
| 147 | +Cairo png, ps, raster_ or vector_ graphics -- using the Cairo_ library |
| 148 | + pdf, svg |
| 149 | +======== ========= ======================================================= |
| 150 | + |
| 151 | +To save plots using the non-interactive backends, use the |
| 152 | +``matplotlib.pyplot.savefig('filename')`` method. |
| 153 | + |
| 154 | +These are the user interfaces and renderer combinations supported; |
| 155 | +these are *interactive backends*, capable of displaying to the screen |
| 156 | +and using appropriate renderers from the table above to write to |
| 157 | +a file: |
| 158 | + |
| 159 | +========= ================================================================ |
| 160 | +Backend Description |
| 161 | +========= ================================================================ |
| 162 | +QtAgg Agg rendering in a Qt_ canvas (requires PyQt_ or `Qt for Python`_, |
| 163 | + a.k.a. PySide). This backend can be activated in IPython with |
| 164 | + ``%matplotlib qt``. |
| 165 | +ipympl Agg rendering embedded in a Jupyter widget. (requires ipympl). |
| 166 | + This backend can be enabled in a Jupyter notebook with |
| 167 | + ``%matplotlib ipympl``. |
| 168 | +GTK3Agg Agg rendering to a GTK_ 3.x canvas (requires PyGObject_, |
| 169 | + and pycairo_ or cairocffi_). This backend can be activated in |
| 170 | + IPython with ``%matplotlib gtk3``. |
| 171 | +GTK4Agg Agg rendering to a GTK_ 4.x canvas (requires PyGObject_, |
| 172 | + and pycairo_ or cairocffi_). This backend can be activated in |
| 173 | + IPython with ``%matplotlib gtk4``. |
| 174 | +macosx Agg rendering into a Cocoa canvas in OSX. This backend can be |
| 175 | + activated in IPython with ``%matplotlib osx``. |
| 176 | +TkAgg Agg rendering to a Tk_ canvas (requires TkInter_). This |
| 177 | + backend can be activated in IPython with ``%matplotlib tk``. |
| 178 | +nbAgg Embed an interactive figure in a Jupyter classic notebook. This |
| 179 | + backend can be enabled in Jupyter notebooks via |
| 180 | + ``%matplotlib notebook``. |
| 181 | +WebAgg On ``show()`` will start a tornado server with an interactive |
| 182 | + figure. |
| 183 | +GTK3Cairo Cairo rendering to a GTK_ 3.x canvas (requires PyGObject_, |
| 184 | + and pycairo_ or cairocffi_). |
| 185 | +GTK4Cairo Cairo rendering to a GTK_ 4.x canvas (requires PyGObject_, |
| 186 | + and pycairo_ or cairocffi_). |
| 187 | +wxAgg Agg rendering to a wxWidgets_ canvas (requires wxPython_ 4). |
| 188 | + This backend can be activated in IPython with ``%matplotlib wx``. |
| 189 | +========= ================================================================ |
| 190 | + |
| 191 | +.. note:: |
| 192 | + The names of builtin backends case-insensitive; e.g., 'QtAgg' and |
| 193 | + 'qtagg' are equivalent. |
| 194 | + |
| 195 | +.. _`Anti-Grain Geometry`: http://agg.sourceforge.net/antigrain.com/ |
| 196 | +.. _`Portable Document Format`: https://en.wikipedia.org/wiki/Portable_Document_Format |
| 197 | +.. _Postscript: https://en.wikipedia.org/wiki/PostScript |
| 198 | +.. _`Scalable Vector Graphics`: https://en.wikipedia.org/wiki/Scalable_Vector_Graphics |
| 199 | +.. _pgf: https://ctan.org/pkg/pgf |
| 200 | +.. _Cairo: https://www.cairographics.org |
| 201 | +.. _PyGObject: https://wiki.gnome.org/action/show/Projects/PyGObject |
| 202 | +.. _pycairo: https://www.cairographics.org/pycairo/ |
| 203 | +.. _cairocffi: https://pythonhosted.org/cairocffi/ |
| 204 | +.. _wxPython: https://www.wxpython.org/ |
| 205 | +.. _TkInter: https://docs.python.org/3/library/tk.html |
| 206 | +.. _PyQt: https://riverbankcomputing.com/software/pyqt/intro |
| 207 | +.. _`Qt for Python`: https://doc.qt.io/qtforpython/ |
| 208 | +.. _Qt: https://qt.io/ |
| 209 | +.. _GTK: https://www.gtk.org/ |
| 210 | +.. _Tk: https://www.tcl.tk/ |
| 211 | +.. _wxWidgets: https://www.wxwidgets.org/ |
| 212 | + |
| 213 | +ipympl |
| 214 | +^^^^^^ |
| 215 | + |
| 216 | +The Jupyter widget ecosystem is moving too fast to support directly in |
| 217 | +Matplotlib. To install ipympl: |
| 218 | + |
| 219 | +.. code-block:: bash |
| 220 | +
|
| 221 | + pip install ipympl |
| 222 | + jupyter nbextension enable --py --sys-prefix ipympl |
| 223 | +
|
| 224 | +or |
| 225 | + |
| 226 | +.. code-block:: bash |
| 227 | +
|
| 228 | + conda install ipympl -c conda-forge |
| 229 | +
|
| 230 | +See `jupyter-matplotlib <https://github.com/matplotlib/jupyter-matplotlib>`__ |
| 231 | +for more details. |
| 232 | + |
| 233 | +.. _QT_API-usage: |
| 234 | + |
| 235 | +How do I select PyQt5 or PySide2? |
| 236 | +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 237 | + |
| 238 | +The :envvar:`QT_API` environment variable can be set to either ``pyqt5`` or |
| 239 | +``pyside2`` to use ``PyQt5`` or ``PySide2``, respectively. |
| 240 | + |
| 241 | +Since the default value for the bindings to be used is ``PyQt5``, Matplotlib |
| 242 | +first tries to import it. If the import fails, it tries to import |
| 243 | +``PySide2``. |
| 244 | + |
| 245 | +Using non-builtin backends |
| 246 | +-------------------------- |
| 247 | +More generally, any importable backend can be selected by using any of the |
| 248 | +methods above. If ``name.of.the.backend`` is the module containing the |
| 249 | +backend, use ``module://name.of.the.backend`` as the backend name, e.g. |
| 250 | +``matplotlib.use('module://name.of.the.backend')``. |
0 commit comments