
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "gallery/mplot3d/pathpatch3d.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        Click :ref:`here <sphx_glr_download_gallery_mplot3d_pathpatch3d.py>`
        to download the full example code

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_gallery_mplot3d_pathpatch3d.py:


============================
Draw flat objects in 3D plot
============================

Demonstrate using `.pathpatch_2d_to_3d` to 'draw' shapes and text on a 3D plot.

.. GENERATED FROM PYTHON SOURCE LINES 8-71



.. image-sg:: /gallery/mplot3d/images/sphx_glr_pathpatch3d_001.png
   :alt: pathpatch3d
   :srcset: /gallery/mplot3d/images/sphx_glr_pathpatch3d_001.png, /gallery/mplot3d/images/sphx_glr_pathpatch3d_001_2_0x.png 2.0x
   :class: sphx-glr-single-img





.. code-block:: default


    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.patches import Circle, PathPatch
    from matplotlib.text import TextPath
    from matplotlib.transforms import Affine2D
    import mpl_toolkits.mplot3d.art3d as art3d


    def text3d(ax, xyz, s, zdir="z", size=None, angle=0, usetex=False, **kwargs):
        """
        Plots the string *s* on the axes *ax*, with position *xyz*, size *size*,
        and rotation angle *angle*. *zdir* gives the axis which is to be treated as
        the third dimension. *usetex* is a boolean indicating whether the string
        should be run through a LaTeX subprocess or not.  Any additional keyword
        arguments are forwarded to `.transform_path`.

        Note: zdir affects the interpretation of xyz.
        """
        x, y, z = xyz
        if zdir == "y":
            xy1, z1 = (x, z), y
        elif zdir == "x":
            xy1, z1 = (y, z), x
        else:
            xy1, z1 = (x, y), z

        text_path = TextPath((0, 0), s, size=size, usetex=usetex)
        trans = Affine2D().rotate(angle).translate(xy1[0], xy1[1])

        p1 = PathPatch(trans.transform_path(text_path), **kwargs)
        ax.add_patch(p1)
        art3d.pathpatch_2d_to_3d(p1, z=z1, zdir=zdir)


    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')

    # Draw a circle on the x=0 'wall'
    p = Circle((5, 5), 3)
    ax.add_patch(p)
    art3d.pathpatch_2d_to_3d(p, z=0, zdir="x")

    # Manually label the axes
    text3d(ax, (4, -2, 0), "X-axis", zdir="z", size=.5, usetex=False,
           ec="none", fc="k")
    text3d(ax, (12, 4, 0), "Y-axis", zdir="z", size=.5, usetex=False,
           angle=np.pi / 2, ec="none", fc="k")
    text3d(ax, (12, 10, 4), "Z-axis", zdir="y", size=.5, usetex=False,
           angle=np.pi / 2, ec="none", fc="k")

    # Write a Latex formula on the z=0 'floor'
    text3d(ax, (1, 5, 0),
           r"$\displaystyle G_{\mu\nu} + \Lambda g_{\mu\nu} = "
           r"\frac{8\pi G}{c^4} T_{\mu\nu}  $",
           zdir="z", size=1, usetex=True,
           ec="none", fc="k")

    ax.set_xlim(0, 10)
    ax.set_ylim(0, 10)
    ax.set_zlim(0, 10)

    plt.show()


.. _sphx_glr_download_gallery_mplot3d_pathpatch3d.py:


.. only :: html

 .. container:: sphx-glr-footer
    :class: sphx-glr-footer-example



  .. container:: sphx-glr-download sphx-glr-download-python

     :download:`Download Python source code: pathpatch3d.py <pathpatch3d.py>`



  .. container:: sphx-glr-download sphx-glr-download-jupyter

     :download:`Download Jupyter notebook: pathpatch3d.ipynb <pathpatch3d.ipynb>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    Keywords: matplotlib code example, codex, python plot, pyplot
    `Gallery generated by Sphinx-Gallery
    <https://sphinx-gallery.readthedocs.io>`_
