fsurf
Plot 3-D surface
Syntax
Description
fsurf(
creates a
surface plot of the symbolic expression f
)f(x,y)
over
the default interval [-5 5]
for x
and y
.
fsurf(
plots f
,[xmin xmax
ymin ymax]
)f(x,y)
over the interval [xmin xmax]
for x
and [ymin ymax]
for
y
. The fsurf
function uses
symvar
to order the variables and assign intervals.
fsurf(
plots
the parametric surface funx,funy,funz
)x = x(u,v)
, y =
y(u,v)
, z = z(u,v)
over the interval [-5
5]
for u
and v
.
fsurf(
plots the parametric surface funx,funy,funz
,[uvmin
uvmax]
)x
= x(u,v)
, y = y(u,v)
, z = z(u,v)
over
the interval [uvmin uvmax]
for u
and v
.
fsurf(
plots the parametric surface funx,funy,funz
,[umin
umax vmin vmax]
)x = x(u,v)
, y =
y(u,v)
, z = z(u,v)
over the interval
[umin umax]
for u
and [vmin
vmax]
for v
. The fsurf
function uses
symvar
to order the parametric variables and assign intervals.
fsurf(___,
uses
LineSpec
)LineSpec
to set the line style, marker symbol, and face
color. Use this option after any of the previous input argument
combinations.
fsurf(___,
specifies line
properties using one or more Name,Value
)Name,Value
pair arguments. Use
this option after any of the input argument combinations in the previous
syntaxes.
fsurf(
plots
into the axes with the object ax
,___)ax
instead of the
current axes object gca
.
returns
a function surface object or parameterized function surface object,
depending on the type of surface. Use the object to query and modify
properties of a specific surface. For details, see FunctionSurface Properties and ParameterizedFunctionSurface Properties.fs
= fsurf(___)
Examples
3-D Surface Plot of Symbolic Expression
Plot the input over the default range and .
syms x y fsurf(sin(x)+cos(y))
3-D Surface Plot of Symbolic Function
Plot the real part of over the default range and .
syms f(x,y)
f(x,y) = real(atan(x + i*y));
fsurf(f)
Specify Plotting Interval of Surface Plot
Plot over and by specifying the plotting interval as the second argument of fsurf
.
syms x y f = sin(x) + cos(y); fsurf(f, [-pi pi -5 5])
Parameterized Surface Plot
Plot the parameterized surface
for and .
Improve the plot's appearance by using camlight
.
syms s t r = 2 + sin(7*s + 5*t); x = r*cos(s)*sin(t); y = r*sin(s)*sin(t); z = r*cos(t); fsurf(x, y, z, [0 2*pi 0 pi]) camlight view(46,52)
Surface Plot of Piecewise Expression
Plot the piecewise expression of the Klein bottle
for and .
Show that the Klein bottle has only a one-sided surface.
syms u v; r = @(u) 4 - 2*cos(u); x = piecewise(u <= pi, -4*cos(u)*(1+sin(u)) - r(u)*cos(u)*cos(v),... u > pi, -4*cos(u)*(1+sin(u)) + r(u)*cos(v)); y = r(u)*sin(v); z = piecewise(u <= pi, -14*sin(u) - r(u)*sin(u)*cos(v),... u > pi, -14*sin(u)); h = fsurf(x,y,z, [0 2*pi 0 2*pi]);
Add Title and Axis Labels and Format Ticks
For and from to , plot the 3-D surface . Add a title and axis labels.
Create the x-axis ticks by spanning the x-axis limits at intervals of pi/2
. Convert the axis limits to precise multiples of pi/2
by using round
and get the symbolic tick values in S
. Display these ticks by using the XTick
property. Create x-axis labels by using arrayfun
to apply texlabel
to S
. Display these labels by using the XTickLabel
property. Repeat these steps for the y-axis.
To use LaTeX in plots, see latex
.
syms x y fsurf(y.*sin(x)-x.*cos(y), [-2*pi 2*pi]) title('ysin(x) - xcos(y) for x and y in [-2\pi,2\pi]') xlabel('x') ylabel('y') zlabel('z') ax = gca; S = sym(ax.XLim(1):pi/2:ax.XLim(2)); S = sym(round(vpa(S/pi*2))*pi/2); ax.XTick = double(S); ax.XTickLabel = arrayfun(@texlabel,S,'UniformOutput',false); S = sym(ax.YLim(1):pi/2:ax.YLim(2)); S = sym(round(vpa(S/pi*2))*pi/2); ax.YTick = double(S); ax.YTickLabel = arrayfun(@texlabel,S,'UniformOutput',false);
Line Style and Width for Surface Plot
Plot the parametric surface , , with different line styles for different values of . For , use a dashed line with green dot markers. For , use a LineWidth
of 1
and a green face color. For , turn off the lines by setting EdgeColor
to none
.
syms s t fsurf(s*sin(t),-s*cos(t),t,[-5 5 -5 -2],'--.','MarkerEdgeColor','g') hold on fsurf(s*sin(t),-s*cos(t),t,[-5 5 -2 2],'LineWidth',1,'FaceColor','g') fsurf(s*sin(t),-s*cos(t),t,[-5 5 2 5],'EdgeColor','none')
Modify Surface After Creation
Plot the parametric surface
Specify an output to make fcontour
return the plot object.
syms u v x = exp(-abs(u)/10).*sin(5*abs(v)); y = exp(-abs(u)/10).*cos(5*abs(v)); z = u; fs = fsurf(x,y,z)
fs = ParameterizedFunctionSurface with properties: XFunction: exp(-abs(u)/10)*sin(5*abs(v)) YFunction: exp(-abs(u)/10)*cos(5*abs(v)) ZFunction: u EdgeColor: [0 0 0] LineStyle: '-' FaceColor: 'interp' Show all properties
Change the range of u
to [-30 30]
by using the URange
property of fs
. Set the line color to blue by using the EdgeColor
property and specify white, dot markers by using the Marker
and MarkerEdgeColor
properties.
fs.URange = [-30 30]; fs.EdgeColor = 'b'; fs.Marker = '.'; fs.MarkerEdgeColor = 'w';
Multiple Surface Plots and Transparent Surfaces
Plot multiple surfaces using vector input to fsurf
. Alternatively, use hold on
to plot successively on the same figure. When displaying multiple surfaces on the same figure, transparency is useful. Adjust the transparency of surface plots by using the FaceAlpha
property. FaceAlpha
varies from 0
to 1
, where 0
is full transparency and 1
is no transparency.
Plot the planes and using vector input to fsurf
. Show both planes by making them half transparent using FaceAlpha
.
syms x y h = fsurf([x+y x-y]); h(1).FaceAlpha = 0.5; h(2).FaceAlpha = 0.5; title('Planes (x+y) and (x-y) at half transparency')
Control Resolution of Surface Plot
Control the resolution of a surface plot using the 'MeshDensity'
option. Increasing 'MeshDensity'
can make smoother, more accurate plots while decreasing it can increase plotting speed.
Divide a figure into two using subplot
. In the first subplot, plot the parametric surface , , and . The surface has a large gap. Fix this issue by increasing the 'MeshDensity'
to 40
in the second subplot. fsurf
fills the gap showing that by increasing 'MeshDensity'
you increased the plot's resolution.
syms s t subplot(2,1,1) fsurf(sin(s), cos(s), t/10.*sin(1./s)) view(-172,25) title('Default MeshDensity = 35') subplot(2,1,2) fsurf(sin(s), cos(s), t/10.*sin(1./s),'MeshDensity',40) view(-172,25) title('Increased MeshDensity = 40')
Show Contours Below Surface Plot
Show contours for the surface plot of the expression f
by setting the 'ShowContours'
option to 'on'
.
syms x y f = 3*(1-x)^2*exp(-(x^2)-(y+1)^2)... - 10*(x/5 - x^3 - y^5)*exp(-x^2-y^2)... - 1/3*exp(-(x+1)^2 - y^2); fsurf(f,[-3 3],'ShowContours','on')
Create Animations of Surface Plots
Create animations by changing the displayed expression using
the Function
, XFunction
, YFunction
,
and ZFunction
properties and then by using drawnow
to
update the plot. To export to GIF, see imwrite
.
By varying the variable i from 1 to 3, animate the parametric surface
for -0.1 < u < 0.1 and 0 < v < 1. Increase plotting speed by reducing MeshDensity
to 9
.
syms s t h = fsurf(t.*sin(s), cos(s), sin(1./s), [-0.1 0.1 0 1]); h.MeshDensity = 9; for i=1:0.05:3 h.ZFunction = sin(i./s); drawnow end
Improve Appearance of Surface Plot
Create a symbolic expression f
for the function
Plot the expression f
as a surface. Improve the appearance of the surface plot by using the properties of the handle returned by fsurf
, the lighting properties, and the colormap
.
Create a light by using camlight
. Increase brightness by using brighten
. Remove the lines by setting EdgeColor
to 'none'
. Increase the ambient light using AmbientStrength
. For details, see Lighting, Transparency, and Shading. Turn the axes box on. For the title, convert f
to LaTeX using latex
. Finally, to improve the appearance of the axes ticks, axes labels, and title, set 'Interpreter'
to 'latex'
.
syms x y f = 3*(1-x)^2*exp(-(x^2)-(y+1)^2)... - 10*(x/5 - x^3 - y^5)*exp(-x^2-y^2)... - 1/3*exp(-(x+1)^2 - y^2); h = fsurf(f,[-3 3]); camlight(110,70) brighten(0.6) h.EdgeColor = 'none'; h.AmbientStrength = 0.4; a = gca; a.TickLabelInterpreter = 'latex'; a.Box = 'on'; a.BoxStyle = 'full'; xlabel('$x$','Interpreter','latex') ylabel('$y$','Interpreter','latex') zlabel('$z$','Interpreter','latex') title_latex = ['$' latex(f) '$']; title(title_latex,'Interpreter','latex')
Surface Plot with Bounded Plane
Plot a cylindrical shell bounded below by the plane and above by the plane .
syms r t u fsurf(cos(t),sin(t),u*(cos(t)+2),[0 2*pi 0 1]) hold on;
Add a surface plot of the plane .
fsurf(r*cos(t),r*sin(t),r*cos(t)+2,[0 1 0 2*pi])
Apply Rotation and Translation to Surface Plot
Apply rotation and translation to the surface plot of a torus.
A torus can be defined parametrically by
where
is the polar angle and is the azimuthal angle
is the radius of the tube
is the distance from the center of the tube to the center of the torus
Define the values for and as 1 and 5, respectively. Plot the torus using fsurf
.
syms theta phi a = 1; R = 4; x = (R + a*cos(theta))*cos(phi); y = (R + a*cos(theta))*sin(phi); z = a*sin(theta); fsurf(x,y,z,[0 2*pi 0 2*pi]) hold on
Apply rotation to the torus around the -axis. Define the rotation matrix. Rotate the torus by 90 degrees or radians.
alpha = pi/2; Rx = [1 0 0; 0 cos(alpha) -sin(alpha); 0 sin(alpha) cos(alpha)]; r = [x; y; z]; r_90 = Rx*r;
Shift the center of the torus by 5 along the -axis. Add a second plot of the rotated and translated torus to the existing graph.
fsurf(r_90(1)+5,r_90(2),r_90(3))
axis([-5 10 -5 10 -5 5])
hold off
Input Arguments
Output Arguments
Algorithms
fsurf
assigns the symbolic variables
in f
to the x
axis, then the y
axis,
and symvar
determines the order of the variables to be assigned. Therefore, variable
and axis names might not correspond. To force fsurf
to assign
x or y to its corresponding axis, create the symbolic
function to plot, then pass the symbolic function to fsurf
.
For example, the following code plots f(x,y) = sin(y) in two ways. The first way forces the waves to oscillate with respect to the y axis. The second way assigns y to the x axis because it is the first (and only) variable in the symbolic function.
syms x y; f(x,y) = sin(y); figure; subplot(2,1,1) fsurf(f); subplot(2,1,2) fsurf(f(x,y)); % Or fsurf(sin(y));

Version History
Introduced in R2016a