Arrows¶
- class sage.plot.arrow.Arrow(xtail, ytail, xhead, yhead, options)[source]¶
Bases:
GraphicPrimitive
Primitive class that initializes the (line) arrow graphics type.
EXAMPLES:
We create an arrow graphics object, then take the 0th entry in it to get the actual Arrow graphics primitive:
sage: P = arrow((0,1), (2,3))[0] sage: type(P) <class 'sage.plot.arrow.Arrow'> sage: P Arrow from (0.0,1.0) to (2.0,3.0)
>>> from sage.all import * >>> P = arrow((Integer(0),Integer(1)), (Integer(2),Integer(3)))[Integer(0)] >>> type(P) <class 'sage.plot.arrow.Arrow'> >>> P Arrow from (0.0,1.0) to (2.0,3.0)
P = arrow((0,1), (2,3))[0] type(P) P
- get_minmax_data()[source]¶
Return a bounding box for this arrow.
EXAMPLES:
sage: d = arrow((1,1), (5,5)).get_minmax_data() sage: d['xmin'] 1.0 sage: d['xmax'] 5.0
>>> from sage.all import * >>> d = arrow((Integer(1),Integer(1)), (Integer(5),Integer(5))).get_minmax_data() >>> d['xmin'] 1.0 >>> d['xmax'] 5.0
d = arrow((1,1), (5,5)).get_minmax_data() d['xmin'] d['xmax']
- plot3d(ztail=0, zhead=0, **kwds)[source]¶
Take 2D plot and places it in 3D.
EXAMPLES:
sage: A = arrow((0,0),(1,1))[0].plot3d() sage: A.jmol_repr(A.testing_render_params())[0] 'draw line_1 diameter 2 arrow {0.0 0.0 0.0} {1.0 1.0 0.0} '
>>> from sage.all import * >>> A = arrow((Integer(0),Integer(0)),(Integer(1),Integer(1)))[Integer(0)].plot3d() >>> A.jmol_repr(A.testing_render_params())[Integer(0)] 'draw line_1 diameter 2 arrow {0.0 0.0 0.0} {1.0 1.0 0.0} '
A = arrow((0,0),(1,1))[0].plot3d() A.jmol_repr(A.testing_render_params())[0]
Note that we had to index the arrow to get the Arrow graphics primitive. We can also change the height via the
Graphics.plot3d()
method, but only as a whole:sage: A = arrow((0,0),(1,1)).plot3d(3) sage: A.jmol_repr(A.testing_render_params())[0][0] 'draw line_1 diameter 2 arrow {0.0 0.0 3.0} {1.0 1.0 3.0} '
>>> from sage.all import * >>> A = arrow((Integer(0),Integer(0)),(Integer(1),Integer(1))).plot3d(Integer(3)) >>> A.jmol_repr(A.testing_render_params())[Integer(0)][Integer(0)] 'draw line_1 diameter 2 arrow {0.0 0.0 3.0} {1.0 1.0 3.0} '
A = arrow((0,0),(1,1)).plot3d(3) A.jmol_repr(A.testing_render_params())[0][0]
Optional arguments place both the head and tail outside the \(xy\)-plane, but at different heights. This must be done on the graphics primitive obtained by indexing:
sage: A=arrow((0,0),(1,1))[0].plot3d(3,4) sage: A.jmol_repr(A.testing_render_params())[0] 'draw line_1 diameter 2 arrow {0.0 0.0 3.0} {1.0 1.0 4.0} '
>>> from sage.all import * >>> A=arrow((Integer(0),Integer(0)),(Integer(1),Integer(1)))[Integer(0)].plot3d(Integer(3),Integer(4)) >>> A.jmol_repr(A.testing_render_params())[Integer(0)] 'draw line_1 diameter 2 arrow {0.0 0.0 3.0} {1.0 1.0 4.0} '
A=arrow((0,0),(1,1))[0].plot3d(3,4) A.jmol_repr(A.testing_render_params())[0]
- class sage.plot.arrow.CurveArrow(path, options)[source]¶
Bases:
GraphicPrimitive
Return an arrow graphics primitive along the provided path (bezier curve).
EXAMPLES:
sage: from sage.plot.arrow import CurveArrow sage: b = CurveArrow(path=[[(0,0),(.5,.5),(1,0)],[(.5,1),(0,0)]], ....: options={}) sage: b CurveArrow from (0, 0) to (0, 0)
>>> from sage.all import * >>> from sage.plot.arrow import CurveArrow >>> b = CurveArrow(path=[[(Integer(0),Integer(0)),(RealNumber('.5'),RealNumber('.5')),(Integer(1),Integer(0))],[(RealNumber('.5'),Integer(1)),(Integer(0),Integer(0))]], ... options={}) >>> b CurveArrow from (0, 0) to (0, 0)
from sage.plot.arrow import CurveArrow b = CurveArrow(path=[[(0,0),(.5,.5),(1,0)],[(.5,1),(0,0)]], options={}) b
- get_minmax_data()[source]¶
Return a dictionary with the bounding box data.
EXAMPLES:
sage: import numpy # to ensure numpy 2.0 compatibility sage: if int(numpy.version.short_version[0]) > 1: ....: numpy.set_printoptions(legacy="1.25") sage: from sage.plot.arrow import CurveArrow sage: b = CurveArrow(path=[[(0,0),(.5,.5),(1,0)],[(.5,1),(0,0)]], ....: options={}) sage: d = b.get_minmax_data() sage: d['xmin'] 0.0 sage: d['xmax'] 1.0
>>> from sage.all import * >>> import numpy # to ensure numpy 2.0 compatibility >>> if int(numpy.version.short_version[Integer(0)]) > Integer(1): ... numpy.set_printoptions(legacy="1.25") >>> from sage.plot.arrow import CurveArrow >>> b = CurveArrow(path=[[(Integer(0),Integer(0)),(RealNumber('.5'),RealNumber('.5')),(Integer(1),Integer(0))],[(RealNumber('.5'),Integer(1)),(Integer(0),Integer(0))]], ... options={}) >>> d = b.get_minmax_data() >>> d['xmin'] 0.0 >>> d['xmax'] 1.0
import numpy # to ensure numpy 2.0 compatibility if int(numpy.version.short_version[0]) > 1: numpy.set_printoptions(legacy="1.25") from sage.plot.arrow import CurveArrow b = CurveArrow(path=[[(0,0),(.5,.5),(1,0)],[(.5,1),(0,0)]], options={}) d = b.get_minmax_data() d['xmin'] d['xmax']
- sage.plot.arrow.arrow(tailpoint=None, headpoint=None, **kwds)[source]¶
Return either a 2-dimensional or 3-dimensional arrow depending on value of points.
For information regarding additional arguments, see either arrow2d? or arrow3d?.
EXAMPLES:
sage: arrow((0,0), (1,1)) Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> arrow((Integer(0),Integer(0)), (Integer(1),Integer(1))) Graphics object consisting of 1 graphics primitive
arrow((0,0), (1,1))
sage: arrow((0,0,1), (1,1,1)) Graphics3d Object
>>> from sage.all import * >>> arrow((Integer(0),Integer(0),Integer(1)), (Integer(1),Integer(1),Integer(1))) Graphics3d Object
arrow((0,0,1), (1,1,1))
- sage.plot.arrow.arrow2d(tailpoint=None, headpoint=None, path=None, width=2, rgbcolor=(0, 0, 1), zorder=2, head=1, linestyle='solid', legend_label=None, legend_color=None, **options)[source]¶
If
tailpoint
andheadpoint
are provided, returns an arrow from (xtail, ytail) to (xhead, yhead). Iftailpoint
orheadpoint
is None andpath
is not None, returns an arrow along the path. (See further info on paths inbezier_path
).INPUT:
tailpoint
– the starting point of the arrowheadpoint
– where the arrow is pointing topath
– the list of points and control points (see bezier_path for detail) that the arrow will follow from source to destinationhead
– 0, 1 or 2, whether to draw the head at the start (0), end (1) or both (2) of the path (using 0 will swap headpoint and tailpoint). This is ignored in 3D plotting.linestyle
– (default:'solid'
) the style of the line, which is one of'dashed'
,'dotted'
,'solid'
,'dashdot'
, or'--'
,':'
,'-'
,'-.'
, respectivelywidth
– (default: 2) the width of the arrow shaft, in pointscolor
– (default: (0,0,1)) the color of the arrow (as an RGB tuple or a string)hue
– the color of the arrow (as a number)arrowsize
– the size of the arrowheadarrowshorten
– the length in points to shorten the arrow (ignored if using path parameter)legend_label
– the label for this item in the legendlegend_color
– the color for the legend labelzorder
– the layer level to draw the arrow– note that this is ignored in 3D plotting
EXAMPLES:
A straight, blue arrow:
sage: arrow2d((1,1), (3,3)) Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> arrow2d((Integer(1),Integer(1)), (Integer(3),Integer(3))) Graphics object consisting of 1 graphics primitive
arrow2d((1,1), (3,3))
Make a red arrow:
sage: arrow2d((-1,-1), (2,3), color=(1,0,0)) Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> arrow2d((-Integer(1),-Integer(1)), (Integer(2),Integer(3)), color=(Integer(1),Integer(0),Integer(0))) Graphics object consisting of 1 graphics primitive
arrow2d((-1,-1), (2,3), color=(1,0,0))
sage: arrow2d((-1,-1), (2,3), color='red') Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> arrow2d((-Integer(1),-Integer(1)), (Integer(2),Integer(3)), color='red') Graphics object consisting of 1 graphics primitive
arrow2d((-1,-1), (2,3), color='red')
You can change the width of an arrow:
sage: arrow2d((1,1), (3,3), width=5, arrowsize=15) Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> arrow2d((Integer(1),Integer(1)), (Integer(3),Integer(3)), width=Integer(5), arrowsize=Integer(15)) Graphics object consisting of 1 graphics primitive
arrow2d((1,1), (3,3), width=5, arrowsize=15)
Use a dashed line instead of a solid one for the arrow:
sage: arrow2d((1,1), (3,3), linestyle='dashed') Graphics object consisting of 1 graphics primitive sage: arrow2d((1,1), (3,3), linestyle='--') Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> arrow2d((Integer(1),Integer(1)), (Integer(3),Integer(3)), linestyle='dashed') Graphics object consisting of 1 graphics primitive >>> arrow2d((Integer(1),Integer(1)), (Integer(3),Integer(3)), linestyle='--') Graphics object consisting of 1 graphics primitive
arrow2d((1,1), (3,3), linestyle='dashed') arrow2d((1,1), (3,3), linestyle='--')
A pretty circle of arrows:
sage: sum(arrow2d((0,0), (cos(x),sin(x)), hue=x/(2*pi)) # needs sage.symbolic ....: for x in [0..2*pi, step=0.1]) Graphics object consisting of 63 graphics primitives
>>> from sage.all import * >>> sum(arrow2d((Integer(0),Integer(0)), (cos(x),sin(x)), hue=x/(Integer(2)*pi)) # needs sage.symbolic ... for x in (ellipsis_range(Integer(0),Ellipsis,Integer(2)*pi, step=RealNumber('0.1')))) Graphics object consisting of 63 graphics primitives
sum(arrow2d((0,0), (cos(x),sin(x)), hue=x/(2*pi)) # needs sage.symbolic for x in [0..2*pi, step=0.1])
If we want to draw the arrow between objects, for example, the boundaries of two lines, we can use the
arrowshorten
option to make the arrow shorter by a certain number of points:sage: L1 = line([(0,0), (1,0)], thickness=10) sage: L2 = line([(0,1), (1,1)], thickness=10) sage: A = arrow2d((0.5,0), (0.5,1), arrowshorten=10, rgbcolor=(1,0,0)) sage: L1 + L2 + A Graphics object consisting of 3 graphics primitives
>>> from sage.all import * >>> L1 = line([(Integer(0),Integer(0)), (Integer(1),Integer(0))], thickness=Integer(10)) >>> L2 = line([(Integer(0),Integer(1)), (Integer(1),Integer(1))], thickness=Integer(10)) >>> A = arrow2d((RealNumber('0.5'),Integer(0)), (RealNumber('0.5'),Integer(1)), arrowshorten=Integer(10), rgbcolor=(Integer(1),Integer(0),Integer(0))) >>> L1 + L2 + A Graphics object consisting of 3 graphics primitives
L1 = line([(0,0), (1,0)], thickness=10) L2 = line([(0,1), (1,1)], thickness=10) A = arrow2d((0.5,0), (0.5,1), arrowshorten=10, rgbcolor=(1,0,0)) L1 + L2 + A
If BOTH
headpoint
andtailpoint
are None, then an empty plot is returned:sage: arrow2d(headpoint=None, tailpoint=None) Graphics object consisting of 0 graphics primitives
>>> from sage.all import * >>> arrow2d(headpoint=None, tailpoint=None) Graphics object consisting of 0 graphics primitives
arrow2d(headpoint=None, tailpoint=None)
We can also draw an arrow with a legend:
sage: arrow((0,0), (0,2), legend_label='up', legend_color='purple') Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> arrow((Integer(0),Integer(0)), (Integer(0),Integer(2)), legend_label='up', legend_color='purple') Graphics object consisting of 1 graphics primitive
arrow((0,0), (0,2), legend_label='up', legend_color='purple')
Extra options will get passed on to
Graphics.show()
, as long as they are valid:sage: arrow2d((-2,2), (7,1), frame=True) Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> arrow2d((-Integer(2),Integer(2)), (Integer(7),Integer(1)), frame=True) Graphics object consisting of 1 graphics primitive
arrow2d((-2,2), (7,1), frame=True)
sage: arrow2d((-2,2), (7,1)).show(frame=True)
>>> from sage.all import * >>> arrow2d((-Integer(2),Integer(2)), (Integer(7),Integer(1))).show(frame=True)
arrow2d((-2,2), (7,1)).show(frame=True)