Sie sind auf Seite 1von 32

Three Dimensional Plotting

Learning Objectives
Topics
Understand the
Plotting in 3D: major
anatomy of a 3D plot
differences
Basics of
The meshgrid() function
constructing plots in
to create plaids
3D
3D mesh plots
How to choose
3D surface plots
different plot types
for best effects
shading and light sources
Contour plots
Use of color to add a 4th
dimension

Background
Plotting in 3D and 3D data visualization is where
Matlabs power really becomes apparent!
Matlab defines a number of different kinds of 3D plots
but you will probably find 3 or 4 to be the most useful:

x,y,z 3D line plot: plot3( )


mesh plot: mesh( )
surface plot: surf( )
contour plot: contour( )
combo surface/mesh with contour: surfc( )

The surface plotting can also be applied to create


realistic 3D objects by defining and plotting their exterior
surfaces!
We can only touch lightly on this vast area of Matlab

Anatomy of a 3D Plot
There are MANY options for plotting in 3D but we will
consider only the basics:
Plotting a curve in 3D: plot3(x,y,z)
Plotting a surface, z=f(x,y), in 3D: mesh( ) & surf( )
There are also several other plotting topics that we will NOT
cover or discuss in class (but you might find interesting to
explore on your own):
ribbon plots
quiver plots (showing vectors)
volume plots
advanced colormap use

2D Plots vs 3D Line Plots


Actually, every 2D plot is simply a 3D plot without the
3rd dimension being specified.
>> clf
>> x=0:0.1:2.*pi;
>> plot(x,sin(x))

Rotate 3D button: experiment with how it works

3D Line Plot
This is the simplest (and least useful) 3D plot and is
really just a generalization of the 2D function:

z-axis
z-axis

11
00

>>
>>
>>
>>
>>
>>
>>
>>
>>
>>

x=0:0.1:3.*pi;
-1-1
11
z1=sin(x);
z2=sin(2.*x);
0.5
0.5
z3=sin(3.*x);
00 0
y-axis
y1=zeros(size(x));
0
y-axis
y3=ones(size(x));
y2=y3./2;
plot3(x,y1,z1,'r',x,y2,z2,'b',x,y3,z3,'g')
grid on
xlabel('x-axis'), ylabel('y-axis'), zlabel('z-axis')

55
x-axis
x-axis

10
10

3D Line Plot (2)


These examples may be a little more useful
>>
>>
>>
>>
>>
>>
>>
>>
>>

>> theta=0:0.1:10.*pi;
>> plot3(sin(theta),cos(theta),theta)
>> grid on
theta=0:0.1:10.*pi;
>> plot3(sin(theta),cos(theta),theta)
>> grid on
40

clf
turns=40.*pi;
theta=linspace(0,turns,4000);
x=cos(theta).*(turns-theta)./turns;
y=sin(theta).*(turns-theta)./turns;
z=theta./turns;
plot3(x,y,z)
grid on
text(0.5,0.5,0.75,'Here is a piece of text!');

Here is a piece of text!

30
20

0.5

10
0
1

0
-1

-1

0
1

0
-1

-1

3D Surface Plots
It is often desirable to plot functions of the form: z=f(x,y)
for each (x,y), we can compute a value for z
this defines a surface in 3D space

If we can define (x,y) at regular intervals, Matlab


provides powerful ways to plot the resulting function as
a mesh or surface in 3D.
The (x,y) values stored in arrays will define a grid of
mesh points through which the surface will be created.
There are tools in Matlab to handle the situation in
which (x,y) are not defined in a grid, but we won't
consider them in this course.
We will look into how colors can be employed to add
the equivalent of a 4th dimension

Defining the (x,y) Values


We need a way to create the range of (x,y) values needed to compute
f(x,y)
This won't work because we need all
values of y for each value of x and vice
versa to evaluate function over entire
region shown
10

z-axis

x =-3

-2

-1

y =-3

-2

-1

z=f(x,y)

This works: corresponding elements of xx & yy contain the


x and y coordinates to be used for f(x,y) at that point

0
-5
-10
2

0
y-axis

-2

0
-2

x-axis

NOTE:
NOTE:
xx
xxvaries
variesalong
alongROWS
ROWSwhile
whileyy
yyvaries
varies
along
COLUMNS
along COLUMNS

xx =-3
-3
-3
-3
-3
-3
-3

-2
-2
-2
-2
-2
-2
-2

-1
-1
-1
-1
-1
-1
-1

0
0
0
0
0
0
0

1
1
1
1
1
1
1

