how to draw a plane in 3d matplotlib

Matplotlib was initially designed with just two-dimensional plotting in listen. Effectually the fourth dimension of the 1.0 release, some three-dimensional plotting utilities were built on top of Matplotlib's two-dimensional display, and the outcome is a convenient (if somewhat express) ready of tools for three-dimensional data visualization. three-dimensional plots are enabled by importing the mplot3d toolkit, included with the primary Matplotlib installation:

In [1]:

                            from              mpl_toolkits              import              mplot3d            

Once this submodule is imported, a three-dimensional axes can be created by passing the keyword projection='3d' to any of the normal axes creation routines:

In [2]:

                            %              matplotlib              inline              import              numpy              equally              np              import              matplotlib.pyplot              as              plt            

In [3]:

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

With this 3-dimensional axes enabled, we can now plot a variety of 3-dimensional plot types. Three-dimensional plotting is ane of the functionalities that benefits immensely from viewing figures interactively rather than statically in the notebook; call back that to use interactive figures, y'all can use %matplotlib notebook rather than %matplotlib inline when running this code.

3-dimensional Points and Lines¶

The most basic three-dimensional plot is a line or collection of scatter plot created from sets of (ten, y, z) triples. In illustration with the more common 2-dimensional plots discussed earlier, these tin be created using the ax.plot3D and ax.scatter3D functions. The call signature for these is nearly identical to that of their two-dimensional counterparts, so you tin refer to Simple Line Plots and Simple Scatter Plots for more information on controlling the output. Hither we'll plot a trigonometric spiral, forth with some points drawn randomly near the line:

In [iv]:

                                ax                =                plt                .                axes                (                projection                =                '3d'                )                # Data for a 3-dimensional line                zline                =                np                .                linspace                (                0                ,                15                ,                g                )                xline                =                np                .                sin                (                zline                )                yline                =                np                .                cos                (                zline                )                ax                .                plot3D                (                xline                ,                yline                ,                zline                ,                'gray'                )                # Data for three-dimensional scattered points                zdata                =                fifteen                *                np                .                random                .                random                (                100                )                xdata                =                np                .                sin                (                zdata                )                +                0.one                *                np                .                random                .                randn                (                100                )                ydata                =                np                .                cos                (                zdata                )                +                0.1                *                np                .                random                .                randn                (                100                )                ax                .                scatter3D                (                xdata                ,                ydata                ,                zdata                ,                c                =                zdata                ,                cmap                =                'Greens'                );              

Notice that by default, the besprinkle points have their transparency adjusted to give a sense of depth on the page. While the three-dimensional effect is sometimes difficult to come across within a static image, an interactive view tin can pb to some dainty intuition about the layout of the points.

Three-dimensional Contour Plots¶

Analogous to the contour plots we explored in Density and Contour Plots, mplot3d contains tools to create 3-dimensional relief plots using the same inputs. Like two-dimensional ax.contour plots, ax.contour3D requires all the input data to exist in the form of 2-dimensional regular grids, with the Z data evaluated at each indicate. Here we'll prove a 3-dimensional contour diagram of a three-dimensional sinusoidal function:

In [five]:

                            def              f              (              x              ,              y              ):              render              np              .              sin              (              np              .              sqrt              (              10              **              2              +              y              **              2              ))              x              =              np              .              linspace              (              -              6              ,              half-dozen              ,              30              )              y              =              np              .              linspace              (              -              half-dozen              ,              half-dozen              ,              30              )              Ten              ,              Y              =              np              .              meshgrid              (              10              ,              y              )              Z              =              f              (              Ten              ,              Y              )            

In [half-dozen]:

                                fig                =                plt                .                effigy                ()                ax                =                plt                .                axes                (                projection                =                '3d'                )                ax                .                contour3D                (                Ten                ,                Y                ,                Z                ,                50                ,                cmap                =                'binary'                )                ax                .                set_xlabel                (                'x'                )                ax                .                set_ylabel                (                'y'                )                ax                .                set_zlabel                (                'z'                );              

Sometimes the default viewing bending is not optimal, in which case we tin use the view_init method to set the elevation and azimuthal angles. In the following instance, we'll employ an peak of 60 degrees (that is, threescore degrees above the x-y plane) and an azimuth of 35 degrees (that is, rotated 35 degrees counter-clockwise nearly the z-axis):

Out[vii]:

Again, note that this type of rotation can exist accomplished interactively by clicking and dragging when using one of Matplotlib'southward interactive backends.

Wireframes and Surface Plots¶

Ii other types of three-dimensional plots that work on gridded data are wireframes and surface plots. These take a grid of values and project information technology onto the specified three-dimensional surface, and can make the resulting three-dimensional forms quite easy to visualize. Hither's an example of using a wireframe:

In [8]:

                                fig                =                plt                .                figure                ()                ax                =                plt                .                axes                (                project                =                '3d'                )                ax                .                plot_wireframe                (                X                ,                Y                ,                Z                ,                color                =                'black'                )                ax                .                set_title                (                'wireframe'                );              

A surface plot is like a wireframe plot, but each face of the wireframe is a filled polygon. Calculation a colormap to the filled polygons can help perception of the topology of the surface existence visualized:

In [9]:

                                ax                =                plt                .                axes                (                projection                =                '3d'                )                ax                .                plot_surface                (                X                ,                Y                ,                Z                ,                rstride                =                ane                ,                cstride                =                1                ,                cmap                =                'viridis'                ,                edgecolor                =                'none'                )                ax                .                set_title                (                'surface'                );              

