Primitive class for the contour plot graphics type. See contour_plot? for help actually doing contour plots.
INPUT:
EXAMPLES:
Note this should normally be used indirectly via contour_plot:
sage: from sage.plot.contour_plot import ContourPlot
sage: C = ContourPlot([[1,3],[2,4]],(1,2),(2,3),options={})
sage: C
ContourPlot defined by a 2 x 2 data grid
sage: C.xrange
(1, 2)
TESTS:
We test creating a contour plot:
sage: x,y = var('x,y')
sage: C = contour_plot(x^2-y^3+10*sin(x*y), (x, -4, 4), (y, -4, 4),plot_points=121,cmap='hsv')
Returns a dictionary with the bounding box data.
EXAMPLES:
sage: x,y = var('x,y')
sage: f(x,y) = x^2 + y^2
sage: d = contour_plot(f, (3, 6), (3, 6))[0].get_minmax_data()
sage: d['xmin']
3.0
sage: d['ymin']
3.0
contour_plot takes a function of two variables,
and plots contour lines of the function over the specified
xrange and yrange as demonstrated below.
contour_plot(f, (xmin, xmax), (ymin, ymax), ...)
INPUT:
The following inputs must all be passed in as named parameters:
The following options are to adjust the style and placement of labels, they have no effect if no labels are shown.
EXAMPLES:
Here we plot a simple function of two variables. Note that since the input function is an expression, we need to explicitly declare the variables in 3-tuples for the range:
sage: x,y = var('x,y')
sage: contour_plot(cos(x^2+y^2), (x, -4, 4), (y, -4, 4))
Here we change the ranges and add some options:
sage: x,y = var('x,y')
sage: contour_plot((x^2)*cos(x*y), (x, -10, 5), (y, -5, 5), fill=False, plot_points=150)
An even more complicated plot:
sage: x,y = var('x,y')
sage: contour_plot(sin(x^2 + y^2)*cos(x)*sin(y), (x, -4, 4), (y, -4, 4),plot_points=150)
Some elliptic curves, but with symbolic endpoints. In the first example, the plot is rotated 90 degrees because we switch the variables x,y:
sage: x,y = var('x,y')
sage: contour_plot(y^2 + 1 - x^3 - x, (y,-pi,pi), (x,-pi,pi))
sage: contour_plot(y^2 + 1 - x^3 - x, (x,-pi,pi), (y,-pi,pi))
We can play with the contour levels:
sage: x,y = var('x,y')
sage: f(x,y) = x^2 + y^2
sage: contour_plot(f, (-2, 2), (-2, 2))
sage: contour_plot(f, (-2, 2), (-2, 2), contours=2, cmap=[(1,0,0), (0,1,0), (0,0,1)])
sage: contour_plot(f, (-2, 2), (-2, 2), contours=(0.1, 1.0, 1.2, 1.4), cmap='hsv')
sage: contour_plot(f, (-2, 2), (-2, 2), contours=(1.0,), fill=False, aspect_ratio=1)
sage: contour_plot(x-y^2,(x,-5,5),(y,-3,3),contours=[-4,0,1])
We can change the style of the lines:
sage: contour_plot(f, (-2,2), (-2,2), fill=False, linewidths=10)
sage: contour_plot(f, (-2,2), (-2,2), fill=False, linestyles='dashdot')
sage: contour_plot(x^2-y^2,(x,-3,3),(y,-3,3),contours=[0,1,2,3,4],linewidths=[1,5],linestyles=['solid','dashed'],fill=False)
We can add labels and play with them:
sage: contour_plot(y^2 + 1 - x^3 - x, (x,-pi,pi), (y,-pi,pi), fill=False, cmap='hsv', labels=True)
sage: contour_plot(y^2 + 1 - x^3 - x, (x,-pi,pi), (y,-pi,pi), fill=False, cmap='hsv', labels=True, label_fmt="%1.0f", label_colors='black')
sage: contour_plot(y^2 + 1 - x^3 - x, (x,-pi,pi), (y,-pi,pi), fill=False, cmap='hsv', labels=True, contours=[-4,0,4], label_fmt={-4:"low", 0:"medium", 4: "hi"}, label_colors='black')
sage: contour_plot(y^2 + 1 - x^3 - x, (x,-pi,pi), (y,-pi,pi), fill=False, cmap='hsv', labels=True, label_fontsize=18)
sage: contour_plot(y^2 + 1 - x^3 - x, (x,-pi,pi), (y,-pi,pi), fill=False, cmap='hsv', labels=True, label_inline_spacing=1)
sage: contour_plot(y^2 + 1 - x^3 - x, (x,-pi,pi), (y,-pi,pi), fill=False, cmap='hsv', labels=True, label_inline=False)
If we do not specify fill=False, then the label and line options are ignored:
sage: contour_plot(f, (-2,2), (-2,2), labels=True, linestyles='dashed')
This should plot concentric circles centered at the origin:
sage: x,y = var('x,y')
sage: contour_plot(x^2+y^2-2,(x,-1,1), (y,-1,1)).show(aspect_ratio=1)
Extra options will get passed on to show(), as long as they are valid:
sage: f(x, y) = cos(x) + sin(y)
sage: contour_plot(f, (0, pi), (0, pi), axes=True)
sage: contour_plot(f, (0, pi), (0, pi)).show(axes=True) # These are equivalent
Note that with fill=False and grayscale contours, there is the possibility of confusion between the contours and the axes, so use fill=False together with axes=True with caution:
sage: contour_plot(f, (-pi, pi), (-pi, pi), fill=False, axes=True)
TESTS:
To check that ticket 5221 is fixed, note that this has three curves, not two:
sage: x,y = var('x,y')
sage: contour_plot(x-y^2,(x,-5,5),(y,-3,3),contours=[-4,-2,0], fill=False)
Returns the equation rewritten as a symbolic function to give negative values when True, positive when False.
EXAMPLES:
sage: from sage.plot.contour_plot import equify
sage: var('x, y')
(x, y)
sage: equify(x^2 < 2)
x^2 - 2
sage: equify(x^2 > 2)
-x^2 + 2
sage: equify(x*y > 1)
-x*y + 1
sage: equify(y > 0)
-y
sage: f=equify(lambda x,y: x>y)
sage: f(1,2)
1
sage: f(2,1)
-1
implicit_plot takes a function of two variables,
and plots the curve
over the specified
xrange and yrange as demonstrated below.
implicit_plot(f, (xmin, xmax), (ymin, ymax), ...)
implicit_plot(f, (x, xmin, xmax), (y, ymin, ymax), ...)
INPUT:
The following inputs must all be passed in as named parameters:
.EXAMPLES:
A simple circle with a radius of 2. Note that since the input function is an expression, we need to explicitly declare the variables in 3-tuples for the range:
sage: var("x y")
(x, y)
sage: implicit_plot(x^2+y^2-2, (x,-3,3), (y,-3,3)).show(aspect_ratio=1)
I can do the same thing, but using a callable function so I don’t need to explicitly define the variables in the ranges, and filling the inside:
sage: x,y = var('x,y')
sage: f(x,y) = x^2 + y^2 - 2
sage: implicit_plot(f, (-3, 3), (-3, 3),fill=True).show(aspect_ratio=1)
The same circle but with a different line width:
sage: implicit_plot(f, (-3,3), (-3,3), linewidth=6).show(aspect_ratio=1)
And again the same circle but this time with a dashdot border:
sage: implicit_plot(f, (-3,3), (-3,3), linestyle='dashdot').show(aspect_ratio=1)
You can also plot an equation:
sage: var("x y")
(x, y)
sage: implicit_plot(x^2+y^2 == 2, (x,-3,3), (y,-3,3)).show(aspect_ratio=1)
We can define a level-
approximation of the boundary of the
Mandelbrot set:
sage: def mandel(n):
... c = polygen(CDF, 'c')
... z = 0
... for i in range(n):
... z = z*z + c
... def f(x, y):
... val = z(CDF(x, y))
... return val.norm() - 4
... return f
The first-level approximation is just a circle:
sage: implicit_plot(mandel(1), (-3, 3), (-3, 3)).show(aspect_ratio=1)
A third-level approximation starts to get interesting:
sage: implicit_plot(mandel(3), (-2, 1), (-1.5, 1.5)).show(aspect_ratio=1)
The seventh-level approximation is a degree 64 polynomial, and implicit_plot does a pretty good job on this part of the curve. (plot_points=200 looks even better, but it takes over a second.)
sage: implicit_plot(mandel(7), (-0.3, 0.05), (-1.15, -0.9),plot_points=50).show(aspect_ratio=1)
region_plot takes a boolean function of two variables,
and plots the region where f is True over the specified
xrange and yrange as demonstrated below.
region_plot(f, (xmin, xmax), (ymin, ymax), ...)
INPUT:
If any of these options are specified, the border will be shown as indicated, otherwise it is only implicit (with color incol) as the border of the inside of the region.
- bordercol – a color (default: None), the color of the border ('black' if borderwidth or borderstyle is specified but not bordercol)
EXAMPLES:
Here we plot a simple function of two variables:
sage: x,y = var('x,y')
sage: region_plot(cos(x^2+y^2) <= 0, (x, -3, 3), (y, -3, 3))
Here we play with the colors:
sage: region_plot(x^2+y^3 < 2, (x, -2, 2), (y, -2, 2), incol='lightblue', bordercol='gray')
An even more complicated plot, with dashed borders:
sage: region_plot(sin(x)*sin(y) >= 1/4, (x,-10,10), (y,-10,10), incol='yellow', bordercol='black', borderstyle='dashed', plot_points=250)
A disk centered at the origin:
sage: region_plot(x^2+y^2<1, (x,-1,1), (y,-1,1), aspect_ratio=1)
A plot with more than one condition (all conditions must be true for the statement to be true):
sage: region_plot([x^2+y^2<1, x<y], (x,-2,2), (y,-2,2), aspect_ratio=1)
Since it doesn’t look very good, let’s increase plot_points:
sage: region_plot([x^2+y^2<1, x<y], (x,-2,2), (y,-2,2), plot_points=400, aspect_ratio=1)
To get plots where only one condition needs to be true, use a function:
sage: region_plot(lambda x,y: x^2+y^2<1 or x<y, (x,-2,2), (y,-2,2), aspect_ratio=1)
The first quadrant of the unit circle:
sage: region_plot([y>0, x>0, x^2+y^2<1], (x,-1.1, 1.1), (y,-1.1, 1.1), plot_points = 400, aspect_ratio=1)
Here is another plot, with a huge border:
sage: region_plot(x*(x-1)*(x+1)+y^2<0, (x, -3, 2), (y, -3, 3), incol='lightblue', bordercol='gray', borderwidth=10, plot_points=50)
If we want to keep only the region where x is positive:
sage: region_plot([x*(x-1)*(x+1)+y^2<0, x>-1], (x, -3, 2), (y, -3, 3), incol='lightblue', plot_points=50)
Here we have a cut circle:
sage: region_plot([x^2+y^2<4, x>-1], (x, -2, 2), (y, -2, 2), incol='lightblue', bordercol='gray', plot_points=200, aspect_ratio=1)
The first variable range corresponds to the horizontal axis and the second variable range corresponds to the vertical axis:
sage: s,t=var('s,t')
sage: region_plot(s>0,(t,-2,2),(s,-2,2))
sage: region_plot(s>0,(s,-2,2),(t,-2,2))