2
2
2
2
2
2
2

3
3
3
3
3
3
3

yy =-3
-3
-2
-2
-1
-1
0
0
1
1
2
2
3
3
z=f(xx,yy)

-3
-2
-1
0
1
2
3

-3
-2
-1
0
1
2
3

-3
-2
-1
0
1
2
3

-3
-2
-1
0
1
2
3

-3
-2
-1
0
1
2
3

The meshgrid() Function


Matlab provides a function to compute these arrays:
>> x=-3.5:3.5;

NOTE #1:
xx varies along ROWS while yy varies
along COLUMNS

>> y=-2.5:2.5;
>> [xx,yy]=meshgrid(x,y)
xx =
-3.5

-2.5

-1.5

-0.5

0.5

1.5

2.5

3.5

-3.5

-2.5

-1.5

-0.5

0.5

1.5

2.5

3.5

-3.5

-2.5

-1.5

-0.5

0.5

1.5

2.5

3.5

-3.5

-2.5

-1.5

-0.5

0.5

1.5

2.5

3.5

-3.5

-2.5

-1.5

-0.5

0.5

1.5

2.5

3.5

-3.5

-2.5

-1.5

-0.5

0.5

1.5

2.5

3.5

NOTE #2:
For any (i, j), the value in xx is the x
coordinate, while the value in yy is the
y coordinate:
xx(3,1) = -3.5
yy(3,1) = -0.5
So (x,y) = (-3.5, -0.5)

yy =
-2.5

-2.5

-2.5

-2.5

-2.5

-2.5

-2.5

-2.5

-1.5

-1.5

-1.5

-1.5

-1.5

-1.5

-1.5

-1.5

-0.5

-0.5

-0.5

-0.5

-0.5

-0.5

-0.5

-0.5

0.5

0.5

0.5

0.5

0.5

0.5

0.5

0.5

1.5

1.5

1.5

1.5

1.5

1.5

1.5

1.5

2.5

2.5

2.5

2.5

2.5

2.5

2.5

2.5

NOTE #3:
Matlab calls these arrays "plaids"
NOTE #4:
We can use array math to efficiently
compute the z values when z=f(x,y)

Simple Example Using meshgrid()


In this case we will plot z = (x2 + y2) over the range
-3 x 3 and -3 y 3
>>
>>
>>
xx

x=-3:3;
y=-3:3;
[xx,yy]=meshgrid(x,y)
=
3
-2
-1
0
-3
-2
-1
0
-3
-2
-1
0
-3
-2
-1
0
-3
-2
-1
0
-3
-2
-1
0
-3
-2
-1
0
yy =
-3
-3
-3
-3
-2
-2
-2
-2
-1
-1
-1
-1
0
0
0
0
1
1
1
1
2
2
2
2
3
3
3
3
>> zz=xx.^2 + yy.^2;
>> mesh(xx,yy,zz)

20

1
1
1
1
1
1
1

2
2
2
2
2
2
2

3
3
3
3
3
3
3

-3
-2
-1
0
1
2
3

-3
-2
-1
0
1
2
3

-3
-2
-1
0
1
2
3

15
10
5
0
4
2
0
-2
-4

NOTE:
Matlab's array instructions make this a
deceptively simple calculation for all
values at once

-4

-2

Calculation of f(x,y)

Calculation of f(x,y) can be tricky depending on exactly how it is


defined over the "plaid" (see MM pg. 384)

Column-wise Calculation of z = f(x,y)


>> nc=length(x); % number of columns in z
>> nr=length(y); % number of rows in z
>> z=zeros(nr,nc); % initialize z (for speed)
>> for k=1:nc
z(:,k) = x(k).^2 + y(:).^2;
end
>> mesh(xx,yy,z)

20
15
10
5
0

NOTE:
It can be very tricky to keep track of
the row and column indices in this kind
of calculation (it appears that the
text in the book is incorrect)

2
0
-2

-2

Calculation of f(x,y) - cont'd


