
    g                     N    d dl mZ d dlmc mc mZ ddgiZ G d d          ZdS )    )import_moduleN)PlotGrid
matplotlibc                   j    e Zd ZdZddddZd Zed             Zed             Zd	 Z	d
 Z
d Zd ZdS )r   a	  This class helps to plot subplots from already created SymPy plots
    in a single figure.

    Examples
    ========

    .. plot::
       :context: close-figs
       :format: doctest
       :include-source: True

        >>> from sympy import symbols
        >>> from sympy.plotting import plot, plot3d, PlotGrid
        >>> x, y = symbols('x, y')
        >>> p1 = plot(x, x**2, x**3, (x, -5, 5))
        >>> p2 = plot((x**2, (x, -6, 6)), (x, (x, -5, 5)))
        >>> p3 = plot(x**3, (x, -5, 5))
        >>> p4 = plot3d(x*y, (x, -5, 5), (y, -5, 5))

    Plotting vertically in a single line:

    .. plot::
       :context: close-figs
       :format: doctest
       :include-source: True

        >>> PlotGrid(2, 1, p1, p2)
        PlotGrid object containing:
        Plot[0]:Plot object containing:
        [0]: cartesian line: x for x over (-5.0, 5.0)
        [1]: cartesian line: x**2 for x over (-5.0, 5.0)
        [2]: cartesian line: x**3 for x over (-5.0, 5.0)
        Plot[1]:Plot object containing:
        [0]: cartesian line: x**2 for x over (-6.0, 6.0)
        [1]: cartesian line: x for x over (-5.0, 5.0)

    Plotting horizontally in a single line:

    .. plot::
       :context: close-figs
       :format: doctest
       :include-source: True

        >>> PlotGrid(1, 3, p2, p3, p4)
        PlotGrid object containing:
        Plot[0]:Plot object containing:
        [0]: cartesian line: x**2 for x over (-6.0, 6.0)
        [1]: cartesian line: x for x over (-5.0, 5.0)
        Plot[1]:Plot object containing:
        [0]: cartesian line: x**3 for x over (-5.0, 5.0)
        Plot[2]:Plot object containing:
        [0]: cartesian surface: x*y for x over (-5.0, 5.0) and y over (-5.0, 5.0)

    Plotting in a grid form:

    .. plot::
       :context: close-figs
       :format: doctest
       :include-source: True

        >>> PlotGrid(2, 2, p1, p2, p3, p4)
        PlotGrid object containing:
        Plot[0]:Plot object containing:
        [0]: cartesian line: x for x over (-5.0, 5.0)
        [1]: cartesian line: x**2 for x over (-5.0, 5.0)
        [2]: cartesian line: x**3 for x over (-5.0, 5.0)
        Plot[1]:Plot object containing:
        [0]: cartesian line: x**2 for x over (-6.0, 6.0)
        [1]: cartesian line: x for x over (-5.0, 5.0)
        Plot[2]:Plot object containing:
        [0]: cartesian line: x**3 for x over (-5.0, 5.0)
        Plot[3]:Plot object containing:
        [0]: cartesian surface: x*y for x over (-5.0, 5.0) and y over (-5.0, 5.0)

    TN)showsizec                (   t          ddg didt          f          | _        || _        || _        g | _        d| _        || _        |D ]!}| j                            |j                   "|| _	        |r| j        r| 
                                 dS dS dS )a  
        Parameters
        ==========

        nrows :
            The number of rows that should be in the grid of the
            required subplot.
        ncolumns :
            The number of columns that should be in the grid
            of the required subplot.

        nrows and ncolumns together define the required grid.

        Arguments
        =========

        A list of predefined plot objects entered in a row-wise sequence
        i.e. plot objects which are to be in the top row of the required
        grid are written first, then the second row objects and so on

        Keyword arguments
        =================

        show : Boolean
            The default value is set to ``True``. Set show to ``False`` and
            the function will not display the subplot. The returned instance
            of the ``PlotGrid`` class can then be used to save or display the
            plot by calling the ``save()`` and ``show()`` methods
            respectively.
        size : (float, float), optional
            A tuple in the form (width, height) in inches to specify the size of
            the overall figure. The default value is set to ``None``, meaning
            the size will be set by the default backend.
        r   fromlist)pyplotcmcollectionsz1.1.0)import_kwargsmin_module_versioncatchN)r   RuntimeErrorr   nrowsncolumns_series_figargsappendr   r   )selfr   r   r   r   r   kwargsargs           S/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/plotting/plotgrid.py__init__zPlotGrid.__init__\   s    F (%'F'F'FG&|o? ? ? 
 		 	- 	-CL,,,,	 	DO 	IIKKKKK	 	 	 	    c                    | j         j                            | j        | j                  }i }d}t          | j                  D ]N}t          | j                  D ]7}|t          | j                  k     r| j        |         ||||f         <   |dz  }8O| j        si nd| j        i} | j         j	        j
        di || _        |                                D ]o\  }}t          |j                  dk    r|j        d         j        rddini } | j        j        |fi |}	| j        |_        |	|_        |                                 pd S )Nr      figsize
projection3d )r   gridspecGridSpecr   r   rangelenr   r   r   figurer   itemsr   is_3Dadd_subplot_plotgrid_fig_plotgrid_axprocess_series)
r   gsmappingcijkwspecpcur_axs
             r   _create_figurezPlotGrid._create_figure   sk   _%..tz4=IItz"" 	 	A4=))  s49~~%%(,	!GBq!tH%Q
 y<RRy$)&<1DO*177B77	}} 	 	GD!+.qy>>A+=+=	!" ,><&&)+ *TY*466266F"iAO#AN	 	r   c                 F    | j         s|                                  | j         S N)r   r8   r   s    r   figzPlotGrid.fig   s&    y 	"!!!yr   c                     | S r:   r#   r;   s    r   _backendzPlotGrid._backend   s    r   c                 N    | j         j                            | j                   d S r:   )r   r   closer<   r;   s    r   r@   zPlotGrid.close   s#    $$TX.....r   c                     t           j        r9| j                                         | j        j                                         d S |                                  d S r:   )base_backend_showr<   tight_layoutr   r   r   r@   r;   s    r   r   zPlotGrid.show   sO     	H!!###O"'')))))JJLLLLLr   c                 :    | j                             |           d S r:   )r<   savefig)r   paths     r   savezPlotGrid.save   s    r   c                 n    d t          | j                  D             }dd                    |          z   S )Nc                 >    g | ]\  }}d |z  t          |          z   S )z	Plot[%d]:)str).0r2   plots      r   
<listcomp>z$PlotGrid.__str__.<locals>.<listcomp>   s;     ; ; ;!!T "AoT2 ; ; ;r   zPlotGrid object containing:

)	enumerater   join)r   	plot_strss     r   __str__zPlotGrid.__str__   sC    ; ;%.ty%9%9; ; ;	 /91E1EEEr   )__name__
__module____qualname____doc__r   r8   propertyr<   r>   r@   r   rH   rS   r#   r   r   r   r      s        J JV 59t / / / / /b  (   X
   X/ / /    F F F F Fr   r   )sympy.externalr   $sympy.plotting.backends.base_backendplottingbackendsrB   __doctest_requires__r   r#   r   r   <module>r^      s    ( ( ( ( ( ( ; ; ; ; ; ; ; ; ; ; ; ; L> 
lF lF lF lF lF lF lF lF lF lFr   