Streamline plots¶
- class sage.plot.streamline_plot.StreamlinePlot(xpos_array, ypos_array, xvec_array, yvec_array, options)[source]¶
Bases:
GraphicPrimitive
Primitive class that initializes the StreamlinePlot graphics type
- get_minmax_data()[source]¶
Return a dictionary with the bounding box data.
EXAMPLES:
sage: x, y = var('x y') 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: d = streamline_plot((.01*x, x+y), (x,10,20), (y,10,20))[0].get_minmax_data() sage: d['xmin'] 10.0 sage: d['ymin'] 10.0
>>> from sage.all import * >>> x, y = var('x y') >>> import numpy # to ensure numpy 2.0 compatibility >>> if int(numpy.version.short_version[Integer(0)]) > Integer(1): ... _ = numpy.set_printoptions(legacy="1.25") >>> d = streamline_plot((RealNumber('.01')*x, x+y), (x,Integer(10),Integer(20)), (y,Integer(10),Integer(20)))[Integer(0)].get_minmax_data() >>> d['xmin'] 10.0 >>> d['ymin'] 10.0
x, y = var('x y') import numpy # to ensure numpy 2.0 compatibility if int(numpy.version.short_version[0]) > 1: _ = numpy.set_printoptions(legacy="1.25") d = streamline_plot((.01*x, x+y), (x,10,20), (y,10,20))[0].get_minmax_data() d['xmin'] d['ymin']
- sage.plot.streamline_plot.streamline_plot(f_g, xrange, yrange, plot_points=20, density=1.0, frame=True, **options)[source]¶
Return a streamline plot in a vector field.
streamline_plot
can take either one or two functions. Consider two variables and .If given two functions
, then this function plots streamlines in the vector field over the specified ranges withxrange
being of , denoted byxvar
below, betweenxmin
andxmax
, andyrange
similarly (see below).streamline_plot((f, g), (xvar, xmin, xmax), (yvar, ymin, ymax))
Similarly, if given one function
, then this function plots streamlines in the slope field over the specified ranges as given above.PLOT OPTIONS:
plot_points
– (default: 200) the minimal number of plot pointsdensity
– float (default: 1.); controls the closeness of streamlinesstart_points
– (optional) list of coordinates of starting points for the streamlines; coordinate pairs can be tuples or lists
EXAMPLES:
Plot some vector fields involving
and :sage: x, y = var('x y') sage: streamline_plot((sin(x), cos(y)), (x,-3,3), (y,-3,3)) Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> x, y = var('x y') >>> streamline_plot((sin(x), cos(y)), (x,-Integer(3),Integer(3)), (y,-Integer(3),Integer(3))) Graphics object consisting of 1 graphics primitive
x, y = var('x y') streamline_plot((sin(x), cos(y)), (x,-3,3), (y,-3,3))
sage: streamline_plot((y, (cos(x)-2) * sin(x)), (x,-pi,pi), (y,-pi,pi)) Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> streamline_plot((y, (cos(x)-Integer(2)) * sin(x)), (x,-pi,pi), (y,-pi,pi)) Graphics object consisting of 1 graphics primitive
streamline_plot((y, (cos(x)-2) * sin(x)), (x,-pi,pi), (y,-pi,pi))
We increase the density of the plot:
sage: streamline_plot((y, (cos(x)-2) * sin(x)), ....: (x,-pi,pi), (y,-pi,pi), density=2) Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> streamline_plot((y, (cos(x)-Integer(2)) * sin(x)), ... (x,-pi,pi), (y,-pi,pi), density=Integer(2)) Graphics object consisting of 1 graphics primitive
streamline_plot((y, (cos(x)-2) * sin(x)), (x,-pi,pi), (y,-pi,pi), density=2)
We ignore function values that are infinite or NaN:
sage: x, y = var('x y') sage: streamline_plot((-x/sqrt(x^2+y^2), -y/sqrt(x^2+y^2)), ....: (x,-10,10), (y,-10,10)) Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> x, y = var('x y') >>> streamline_plot((-x/sqrt(x**Integer(2)+y**Integer(2)), -y/sqrt(x**Integer(2)+y**Integer(2))), ... (x,-Integer(10),Integer(10)), (y,-Integer(10),Integer(10))) Graphics object consisting of 1 graphics primitive
x, y = var('x y') streamline_plot((-x/sqrt(x^2+y^2), -y/sqrt(x^2+y^2)), (x,-10,10), (y,-10,10))
Extra options will get passed on to
show()
, as long as they are valid:sage: streamline_plot((x, y), (x,-2,2), (y,-2,2), xmax=10) Graphics object consisting of 1 graphics primitive sage: streamline_plot((x, y), (x,-2,2), (y,-2,2)).show(xmax=10) # These are equivalent
>>> from sage.all import * >>> streamline_plot((x, y), (x,-Integer(2),Integer(2)), (y,-Integer(2),Integer(2)), xmax=Integer(10)) Graphics object consisting of 1 graphics primitive >>> streamline_plot((x, y), (x,-Integer(2),Integer(2)), (y,-Integer(2),Integer(2))).show(xmax=Integer(10)) # These are equivalent
streamline_plot((x, y), (x,-2,2), (y,-2,2), xmax=10) streamline_plot((x, y), (x,-2,2), (y,-2,2)).show(xmax=10) # These are equivalent
We can also construct streamlines in a slope field:
sage: x, y = var('x y') sage: streamline_plot((x + y) / sqrt(x^2 + y^2), (x,-3,3), (y,-3,3)) Graphics object consisting of 1 graphics primitive
>>> from sage.all import * >>> x, y = var('x y') >>> streamline_plot((x + y) / sqrt(x**Integer(2) + y**Integer(2)), (x,-Integer(3),Integer(3)), (y,-Integer(3),Integer(3))) Graphics object consisting of 1 graphics primitive
x, y = var('x y') streamline_plot((x + y) / sqrt(x^2 + y^2), (x,-3,3), (y,-3,3))
We choose some particular points the streamlines pass through:
sage: pts = [[1, 1], [-2, 2], [1, -3/2]] sage: g = streamline_plot((x + y) / sqrt(x^2 + y^2), ....: (x,-3,3), (y,-3,3), start_points=pts) sage: g += point(pts, color='red') sage: g Graphics object consisting of 2 graphics primitives
>>> from sage.all import * >>> pts = [[Integer(1), Integer(1)], [-Integer(2), Integer(2)], [Integer(1), -Integer(3)/Integer(2)]] >>> g = streamline_plot((x + y) / sqrt(x**Integer(2) + y**Integer(2)), ... (x,-Integer(3),Integer(3)), (y,-Integer(3),Integer(3)), start_points=pts) >>> g += point(pts, color='red') >>> g Graphics object consisting of 2 graphics primitives
pts = [[1, 1], [-2, 2], [1, -3/2]] g = streamline_plot((x + y) / sqrt(x^2 + y^2), (x,-3,3), (y,-3,3), start_points=pts) g += point(pts, color='red') g
Note
Streamlines currently pass close to
start_points
but do not necessarily pass directly through them. That is part of the behavior of matplotlib, not an error on your part.