Worst case is that you may have to compute each
element of z explicitly as follows:
Element-by-element Calculation of z = f(x,y)
>> nc=length(x); % number of columns in z
>> nr=length(y); % number of rows in z
>> z=zeros(nr,nc); % initialize z (for speed)
>> for kc=1:nc
for kr=1:nr
z(kr,kc) = x(kc).^2 + y(kr).^2;
end
end
>> mesh( >> mesh(xx,yy,z)

20
15
10
5
0
2

NOTE:
It can be very tricky to keep track of
the row and column indices in this kind
of calculation

0
-2

-2

Key Concepts for z=f(x,y) Plots


3D plotting introduces several key concepts:
Meshes versus Surfaces
Hidden line removal
Pedestals and contours
Color maps and pseudo-coloring
Viewpoints and camera control (advanced!)
Shading and lighting (advanced)

The following figures demonstrate these concepts, but


you are encouraged to check this out in your textbook
(using Matlabs graphic brings out the real fun in using
this powerful software!).

Exploring Hidden Line Removal


This uses an interesting built-in function sphere( )
Hidden lines:
ON: shows white inside mesh
OFF: shows transparent mesh
Fig 26.5a: Opaque

[X,Y,Z] = sphere(12);
subplot(1,2,1);
mesh(X,Y,Z), title('Figure 26.5a: Opaque');
hidden on;
axis square off;
subplot(1,2,2);
mesh(X,Y,Z),title('Figure 26.5b: Transparent');
hidden off;
axis square off;

Fig 26.5b: Transparent

Let's Explore the mesh( ) Function

We'll use peaks( ) to create a z=f(x,y) function that is interesting


and shows off the 3D plotting
Note: you should check help peaks and help mesh and also the
textbook for further details on these functions

>> [x,y,z]=peaks(30);
>> mesh(x,y,z)
5

>> xlabel('x-axis')
>> ylabel('y-axis')
>> zlabel('z-axis')

z-axis

>> axis tight

0
-5
2

Suggestion:
Try using hidden off and
hidden on to see what happens.

0
y-axis

-2

-2

0
x-axis

Exploring meshc Plots


meshc( ) adds a contour plot directly below the mesh
helps visualize the contours
can locate the peaks and dips
>> [x,y,z]=peaks(30);
>> meshc(x,y,z)
>> axis tight

>> ylabel('y-axis')
>> zlabel('z-axis')

Hint::
If you just finished the previous
example, you need only type in the
new meshc( ) command.

z-axis

>> xlabel('x-axis')
0
-5
-10
2
0
y-axis

-2

-2

0
x-axis

Exploring meshz Plots


This special variation allows you to emphasize the zero
plane in the mesh plot

>> [x,y,z]=peaks(30);
>> meshz(x,y,z)

>> axis tight


>> xlabel('x-axis')

>> ylabel('y-axis')
>> zlabel('z-axis')

-5
2
0
-2

-2

Exploring waterfall Plots


This is another variation on the mesh plot and can also
be useful in some special cases

>> [x,y,z]=peaks(30);
>> waterfall(x,y,z)

>> xlabel('x-axis')
>> ylabel('y-axis')

z-axis

>> axis tight

>> zlabel('z-axis')

-5
2
0
y-axis

-2

-2

0
x-axis

Let's Explore the surf( ) Function


So far we have only been able to plot meshes to
represent the surface
can hide hidden lines to clarify the surface shape
still appears as a wireframe-like shape

Matlab provides a function that will fill in the mesh with


facets (surfaces with 3 or 4 corners but not necessarily
plane surfaces)
we'll see that these can produce very realistic appearing
surfaces in 3D
can control appearance of mesh
can change color mapping to reveal other information
can add lighting

Exploring surf Plots (shading faceted)


The basic function uses the default shading faceted
and this shows the mesh:

>> [x,y,z]=peaks(30);

>> axis tight


>> xlabel('x-axis')

z-axis

>> surf(x,y,z)

>> ylabel('y-axis')
>> zlabel('z-axis')

-5
2
0
y-axis

-2

-2

0
x-axis

Exploring surf Plots (shading flat)


shading flat will eliminate the mesh and leave the
facets colored with a constant color value

>> [x,y,z]=peaks(30);
>> surf(x,y,z)
5

>> axis tight


>> xlabel('x-axis')

z-axis

>> shading flat

>> ylabel('y-axis')
>> zlabel('z-axis')

-5
2
0
y-axis

-2

-2

0
x-axis

Exploring surfc Plots (shading interp)

surfc acts much like meshc with a contour plot drawn below the
surface
shading interp interpolates color over each facet

>> [x,y,z]=peaks(30);
>> surfc(x,y,z)
>> shading interp
>> axis tight
>> xlabel('x-axis')
>> ylabel('y-axis')
>> zlabel('z-axis')

NOTE:
shading interp can take time
to execute and the figure may
cause plotting problems

Changing the Viewing Direction

You can change the orientation of the object


Viewing direction: view(az,el) or you can use the rotate3d button
on the view toolbar on the figure window menu
Camera direction: this is best controlled from the camera toolbar on
the figure window menu
z

viewpoint

elev
x
azimuth

view(-45,60)

Adding a Colorbar
You can use the colorbar command to add a color bar
that defines the color used in the plot. Use help
colorbar to find out what the other options are

NOTE:
You should check out the instructions
on how to use the Property Editor and
the tools in the Figure window to
interactively add text and labels to
various parts of this 3D graph.

Using Color as a 4th Dimension

Matlab associates a colormap with each figure window


this is a 3 column array in which columns #1-3 control the Red, Blue &
Green colors (defined using a 0-1 range)
each row defines a specific color
colors are limited by the color display capabilities of the computer
these, along with a few fixed colors, are the colors Matlab will use in the
figure window (each figure window has its own separate colormap)
Matlab predefines a number of useful colormaps

JET, HSV, GRAY, HOT, COOL, BONE, COPPER, PINK, FLAG, PRISM
see help graph3d for more information and other colormaps
use colormap hsv or colormap(hsv) to change
colormap default restores the colormap to default values

use the colorbar command to display the color bar by itself or alongside a
plot (see help)

Using Color as a 4th Dimension (2)

Matlab uses pseudo-color to change the color in a mesh or surf


plot
colors can be based on the z values (default)
you can specify the color variable in mesh() and surf()

Use caxis([cmin cmax]) to define the max and min values


that are mapped to the colormap

>> caxis([-5 5]);

>> caxis([-50 50]);


5

>> colorbar

50

>> colorbar

40
30

20
10

-5

0
-10

-5
2
0
-2

-2

-20
-30

2
-5

0
-2

-2

-40
-50

Using Color as a 4th Dimension (3)


mesh() and surf() can accept a "color" argument
that defines the color used over the plaid.
>> caxis('auto')

>> C=del2(z); % compute Laplacian

>> surf(x,y,z,y)

>> surf(x,y,z,C)

>> axis tight

>> axis tight

>> ylabel('y-axis')

>> colorbar

-5

-5
2
0
y-axis

-2

-2

Here we have used the y


values as the color variable.

Curvature
0.5

0
-2

-2

This shows curvature of the


surface as the color variable.

-0.5

Contour Plots

Matlab provides several functions to draw contours


contour(): draws simple contour map with N intervals
contourf(): draws a contour with filled contours
contour3(): draws a contour map in 3D
[x,y,z]=peaks(30);
contour(x,y,z,10)
colorbar
xlabel('x-axis')
ylabel('y-axis')

NOTE:
See textbook for
other options.
3

[x,y,z]=peaks(30);
contourf(x,y,z,10)
colorbar
xlabel('x-axis')
ylabel('y-axis')
6

4
1

1
y-axis

0
0
-1

y-axis

-1

-2

-2

-4

-2
-2
-4
-3
-3

-2

-1

0
x-axis

-3
-3

-6
-2

-1

0
x-axis

Example

Here is a simple example to illustrate 3D plotting


it is the sinc function (sin(r)/r) where r=radius
we need to add eps to avoid inf when dividing by zero

[xx,yy]=meshgrid(-4.*pi:pi./5:4.*pi);
R=sqrt(xx.^2 + yy.^2)+eps; % radius
zz=sin(R)./R;
surf(xx,yy,zz)
axis tight

Question:
How could you handle a
situation when the data
are not defined on a
regular grid (when the
points are unevenly
spaced)?

Incentives
Here is a sphere with 2 lights added and the shading
adjusted to show the lights (gouraud shading). See if
you can create similar figures!

Now
Nowyou
youreally
reallydon't
don'thave
haveany
anyreason
reason
why
you
can't
produce
outstanding
why you can't produce outstanding
graphics
graphicsfor
forall
allyour
yourreports
reportsand
and
projects!
projects!

Problem Solving

Create a plot of the sinc(R) function shown in a previous slide, but


in this case make the plot region a circular area in the xy plane that
has a radius of 3 (Hint: you will need to create an xy plaid but
computed from a grid defined using polar coordinates.)
Add a circular disk of radius = 3 to the above sinc(R) plot. (Hint:
you can use hold on to add additional surfaces using the surf
command just like you did for plot() ).
Now add a vertical plane (y=0) and a second vertical plane (x=0)
to the plot. This effectively partitions the surface into 8 regions.

Summary
Review questions

Describe 3D plotting in MATLAB,


What is a scalar function in two variables?
What is a plaid? What do they look like?
Describe differences between surface and mesh plot, and all
their variants.
What do the shading, hidden commands do?

Action Items
Review the lecture
Work through the examples
See if you can figure out how to use color