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 finalize(self, G): r""" Finalize a root system plot. INPUT: - ``G`` -- a root system plot or ``0`` This sets the aspect ratio to 1 and remove the axes. This should be called by all the user-level plotting methods of root systems. This will become mostly obsolete when customization options won't be lost anymore upon addition of graphics objects and there will be a proper empty object for 2D and 3D plots. EXAMPLES:: sage: L = RootSystem(["B",2,1]).ambient_space() sage: options = L.plot_parse_options() sage: p = L.plot_roots(plot_options=options) sage: p += L.plot_coroots(plot_options=options) sage: p.axes() True sage: p = options.finalize(p) sage: p.axes() False sage: p.aspect_ratio() 1.0 sage: options = L.plot_parse_options(affine=False) sage: p = L.plot_roots(plot_options=options) sage: p += point([[1,1,0]]) sage: p = options.finalize(p) sage: p.aspect_ratio() [1.0, 1.0, 1.0] If the input is ``0``, this returns an empty graphics object:: sage: type(options.finalize(0)) <class 'sage.plot.plot3d.base.Graphics3dGroup'> sage: options = L.plot_parse_options() sage: type(options.finalize(0)) <class 'sage.plot.graphics.Graphics'> sage: list(options.finalize(0)) [] """ from sage.plot.graphics import Graphics if self.dimension == 2: if G == 0: G = Graphics() G.set_aspect_ratio(1) # TODO: make this customizable G.axes(False) elif self.dimension == 3: if G == 0: from sage.plot.plot3d.base import Graphics3dGroup G = Graphics3dGroup() G.aspect_ratio(1) # TODO: Configuration axes return G