def plot(self): """ Plot the lattice polygon. OUTPUT: A graphics object. EXAMPLES:: sage: from sage.geometry.polyhedron.ppl_lattice_polytope import LatticePolytope_PPL sage: P = LatticePolytope_PPL((1,0), (0,1), (0,0), (2,2)) sage: P.plot() Graphics object consisting of 6 graphics primitives sage: LatticePolytope_PPL([0], [1]).plot() Graphics object consisting of 3 graphics primitives sage: LatticePolytope_PPL([0]).plot() Graphics object consisting of 2 graphics primitives """ from sage.plot.point import point2d from sage.plot.polygon import polygon2d vertices = self.ordered_vertices() points = self.integral_points() if self.space_dimension() == 1: vertices = [vector(ZZ, (v[0], 0)) for v in vertices] points = [vector(ZZ, (p[0], 0)) for p in points] point_plot = sum(point2d(p, pointsize=100, color='red') for p in points) polygon_plot = polygon2d(vertices, alpha=0.2, color='green', zorder=-1, thickness=2) return polygon_plot + point_plot
def plot(self): """ Plot the lattice polygon. OUTPUT: A graphics object. EXAMPLES:: sage: from sage.geometry.polyhedron.ppl_lattice_polytope import LatticePolytope_PPL sage: P = LatticePolytope_PPL((1,0), (0,1), (0,0), (2,2)) sage: P.plot() Graphics object consisting of 6 graphics primitives sage: LatticePolytope_PPL([0], [1]).plot() Graphics object consisting of 3 graphics primitives sage: LatticePolytope_PPL([0]).plot() Graphics object consisting of 2 graphics primitives """ from sage.plot.point import point2d from sage.plot.polygon import polygon2d vertices = self.ordered_vertices() points = self.integral_points() if self.space_dimension() == 1: vertices = [vector(ZZ, (v[0], 0)) for v in vertices] points = [vector(ZZ, (p[0], 0)) for p in points] point_plot = sum( point2d(p, pointsize=100, color='red') for p in points) polygon_plot = polygon2d(vertices, alpha=0.2, color='green', zorder=-1, thickness=2) return polygon_plot + point_plot
def plot(self, **options): r""" Plot the point (which might involve drawing several dots). The options are passed to point2d. If no "zorder" option is provided then we set "zorder" to 50. """ if "zorder" not in options: options["zorder"]=50 return point2d(points=self.points(), **options)
def plot(self, translation=None): r""" Plot the polygon with the origin at ``translation``. """ from sage.plot.point import point2d from sage.plot.line import line2d from sage.plot.polygon import polygon2d from sage.modules.free_module import VectorSpace V = VectorSpace(RR,2) P = self.vertices(translation) return point2d(P, color='red') + line2d(P + (P[0],), color='orange') + polygon2d(P, alpha=0.3)
def plot_points(self, points, **options): r""" Plot the points in the given collection of points. The options are passed to point2d. If no "zorder" option is provided then we set "zorder" to 50. By default coordinates are taken in the underlying surface. Call with coordinates="graphical" to use graphical coordinates instead. """ if "zorder" not in options: options["zorder"]=50 if "coordinates" not in options: points2 = [self.transform(point) for point in points] elif options["coordinates"]=="graphical": points2=[V(point) for point in points] del options["coordinates"] else: raise ValueError("Invalid value of 'coordinates' option") return point2d(points=points2, **options)
def plot_points(self, points, **options): r""" Plot the points in the given collection of points. The options are passed to point2d. If no "zorder" option is provided then we set "zorder" to 50. By default coordinates are taken in the underlying surface. Call with coordinates="graphical" to use graphical coordinates instead. """ if "zorder" not in options: options["zorder"] = 50 if "coordinates" not in options: points2 = [self.transform(point) for point in points] elif options["coordinates"] == "graphical": points2 = [V(point) for point in points] del options["coordinates"] else: raise ValueError("Invalid value of 'coordinates' option") return point2d(points=points2, **options)
def make_chart(self, region=None): G = Graphics() smin, smax, nmin, nmax = [], [], [], [] for d in self.chartgens(region): x, y = self.get_coords(d) G += point2d((x, y), zorder=10) smin.append(y) smax.append(y) nmin.append(x) nmax.append(x) smin = [ min(smin), ] smax = [ max(smax), ] nmin = [ min(nmin), ] nmax = [ max(nmax), ] for l in self.chartlines(): try: pts, lineargs = self.lineinfo[l["line"]] x1, y1 = self.get_coords(self.geninfo(int(l["src"]))) x2, y2 = self.get_coords(self.geninfo(int(l["tar"]))) G += line2d([(x1, y1), (x2, y2)], **lineargs) except: print("line not understood:", l) off = 0.5 G.ymin(smin[0] - off) G.ymax(smax[0] + off) G.xmin(nmin[0] - off) G.xmax(nmax[0] + off) return G
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 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