Note that though the grid of values for a surface plot needs to be two-dimensional, it need not exist rectilinear. Here is an case of creating a fractional polar grid, which when used with the surface3D plot tin requite us a slice into the function nosotros're visualizing:

In [10]:

                                r                =                np                .                linspace                (                0                ,                six                ,                20                )                theta                =                np                .                linspace                (                -                0.9                *                np                .                pi                ,                0.8                *                np                .                pi                ,                40                )                r                ,                theta                =                np                .                meshgrid                (                r                ,                theta                )                X                =                r                *                np                .                sin                (                theta                )                Y                =                r                *                np                .                cos                (                theta                )                Z                =                f                (                X                ,                Y                )                ax                =                plt                .                axes                (                projection                =                '3d'                )                ax                .                plot_surface                (                X                ,                Y                ,                Z                ,                rstride                =                1                ,                cstride                =                1                ,                cmap                =                'viridis'                ,                edgecolor                =                'none'                );              

Surface Triangulations¶

For some applications, the evenly sampled grids required by the above routines is overly restrictive and inconvenient. In these situations, the triangulation-based plots can exist very useful. What if rather than an fifty-fifty draw from a Cartesian or a polar grid, we instead have a set of random draws?

In [11]:

                            theta              =              ii              *              np              .              pi              *              np              .              random              .              random              (              1000              )              r              =              vi              *              np              .              random              .              random              (              m              )              x              =              np              .              ravel              (              r              *              np              .              sin              (              theta              ))              y              =              np              .              ravel              (              r              *              np              .              cos              (              theta              ))              z              =              f              (              x              ,              y              )            

We could create a scatter plot of the points to become an thought of the surface nosotros're sampling from:

In [12]:

                                ax                =                plt                .                axes                (                project                =                '3d'                )                ax                .                scatter                (                x                ,                y                ,                z                ,                c                =                z                ,                cmap                =                'viridis'                ,                linewidth                =                0.five                );              

This leaves a lot to exist desired. The function that will help us in this example is ax.plot_trisurf, which creates a surface past kickoff finding a prepare of triangles formed between adjacent points (recollect that x, y, and z here are one-dimensional arrays):

In [thirteen]:

                                ax                =                plt                .                axes                (                projection                =                '3d'                )                ax                .                plot_trisurf                (                x                ,                y                ,                z                ,                cmap                =                'viridis'                ,                edgecolor                =                'none'                );              

The outcome is certainly not equally clean equally when it is plotted with a grid, just the flexibility of such a triangulation allows for some really interesting three-dimensional plots. For example, information technology is really possible to plot a three-dimensional Möbius strip using this, as nosotros'll see adjacent.

Example: Visualizing a Möbius strip¶

A Möbius strip is similar to a strip of newspaper glued into a loop with a half-twist. Topologically, it's quite interesting considering despite appearances it has only a single side! Here we will visualize such an object using Matplotlib's three-dimensional tools. The key to creating the Möbius strip is to think about information technology's parametrization: information technology'due south a two-dimensional strip, so we demand ii intrinsic dimensions. Let'south call them $\theta$, which ranges from $0$ to $2\pi$ effectually the loop, and $w$ which ranges from -1 to ane beyond the width of the strip:

In [xiv]:

                            theta              =              np              .              linspace              (              0              ,              2              *              np              .              pi              ,              thirty              )              westward              =              np              .              linspace              (              -              0.25              ,              0.25              ,              8              )              w              ,              theta              =              np              .              meshgrid              (              w              ,              theta              )            

Now from this parametrization, we must determine the (x, y, z) positions of the embedded strip.

Thinking nearly it, we might realize that in that location are ii rotations happening: one is the position of the loop about its center (what nosotros've called $\theta$), while the other is the twisting of the strip about its axis (we'll call this $\phi$). For a Möbius strip, nosotros must have the strip makes half a twist during a full loop, or $\Delta\phi = \Delta\theta/2$.

Now we utilise our recollection of trigonometry to derive the three-dimensional embedding. Nosotros'll ascertain $r$, the altitude of each point from the center, and utilise this to find the embedded $(ten, y, z)$ coordinates:

In [16]:

                            # radius in x-y airplane              r              =              i              +              west              *              np              .              cos              (              phi              )              10              =              np              .              ravel              (              r              *              np              .              cos              (              theta              ))              y              =              np              .              ravel              (              r              *              np              .              sin              (              theta              ))              z              =              np              .              ravel              (              w              *              np              .              sin              (              phi              ))            

Finally, to plot the object, we must make certain the triangulation is right. The all-time way to practise this is to define the triangulation within the underlying parametrization, and then let Matplotlib project this triangulation into the three-dimensional space of the Möbius strip. This tin can exist accomplished as follows:

In [17]:

                                # triangulate in the underlying parametrization                from                matplotlib.tri                import                Triangulation                tri                =                Triangulation                (                np                .                ravel                (                w                ),                np                .                ravel                (                theta                ))                ax                =                plt                .                axes                (                projection                =                '3d'                )                ax                .                plot_trisurf                (                x                ,                y                ,                z                ,                triangles                =                tri                .                triangles                ,                cmap                =                'viridis'                ,                linewidths                =                0.2                );                ax                .                set_xlim                (                -                ane                ,                1                );                ax                .                set_ylim                (                -                ane                ,                1                );                ax                .                set_zlim                (                -                1                ,                ane                );              

Combining all of these techniques, information technology is possible to create and display a wide variety of three-dimensional objects and patterns in Matplotlib.

palmerbrev2001.blogspot.com

Source: https://jakevdp.github.io/PythonDataScienceHandbook/04.12-three-dimensional-plotting.html

0 Response to "how to draw a plane in 3d matplotlib"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel