def point(points, **kwds): """ Return either a 2-dimensional or 3-dimensional point or sum of points. INPUT: - ``points`` - either a single point (as a tuple), a list of points, a single complex number, or a list of complex numbers. For information regarding additional arguments, see either point2d? or point3d?. .. SEEALSO:: :func:`sage.plot.point.point2d`, :func:`sage.plot.plot3d.shapes2.point3d` EXAMPLES:: sage: point((1,2)) Graphics object consisting of 1 graphics primitive :: sage: point((1,2,3)) Graphics3d Object :: sage: point([(0,0), (1,1)]) Graphics object consisting of 1 graphics primitive :: sage: point([(0,0,1), (1,1,1)]) Graphics3d Object Extra options will get passed on to show(), as long as they are valid:: sage: point([(cos(theta), sin(theta)) for theta in srange(0, 2*pi, pi/8)], frame=True) Graphics object consisting of 1 graphics primitive sage: point([(cos(theta), sin(theta)) for theta in srange(0, 2*pi, pi/8)]).show(frame=True) # These are equivalent TESTS: One can now use iterators (:trac:`13890`):: sage: point(iter([(1,1,1)])) Graphics3d Object sage: point(iter([(1,2),(3,5)])) Graphics object consisting of 1 graphics primitive """ if isinstance(points, Iterator): points = list(points) try: return point2d(points, **kwds) except (ValueError, TypeError): from sage.plot.plot3d.shapes2 import point3d return point3d(points, **kwds)
def point(points, **kwds): """ Returns either a 2-dimensional or 3-dimensional point or sum of points. INPUT: - ``points`` - either a single point (as a tuple), a list of points, a single complex number, or a list of complex numbers. For information regarding additional arguments, see either point2d? or point3d?. .. SEEALSO:: :func:`sage.plot.point.point2d`, :func:`sage.plot.plot3d.shapes2.point3d` EXAMPLES:: sage: point((1,2)) Graphics object consisting of 1 graphics primitive :: sage: point((1,2,3)) Graphics3d Object :: sage: point([(0,0), (1,1)]) Graphics object consisting of 1 graphics primitive :: sage: point([(0,0,1), (1,1,1)]) Graphics3d Object Extra options will get passed on to show(), as long as they are valid:: sage: point([(cos(theta), sin(theta)) for theta in srange(0, 2*pi, pi/8)], frame=True) Graphics object consisting of 1 graphics primitive sage: point([(cos(theta), sin(theta)) for theta in srange(0, 2*pi, pi/8)]).show(frame=True) # These are equivalent TESTS: One can now use iterators (:trac:`13890`):: sage: point(iter([(1,1,1)])) Graphics3d Object sage: point(iter([(1,2),(3,5)])) Graphics object consisting of 1 graphics primitive """ if isinstance(points, collections.Iterator): points = list(points) try: return point2d(points, **kwds) except (ValueError, TypeError): from sage.plot.plot3d.shapes2 import point3d return point3d(points, **kwds)
def point(points, **kwds): """ Returns either a 2-dimensional or 3-dimensional point or sum of points. INPUT: - ``points`` - either a single point (as a tuple), a list of points, a single complex number, or a list of complex numbers. For information regarding additional arguments, see either point2d? or point3d?. EXAMPLES:: sage: point((1,2)) Graphics object consisting of 1 graphics primitive :: sage: point((1,2,3)) Graphics3d Object :: sage: point([(0,0), (1,1)]) Graphics object consisting of 1 graphics primitive :: sage: point([(0,0,1), (1,1,1)]) Graphics3d Object Extra options will get passed on to show(), as long as they are valid:: sage: point([(cos(theta), sin(theta)) for theta in srange(0, 2*pi, pi/8)], frame=True) Graphics object consisting of 1 graphics primitive sage: point([(cos(theta), sin(theta)) for theta in srange(0, 2*pi, pi/8)]).show(frame=True) # These are equivalent """ try: return point2d(points, **kwds) except (ValueError, TypeError): from sage.plot.plot3d.shapes2 import point3d return point3d(points, **kwds)
def plot3d(self, z=0, **kwds): """ Plots a two-dimensional point in 3-D, with default height zero. INPUT: - ``z`` - optional 3D height above `xy`-plane. May be a list if self is a list of points. EXAMPLES: One point:: sage: A=point((1,1)) sage: a=A[0];a Point set defined by 1 point(s) sage: b=a.plot3d() One point with a height:: sage: A=point((1,1)) sage: a=A[0];a Point set defined by 1 point(s) sage: b=a.plot3d(z=3) sage: b.loc[2] 3.0 Multiple points:: sage: P=point([(0,0), (1,1)]) sage: p=P[0]; p Point set defined by 2 point(s) sage: q=p.plot3d(size=22) Multiple points with different heights:: sage: P=point([(0,0), (1,1)]) sage: p=P[0] sage: q=p.plot3d(z=[2,3]) sage: q.all[0].loc[2] 2.0 sage: q.all[1].loc[2] 3.0 Note that keywords passed must be valid point3d options:: sage: A=point((1,1),size=22) sage: a=A[0];a Point set defined by 1 point(s) sage: b=a.plot3d() sage: b.size 22 sage: b=a.plot3d(pointsize=23) # only 2D valid option sage: b.size 22 sage: b=a.plot3d(size=23) # correct keyword sage: b.size 23 TESTS: Heights passed as a list should have same length as number of points:: sage: P=point([(0,0), (1,1), (2,3)]) sage: p=P[0] sage: q=p.plot3d(z=2) sage: q.all[1].loc[2] 2.0 sage: q=p.plot3d(z=[2,-2]) Traceback (most recent call last): ... ValueError: Incorrect number of heights given """ from sage.plot.plot3d.base import Graphics3dGroup from sage.plot.plot3d.shapes2 import point3d options = self._plot3d_options() options.update(kwds) zdata = [] if isinstance(z, list): zdata = z else: zdata = [z] * len(self.xdata) if len(zdata) == len(self.xdata): all = [ point3d(list(zip(self.xdata, self.ydata, zdata)), **options) ] if len(all) == 1: return all[0] else: return Graphics3dGroup(all) else: raise ValueError('Incorrect number of heights given')
def plot(self, chart=None, ambient_coords=None, mapping=None, label=None, parameters=None, **kwds): r""" For real manifolds, plot ``self`` in a Cartesian graph based on the coordinates of some ambient chart. The point is drawn in terms of two (2D graphics) or three (3D graphics) coordinates of a given chart, called hereafter the *ambient chart*. The domain of the ambient chart must contain the point, or its image by a continuous manifold map `\Phi`. INPUT: - ``chart`` -- (default: ``None``) the ambient chart (see above); if ``None``, the ambient chart is set the default chart of ``self.parent()`` - ``ambient_coords`` -- (default: ``None``) tuple containing the 2 or 3 coordinates of the ambient chart in terms of which the plot is performed; if ``None``, all the coordinates of the ambient chart are considered - ``mapping`` -- (default: ``None``) :class:`~sage.manifolds.continuous_map.ContinuousMap`; continuous manifold map `\Phi` providing the link between the current point `p` and the ambient chart ``chart``: the domain of ``chart`` must contain `\Phi(p)`; if ``None``, the identity map is assumed - ``label`` -- (default: ``None``) label printed next to the point; if ``None``, the point's name is used - ``parameters`` -- (default: ``None``) dictionary giving the numerical values of the parameters that may appear in the point coordinates - ``size`` -- (default: 10) size of the point once drawn as a small disk or sphere - ``color`` -- (default: ``'black'``) color of the point - ``label_color`` -- (default: ``None``) color to print the label; if ``None``, the value of ``color`` is used - ``fontsize`` -- (default: 10) size of the font used to print the label - ``label_offset`` -- (default: 0.1) determines the separation between the point and its label OUTPUT: - a graphic object, either an instance of :class:`~sage.plot.graphics.Graphics` for a 2D plot (i.e. based on 2 coordinates of the ambient chart) or an instance of :class:`~sage.plot.plot3d.base.Graphics3d` for a 3D plot (i.e. based on 3 coordinates of the ambient chart) EXAMPLES: Drawing a point on a 2-dimensional manifold:: sage: M = Manifold(2, 'M', structure='topological') sage: X.<x,y> = M.chart() sage: p = M.point((1,3), name='p') sage: g = p.plot(X) sage: print(g) Graphics object consisting of 2 graphics primitives sage: gX = X.plot(max_range=4) # plot of the coordinate grid sage: g + gX # display of the point atop the coordinate grid Graphics object consisting of 20 graphics primitives .. PLOT:: M = Manifold(2, 'M', structure='topological') X = M.chart('x y'); x,y = X[:] p = M.point((1,3), name='p') g = p.plot(X) gX = X.plot(max_range=4) sphinx_plot(g+gX) Actually, since ``X`` is the default chart of the open set in which ``p`` has been defined, it can be skipped in the arguments of ``plot``:: sage: g = p.plot() sage: g + gX Graphics object consisting of 20 graphics primitives Call with some options:: sage: g = p.plot(chart=X, size=40, color='green', label='$P$', ....: label_color='blue', fontsize=20, label_offset=0.3) sage: g + gX Graphics object consisting of 20 graphics primitives .. PLOT:: M = Manifold(2, 'M', structure='topological') X = M.chart('x y'); x,y = X[:] p = M.point((1,3), name='p') g = p.plot(chart=X, size=40, color='green', label='$P$', \ label_color='blue', fontsize=20, label_offset=0.3) gX = X.plot(max_range=4) sphinx_plot(g+gX) Use of the ``parameters`` option to set a numerical value of some symbolic variable:: sage: a = var('a') sage: q = M.point((a,2*a), name='q') sage: gq = q.plot(parameters={a:-2}, label_offset=0.2) sage: g + gX + gq Graphics object consisting of 22 graphics primitives .. PLOT:: M = Manifold(2, 'M', structure='topological') X = M.chart('x y'); x,y = X[:] p = M.point((1,3), name='p') g = p.plot(chart=X, size=40, color='green', label='$P$', \ label_color='blue', fontsize=20, label_offset=0.3) var('a') q = M.point((a,2*a), name='q') gq = q.plot(parameters={a:-2}, label_offset=0.2) gX = X.plot(max_range=4) sphinx_plot(g+gX+gq) The numerical value is used only for the plot:: sage: q.coord() (a, 2*a) Drawing a point on a 3-dimensional manifold:: sage: M = Manifold(3, 'M', structure='topological') sage: X.<x,y,z> = M.chart() sage: p = M.point((2,1,3), name='p') sage: g = p.plot() sage: print(g) Graphics3d Object sage: gX = X.plot(nb_values=5) # coordinate mesh cube sage: g + gX # display of the point atop the coordinate mesh Graphics3d Object Call with some options:: sage: g = p.plot(chart=X, size=40, color='green', label='P_1', ....: label_color='blue', fontsize=20, label_offset=0.3) sage: g + gX Graphics3d Object An example of plot via a mapping: plot of a point on a 2-sphere viewed in the 3-dimensional space ``M``:: sage: S2 = Manifold(2, 'S^2', structure='topological') sage: U = S2.open_subset('U') # the open set covered by spherical coord. sage: XS.<th,ph> = U.chart(r'th:(0,pi):\theta ph:(0,2*pi):\phi') sage: p = U.point((pi/4, pi/8), name='p') sage: F = S2.continuous_map(M, {(XS, X): [sin(th)*cos(ph), ....: sin(th)*sin(ph), cos(th)]}, name='F') sage: F.display() F: S^2 --> M on U: (th, ph) |--> (x, y, z) = (cos(ph)*sin(th), sin(ph)*sin(th), cos(th)) sage: g = p.plot(chart=X, mapping=F) sage: gS2 = XS.plot(chart=X, mapping=F, nb_values=9) sage: g + gS2 Graphics3d Object Use of the option ``ambient_coords`` for plots on a 4-dimensional manifold:: sage: M = Manifold(4, 'M', structure='topological') sage: X.<t,x,y,z> = M.chart() sage: p = M.point((1,2,3,4), name='p') sage: g = p.plot(X, ambient_coords=(t,x,y), label_offset=0.4) # the coordinate z is skipped sage: gX = X.plot(X, ambient_coords=(t,x,y), nb_values=5) # long time sage: g + gX # 3D plot # long time Graphics3d Object sage: g = p.plot(X, ambient_coords=(t,y,z), label_offset=0.4) # the coordinate x is skipped sage: gX = X.plot(X, ambient_coords=(t,y,z), nb_values=5) # long time sage: g + gX # 3D plot # long time Graphics3d Object sage: g = p.plot(X, ambient_coords=(y,z), label_offset=0.4) # the coordinates t and x are skipped sage: gX = X.plot(X, ambient_coords=(y,z)) sage: g + gX # 2D plot Graphics object consisting of 20 graphics primitives .. PLOT:: M = Manifold(4, 'M', structure='topological') X = M.chart('t x y z'); t,x,y,z = X[:] p = M.point((1,2,3,4), name='p') g = p.plot(X, ambient_coords=(y,z), label_offset=0.4) gX = X.plot(X, ambient_coords=(y,z)) sphinx_plot(g+gX) """ from sage.plot.point import point2d from sage.plot.text import text from sage.plot.graphics import Graphics from sage.plot.plot3d.shapes2 import point3d, text3d from sage.manifolds.chart import Chart if self._manifold.base_field_type() != "real": raise NotImplementedError( "plot of points on manifolds over fields different" " from the real field is not implemented" ) # The ambient chart: if chart is None: chart = self.parent().default_chart() elif not isinstance(chart, Chart): raise TypeError("the argument 'chart' must be a coordinate chart") # The effective point to be plotted: if mapping is None: eff_point = self else: eff_point = mapping(self) # The coordinates of the ambient chart used for the plot: if ambient_coords is None: ambient_coords = chart[:] elif not isinstance(ambient_coords, tuple): ambient_coords = tuple(ambient_coords) nca = len(ambient_coords) if nca != 2 and nca != 3: raise TypeError("invalid number of ambient coordinates: {}".format(nca)) # Extract the kwds options size = kwds["size"] color = kwds["color"] label_color = kwds["label_color"] fontsize = kwds["fontsize"] label_offset = kwds["label_offset"] # The point coordinates: coords = eff_point.coord(chart) xx = chart[:] xp = [coords[xx.index(c)] for c in ambient_coords] if parameters is not None: xps = [coord.substitute(parameters) for coord in xp] xp = xps xlab = [coord + label_offset for coord in xp] if label_color is None: label_color = color resu = Graphics() if nca == 2: if label is None: label = r"$" + self._latex_name + r"$" resu += point2d(xp, color=color, size=size) + text(label, xlab, fontsize=fontsize, color=label_color) else: if label is None: label = self._name resu += point3d(xp, color=color, size=size) + text3d(label, xlab, fontsize=fontsize, color=label_color) return resu
def plot(self, chart=None, ambient_coords=None, mapping=None, size=10, color='black', label=None, label_color=None, fontsize=10, label_offset=0.1, parameters=None): r""" Plot the current point (``self``) in a Cartesian graph based on the coordinates of some ambient chart. The point is drawn in terms of two (2D graphics) or three (3D graphics) coordinates of a given chart, called hereafter the *ambient chart*. The domain of the ambient chart must contain the point, or its image by a differentiable mapping `\Phi`. INPUT: - ``chart`` -- (default: ``None``) the ambient chart (see above); if ``None``, the ambient chart is set the default chart of ``self.containing_set()`` - ``ambient_coords`` -- (default: ``None``) tuple containing the 2 or 3 coordinates of the ambient chart in terms of which the plot is performed; if ``None``, all the coordinates of the ambient chart are considered - ``mapping`` -- (default: ``None``) differentiable mapping `\Phi` (instance of :class:`~sage.geometry.manifolds.diffmapping.DiffMapping`) providing the link between the point `p` represented by ``self`` and the ambient chart ``chart``: the domain of ``chart`` must contain `\Phi(p)`; if ``None``, the identity mapping is assumed - ``size`` -- (default: 10) size of the point once drawn as a small disk or sphere - ``color`` -- (default: 'black') color of the point - ``label`` -- (default: ``None``) label printed next to the point; if ``None``, the point's name is used. - ``label_color`` -- (default: ``None``) color to print the label; if ``None``, the value of ``color`` is used - ``fontsize`` -- (default: 10) size of the font used to print the label - ``label_offset`` -- (default: 0.1) determines the separation between the point and its label - ``parameters`` -- (default: ``None``) dictionary giving the numerical values of the parameters that may appear in the point coordinates OUTPUT: - a graphic object, either an instance of :class:`~sage.plot.graphics.Graphics` for a 2D plot (i.e. based on 2 coordinates of the ambient chart) or an instance of :class:`~sage.plot.plot3d.base.Graphics3d` for a 3D plot (i.e. based on 3 coordinates of the ambient chart) EXAMPLES: Drawing a point on a 2-dimensional manifold:: sage: M = Manifold(2, 'M') sage: X.<x,y> = M.chart() sage: p = M.point((1,3), name='p') sage: g = p.plot(X) sage: print g Graphics object consisting of 2 graphics primitives sage: gX = X.plot() # plot of the coordinate grid sage: show(g+gX) # display of the point atop the coordinate grid Actually, since ``X`` is the default chart of the open set in which ``p`` has been defined, it can be skipped in the arguments of ``plot``:: sage: g = p.plot() sage: show(g+gX) Call with some options:: sage: g = p.plot(chart=X, size=40, color='green', label='$P$', ....: label_color='blue', fontsize=20, label_offset=0.3) sage: show(g+gX) Use of the ``parameters`` option to set a numerical value of some symbolic variable:: sage: a = var('a') sage: q = M.point((a,2*a), name='q') sage: gq = q.plot(parameters={a:-2}) sage: show(g+gX+gq) The numerical value is used only for the plot:: sage: q.coord() (a, 2*a) Drawing a point on a 3-dimensional manifold:: sage: M = Manifold(3, 'M') sage: X.<x,y,z> = M.chart() sage: p = M.point((2,1,3), name='p') sage: g = p.plot() sage: print g Graphics3d Object sage: gX = X.plot(nb_values=5) # coordinate mesh cube sage: show(g+gX) # display of the point atop the coordinate mesh Call with some options:: sage: g = p.plot(chart=X, size=40, color='green', label='P_1', ....: label_color='blue', fontsize=20, label_offset=0.3) sage: show(g+gX) An example of plot via a differential mapping: plot of a point on a 2-sphere viewed in the 3-dimensional space ``M``:: sage: S2 = Manifold(2, 'S^2') sage: U = S2.open_subset('U') # the open set covered by spherical coord. sage: XS.<th,ph> = U.chart(r'th:(0,pi):\theta ph:(0,2*pi):\phi') sage: p = U.point((pi/4, pi/8), name='p') sage: F = S2.diff_mapping(M, {(XS, X): [sin(th)*cos(ph), ....: sin(th)*sin(ph), cos(th)]}, name='F') sage: F.display() F: S^2 --> M on U: (th, ph) |--> (x, y, z) = (cos(ph)*sin(th), sin(ph)*sin(th), cos(th)) sage: g = p.plot(chart=X, mapping=F) sage: gS2 = XS.plot(chart=X, mapping=F, nb_values=9) sage: show(g+gS2) Use of the option ``ambient_coords`` for plots on a 4-dimensional manifold:: sage: M = Manifold(4, 'M') sage: X.<t,x,y,z> = M.chart() sage: p = M.point((1,2,3,4), name='p') sage: g = p.plot(X, ambient_coords=(t,x,y)) # the coordinate z is skipped sage: gX = X.plot(X, ambient_coords=(t,x,y), nb_values=5) sage: show(g+gX) # 3D plot sage: g = p.plot(X, ambient_coords=(t,y,z)) # the coordinate x is skipped sage: gX = X.plot(X, ambient_coords=(t,y,z), nb_values=5) sage: show(g+gX) # 3D plot sage: g = p.plot(X, ambient_coords=(y,z)) # the coordinates t and x are skipped sage: gX = X.plot(X, ambient_coords=(y,z)) sage: show(g+gX) # 2D plot """ from sage.plot.point import point2d from sage.plot.text import text from sage.plot.graphics import Graphics from sage.plot.plot3d.shapes2 import point3d, text3d from sage.geometry.manifolds.chart import Chart # The ambient chart: if chart is None: chart = self.containing_set().default_chart() elif not isinstance(chart, Chart): raise TypeError("the argument 'chart' must be a coordinate chart") # The effective point to be plotted: if mapping is None: eff_point = self else: eff_point = mapping(self) # The coordinates of the ambient chart used for the plot: if ambient_coords is None: ambient_coords = chart._xx elif not isinstance(ambient_coords, tuple): ambient_coords = tuple(ambient_coords) nca = len(ambient_coords) if nca != 2 and nca != 3: raise TypeError("Bad number of ambient coordinates: " + str(nca)) # The point coordinates: coords = eff_point.coord(chart) xx = chart[:] xp = [coords[xx.index(c)] for c in ambient_coords] if parameters is not None: xps = [coord.substitute(parameters) for coord in xp] xp = xps xlab = [coord + label_offset for coord in xp] if label_color is None: label_color = color resu = Graphics() if nca == 2: if label is None: label = r'$' + self._latex_name + r'$' resu += point2d(xp, color=color, size=size) + \ text(label, xlab, fontsize=fontsize, color=label_color) else: if label is None: label = self._name resu += point3d(xp, color=color, size=size) + \ text3d(label, xlab, fontsize=fontsize, color=label_color) return resu
def plot3d(self, z=0, **kwds): """ Plots a two-dimensional point in 3-D, with default height zero. INPUT: - ``z`` - optional 3D height above `xy`-plane. May be a list if self is a list of points. EXAMPLES: One point:: sage: A=point((1,1)) sage: a=A[0];a Point set defined by 1 point(s) sage: b=a.plot3d() One point with a height:: sage: A=point((1,1)) sage: a=A[0];a Point set defined by 1 point(s) sage: b=a.plot3d(z=3) sage: b.loc[2] 3.0 Multiple points:: sage: P=point([(0,0), (1,1)]) sage: p=P[0]; p Point set defined by 2 point(s) sage: q=p.plot3d(size=22) Multiple points with different heights:: sage: P=point([(0,0), (1,1)]) sage: p=P[0] sage: q=p.plot3d(z=[2,3]) sage: q.all[0].loc[2] 2.0 sage: q.all[1].loc[2] 3.0 Note that keywords passed must be valid point3d options:: sage: A=point((1,1),size=22) sage: a=A[0];a Point set defined by 1 point(s) sage: b=a.plot3d() sage: b.size 22 sage: b=a.plot3d(pointsize=23) # only 2D valid option sage: b.size 22 sage: b=a.plot3d(size=23) # correct keyword sage: b.size 23 TESTS: Heights passed as a list should have same length as number of points:: sage: P=point([(0,0), (1,1), (2,3)]) sage: p=P[0] sage: q=p.plot3d(z=2) sage: q.all[1].loc[2] 2.0 sage: q=p.plot3d(z=[2,-2]) Traceback (most recent call last): ... ValueError: Incorrect number of heights given """ from sage.plot.plot3d.base import Graphics3dGroup from sage.plot.plot3d.shapes2 import point3d options = self._plot3d_options() options.update(kwds) zdata=[] if isinstance(z, list): zdata=z else: zdata=[z]*len(self.xdata) if len(zdata)==len(self.xdata): all = [point3d([(x, y, z) for x, y, z in zip(self.xdata, self.ydata, zdata)], **options)] if len(all) == 1: return all[0] else: return Graphics3dGroup(all) else: raise ValueError('Incorrect number of heights given')
def plot(self, chart=None, ambient_coords=None, mapping=None, label=None, parameters=None, **kwds): r""" For real manifolds, plot ``self`` in a Cartesian graph based on the coordinates of some ambient chart. The point is drawn in terms of two (2D graphics) or three (3D graphics) coordinates of a given chart, called hereafter the *ambient chart*. The domain of the ambient chart must contain the point, or its image by a continuous manifold map `\Phi`. INPUT: - ``chart`` -- (default: ``None``) the ambient chart (see above); if ``None``, the ambient chart is set the default chart of ``self.parent()`` - ``ambient_coords`` -- (default: ``None``) tuple containing the 2 or 3 coordinates of the ambient chart in terms of which the plot is performed; if ``None``, all the coordinates of the ambient chart are considered - ``mapping`` -- (default: ``None``) :class:`~sage.manifolds.continuous_map.ContinuousMap`; continuous manifold map `\Phi` providing the link between the current point `p` and the ambient chart ``chart``: the domain of ``chart`` must contain `\Phi(p)`; if ``None``, the identity map is assumed - ``label`` -- (default: ``None``) label printed next to the point; if ``None``, the point's name is used - ``parameters`` -- (default: ``None``) dictionary giving the numerical values of the parameters that may appear in the point coordinates - ``size`` -- (default: 10) size of the point once drawn as a small disk or sphere - ``color`` -- (default: ``'black'``) color of the point - ``label_color`` -- (default: ``None``) color to print the label; if ``None``, the value of ``color`` is used - ``fontsize`` -- (default: 10) size of the font used to print the label - ``label_offset`` -- (default: 0.1) determines the separation between the point and its label OUTPUT: - a graphic object, either an instance of :class:`~sage.plot.graphics.Graphics` for a 2D plot (i.e. based on 2 coordinates of the ambient chart) or an instance of :class:`~sage.plot.plot3d.base.Graphics3d` for a 3D plot (i.e. based on 3 coordinates of the ambient chart) EXAMPLES: Drawing a point on a 2-dimensional manifold:: sage: M = Manifold(2, 'M', structure='topological') sage: X.<x,y> = M.chart() sage: p = M.point((1,3), name='p') sage: g = p.plot(X) sage: print(g) Graphics object consisting of 2 graphics primitives sage: gX = X.plot(max_range=4) # plot of the coordinate grid sage: g + gX # display of the point atop the coordinate grid Graphics object consisting of 20 graphics primitives .. PLOT:: M = Manifold(2, 'M', structure='topological') X = M.chart('x y'); x,y = X[:] p = M.point((1,3), name='p') g = p.plot(X) gX = X.plot(max_range=4) sphinx_plot(g+gX) Actually, since ``X`` is the default chart of the open set in which ``p`` has been defined, it can be skipped in the arguments of ``plot``:: sage: g = p.plot() sage: g + gX Graphics object consisting of 20 graphics primitives Call with some options:: sage: g = p.plot(chart=X, size=40, color='green', label='$P$', ....: label_color='blue', fontsize=20, label_offset=0.3) sage: g + gX Graphics object consisting of 20 graphics primitives .. PLOT:: M = Manifold(2, 'M', structure='topological') X = M.chart('x y'); x,y = X[:] p = M.point((1,3), name='p') g = p.plot(chart=X, size=40, color='green', label='$P$', \ label_color='blue', fontsize=20, label_offset=0.3) gX = X.plot(max_range=4) sphinx_plot(g+gX) Use of the ``parameters`` option to set a numerical value of some symbolic variable:: sage: a = var('a') sage: q = M.point((a,2*a), name='q') sage: gq = q.plot(parameters={a:-2}, label_offset=0.2) sage: g + gX + gq Graphics object consisting of 22 graphics primitives .. PLOT:: M = Manifold(2, 'M', structure='topological') X = M.chart('x y'); x,y = X[:] p = M.point((1,3), name='p') g = p.plot(chart=X, size=40, color='green', label='$P$', \ label_color='blue', fontsize=20, label_offset=0.3) var('a') q = M.point((a,2*a), name='q') gq = q.plot(parameters={a:-2}, label_offset=0.2) gX = X.plot(max_range=4) sphinx_plot(g+gX+gq) The numerical value is used only for the plot:: sage: q.coord() (a, 2*a) Drawing a point on a 3-dimensional manifold:: sage: M = Manifold(3, 'M', structure='topological') sage: X.<x,y,z> = M.chart() sage: p = M.point((2,1,3), name='p') sage: g = p.plot() sage: print(g) Graphics3d Object sage: gX = X.plot(number_values=5) # coordinate mesh cube sage: g + gX # display of the point atop the coordinate mesh Graphics3d Object Call with some options:: sage: g = p.plot(chart=X, size=40, color='green', label='P_1', ....: label_color='blue', fontsize=20, label_offset=0.3) sage: g + gX Graphics3d Object An example of plot via a mapping: plot of a point on a 2-sphere viewed in the 3-dimensional space ``M``:: sage: S2 = Manifold(2, 'S^2', structure='topological') sage: U = S2.open_subset('U') # the open set covered by spherical coord. sage: XS.<th,ph> = U.chart(r'th:(0,pi):\theta ph:(0,2*pi):\phi') sage: p = U.point((pi/4, pi/8), name='p') sage: F = S2.continuous_map(M, {(XS, X): [sin(th)*cos(ph), ....: sin(th)*sin(ph), cos(th)]}, name='F') sage: F.display() F: S^2 --> M on U: (th, ph) |--> (x, y, z) = (cos(ph)*sin(th), sin(ph)*sin(th), cos(th)) sage: g = p.plot(chart=X, mapping=F) sage: gS2 = XS.plot(chart=X, mapping=F, number_values=9) sage: g + gS2 Graphics3d Object Use of the option ``ambient_coords`` for plots on a 4-dimensional manifold:: sage: M = Manifold(4, 'M', structure='topological') sage: X.<t,x,y,z> = M.chart() sage: p = M.point((1,2,3,4), name='p') sage: g = p.plot(X, ambient_coords=(t,x,y), label_offset=0.4) # the coordinate z is skipped sage: gX = X.plot(X, ambient_coords=(t,x,y), number_values=5) # long time sage: g + gX # 3D plot # long time Graphics3d Object sage: g = p.plot(X, ambient_coords=(t,y,z), label_offset=0.4) # the coordinate x is skipped sage: gX = X.plot(X, ambient_coords=(t,y,z), number_values=5) # long time sage: g + gX # 3D plot # long time Graphics3d Object sage: g = p.plot(X, ambient_coords=(y,z), label_offset=0.4) # the coordinates t and x are skipped sage: gX = X.plot(X, ambient_coords=(y,z)) sage: g + gX # 2D plot Graphics object consisting of 20 graphics primitives .. PLOT:: M = Manifold(4, 'M', structure='topological') X = M.chart('t x y z'); t,x,y,z = X[:] p = M.point((1,2,3,4), name='p') g = p.plot(X, ambient_coords=(y,z), label_offset=0.4) gX = X.plot(X, ambient_coords=(y,z)) sphinx_plot(g+gX) """ from sage.plot.point import point2d from sage.plot.text import text from sage.plot.graphics import Graphics from sage.plot.plot3d.shapes2 import point3d, text3d from sage.manifolds.chart import Chart if self._manifold.base_field_type() != 'real': raise NotImplementedError( 'plot of points on manifolds over fields different' ' from the real field is not implemented') # The ambient chart: if chart is None: chart = self.parent().default_chart() elif not isinstance(chart, Chart): raise TypeError("the argument 'chart' must be a coordinate chart") # The effective point to be plotted: if mapping is None: eff_point = self else: eff_point = mapping(self) # The coordinates of the ambient chart used for the plot: if ambient_coords is None: ambient_coords = chart[:] elif not isinstance(ambient_coords, tuple): ambient_coords = tuple(ambient_coords) nca = len(ambient_coords) if nca != 2 and nca != 3: raise TypeError( "invalid number of ambient coordinates: {}".format(nca)) # Extract the kwds options size = kwds['size'] color = kwds['color'] label_color = kwds['label_color'] fontsize = kwds['fontsize'] label_offset = kwds['label_offset'] # The point coordinates: coords = eff_point.coord(chart) xx = chart[:] xp = [coords[xx.index(c)] for c in ambient_coords] if parameters is not None: xps = [coord.substitute(parameters) for coord in xp] xp = xps xlab = [coord + label_offset for coord in xp] if label_color is None: label_color = color resu = Graphics() if nca == 2: if label is None: label = r'$' + self._latex_name + r'$' resu += (point2d(xp, color=color, size=size) + text(label, xlab, fontsize=fontsize, color=label_color)) else: if label is None: label = self._name resu += (point3d(xp, color=color, size=size) + text3d(label, xlab, fontsize=fontsize, color=label_color)) return resu
def plot(self, chart=None, ambient_coords=None, mapping=None, size=10, color='black', label=None, label_color=None, fontsize=10, label_offset=0.1, parameters=None): r""" Plot the current point (``self``) in a Cartesian graph based on the coordinates of some ambient chart. The point is drawn in terms of two (2D graphics) or three (3D graphics) coordinates of a given chart, called hereafter the *ambient chart*. The domain of the ambient chart must contain the point, or its image by a differentiable mapping `\Phi`. INPUT: - ``chart`` -- (default: ``None``) the ambient chart (see above); if ``None``, the ambient chart is set the default chart of ``self.containing_set()`` - ``ambient_coords`` -- (default: ``None``) tuple containing the 2 or 3 coordinates of the ambient chart in terms of which the plot is performed; if ``None``, all the coordinates of the ambient chart are considered - ``mapping`` -- (default: ``None``) differentiable mapping `\Phi` (instance of :class:`~sage.geometry.manifolds.diffmapping.DiffMapping`) providing the link between the point `p` represented by ``self`` and the ambient chart ``chart``: the domain of ``chart`` must contain `\Phi(p)`; if ``None``, the identity mapping is assumed - ``size`` -- (default: 10) size of the point once drawn as a small disk or sphere - ``color`` -- (default: 'black') color of the point - ``label`` -- (default: ``None``) label printed next to the point; if ``None``, the point's name is used. - ``label_color`` -- (default: ``None``) color to print the label; if ``None``, the value of ``color`` is used - ``fontsize`` -- (default: 10) size of the font used to print the label - ``label_offset`` -- (default: 0.1) determines the separation between the point and its label - ``parameters`` -- (default: ``None``) dictionary giving the numerical values of the parameters that may appear in the point coordinates OUTPUT: - a graphic object, either an instance of :class:`~sage.plot.graphics.Graphics` for a 2D plot (i.e. based on 2 coordinates of the ambient chart) or an instance of :class:`~sage.plot.plot3d.base.Graphics3d` for a 3D plot (i.e. based on 3 coordinates of the ambient chart) EXAMPLES: Drawing a point on a 2-dimensional manifold:: sage: M = Manifold(2, 'M') sage: X.<x,y> = M.chart() sage: p = M.point((1,3), name='p') sage: g = p.plot(X) sage: print g Graphics object consisting of 2 graphics primitives sage: gX = X.plot() # plot of the coordinate grid sage: show(g+gX) # display of the point atop the coordinate grid Actually, since ``X`` is the default chart of the open set in which ``p`` has been defined, it can be skipped in the arguments of ``plot``:: sage: g = p.plot() sage: show(g+gX) Call with some options:: sage: g = p.plot(chart=X, size=40, color='green', label='$P$', ....: label_color='blue', fontsize=20, label_offset=0.3) sage: show(g+gX) Use of the ``parameters`` option to set a numerical value of some symbolic variable:: sage: a = var('a') sage: q = M.point((a,2*a), name='q') sage: gq = q.plot(parameters={a:-2}) sage: show(g+gX+gq) The numerical value is used only for the plot:: sage: q.coord() (a, 2*a) Drawing a point on a 3-dimensional manifold:: sage: M = Manifold(3, 'M') sage: X.<x,y,z> = M.chart() sage: p = M.point((2,1,3), name='p') sage: g = p.plot() sage: print g Graphics3d Object sage: gX = X.plot(nb_values=5) # coordinate mesh cube sage: show(g+gX) # display of the point atop the coordinate mesh Call with some options:: sage: g = p.plot(chart=X, size=40, color='green', label='P_1', ....: label_color='blue', fontsize=20, label_offset=0.3) sage: show(g+gX) An example of plot via a differential mapping: plot of a point on a 2-sphere viewed in the 3-dimensional space ``M``:: sage: S2 = Manifold(2, 'S^2') sage: U = S2.open_subset('U') # the open set covered by spherical coord. sage: XS.<th,ph> = U.chart(r'th:(0,pi):\theta ph:(0,2*pi):\phi') sage: p = U.point((pi/4, pi/8), name='p') sage: F = S2.diff_mapping(M, {(XS, X): [sin(th)*cos(ph), ....: sin(th)*sin(ph), cos(th)]}, name='F') sage: F.display() F: S^2 --> M on U: (th, ph) |--> (x, y, z) = (cos(ph)*sin(th), sin(ph)*sin(th), cos(th)) sage: g = p.plot(chart=X, mapping=F) sage: gS2 = XS.plot(chart=X, mapping=F, nb_values=9) sage: show(g+gS2) Use of the option ``ambient_coords`` for plots on a 4-dimensional manifold:: sage: M = Manifold(4, 'M') sage: X.<t,x,y,z> = M.chart() sage: p = M.point((1,2,3,4), name='p') sage: g = p.plot(X, ambient_coords=(t,x,y)) # the coordinate z is skipped sage: gX = X.plot(X, ambient_coords=(t,x,y), nb_values=5) sage: show(g+gX) # 3D plot sage: g = p.plot(X, ambient_coords=(t,y,z)) # the coordinate x is skipped sage: gX = X.plot(X, ambient_coords=(t,y,z), nb_values=5) sage: show(g+gX) # 3D plot sage: g = p.plot(X, ambient_coords=(y,z)) # the coordinates t and x are skipped sage: gX = X.plot(X, ambient_coords=(y,z)) sage: show(g+gX) # 2D plot """ from sage.plot.point import point2d from sage.plot.text import text from sage.plot.graphics import Graphics from sage.plot.plot3d.shapes2 import point3d, text3d from sage.geometry.manifolds.chart import Chart # The ambient chart: if chart is None: chart = self.containing_set().default_chart() elif not isinstance(chart, Chart): raise TypeError("the argument 'chart' must be a coordinate chart") # The effective point to be plotted: if mapping is None: eff_point = self else: eff_point = mapping(self) # The coordinates of the ambient chart used for the plot: if ambient_coords is None: ambient_coords = chart._xx elif not isinstance(ambient_coords, tuple): ambient_coords = tuple(ambient_coords) nca = len(ambient_coords) if nca != 2 and nca !=3: raise TypeError("Bad number of ambient coordinates: " + str(nca)) # The point coordinates: coords = eff_point.coord(chart) xx = chart[:] xp = [coords[xx.index(c)] for c in ambient_coords] if parameters is not None: xps = [coord.substitute(parameters) for coord in xp] xp = xps xlab = [coord + label_offset for coord in xp] if label_color is None: label_color = color resu = Graphics() if nca == 2: if label is None: label = r'$' + self._latex_name + r'$' resu += point2d(xp, color=color, size=size) + \ text(label, xlab, fontsize=fontsize, color=label_color) else: if label is None: label = self._name resu += point3d(xp, color=color, size=size) + \ text3d(label, xlab, fontsize=fontsize, color=label_color) return resu