Cornell University
BioNB 441
Using Graphics
Introduction.
Graphics covers a huge area of different techniques. I will attempt to provide examples of all the Matlab high-level graphics functions I have found, as well as some examples of lower level functions. Graphics might be used in neurobiology for:
The following examples will use Matlab base functions (no toolboxes). Each of the examples represents a typical graphics use, but there are many options which are not explained below. Use Matlab help to investigate each of the functions.
Simple x-y plot.
x=0:.1:2*pi; y1=sin(x); y2=cos(x); plot(x,y1,'bx-',x,y2,'r.','linewidth',2);
X-y plot with error bars
x=0:.4:2*pi;
y1=sin(x);
e=.3 .* y1 .* rand(size(x));
errorbar(x,y1,e)
set(findobj('type','line'),'linewidth',2)
Area plot
x=0:.4:2*pi; y1=sin(x); y2=sin(x)/2; area(x',[y1' y2'])
Log-log and semilog plots.
x=0:.1:4; y1=exp(-x)+.01*randn(size(x)); y2=x.^2; figure(1) semilogy(x,y1,'bx-'); figure(2) loglog(x,y2,'ro-')
Histograms and bar charts
clf data=randn(10000,1); hist(data,30) hold on x_fit=-4:.1:4; plot(x_fit, 1000*exp(-(x_fit.^2)/2),'r','linewidth',2)
x=0:.4:2*pi; y1=sin(x); y2=sin(x)/2; figure(1) bar(x',[y1' y2'],2) figure(2) bar(x',[y1' y2'],'stacked')
Simple polar plot
x=0:.1:2*pi; y1=sin(x).^2; y2=cos(x).^2; polar(x,y1,'r-');
Angle histogram
theta=randn(1000,1); rose(theta,30)
Vector plot at origin
x=0:.4:2*pi;
y1=sin(x);
y2=cos(x)+rand(size(x));
compass(y1,y2,'r')
set(findobj('type','line'),'linewidth',2)
2D vector field as arrows
[x,y]=meshgrid(0:.2:1, 0:.2:1.5);
Vx=sin(x);
Vy=cos(x);
quiver(x,y,Vx,Vy)
set(findobj('type','line'),'linewidth',2)
Contour plots, meshes and surfaces
[x,y]=meshgrid(0:.1:3, 0:.1:5);
z= sin(2*x) .* cos(y);
figure(1)
contour(x,y,z,10);
set(findobj('type','patch'),'linewidth',2)
figure(2)
meshc(x,y,z);
set(gca,'color',[.5 .5 .5])
figure(3)
meshz(x,y,z);
set(gca,'color',[.5 .5 .5])
[x,y]=meshgrid(0:.1:3, 0:.1:5); z= sin(2*x) .* cos(y); figure(1) surf(x,y,z); figure(2) h=surfl(x,y,z) colormap(pink) set(h,'edgecolor','none') set(gca,'color',[.5 .5 .5]) figure(3) surfc(x,y,z); set(gca,'color',[.5 .5 .5])
Bar chart
[x,y]=meshgrid(0:6, 0:10); z= sin(x) .* cos(y/2); figure(1) bar3(z);
Simple x-y-z plots
t=0:.01:2*pi; x=1.2*sin(2*t); y=1.2*cos(2*t); z=t/6; plot3(x,y,z, 'linewidth',2) grid on box on axis equal
Isosurface determination of a 3D scalar field
clf r=-1:.05:1; [x,y,z]=meshgrid(r,r,r); w=sqrt(x.^2 + y.^2 + z.^2)+0.02*randn(size(x)); isosurface(w,.5); figure(1) p=patch(isosurface(w,.5)); set(p,'facecolor',[1,1,.5],'edgecolor','none') light daspect([1,1,1]) axis off view(30,30) figure(2) clf w=smooth3(w); p=patch(isosurface(w,.5)); set(p,'facecolor',[1,1,.5],'edgecolor','none') light daspect([1,1,1]) axis off view(30,30)
Streamlines and coneplot of a 3D vector field (and a stereo viewer)
clf
r=-1:.1:1;
[x,y,z]=meshgrid(r,r,r);
%generate a spiral velocity field
ux=5*y;
uy=-5*x;
uz=ones(size(x));
%=======================
subplot(1,2,2)
%make some streamlines
hs=streamline(stream3(x,y,z,ux,uy,uz,...
r,zeros(size(r)),zeros(size(r))));
set(hs,'linewidth',2);
%attach some cones to the streamlines
spacing=30;
for i=1:length(hs)
sx=get(hs(i),'xdata');sx=sx(1:spacing:end);
sy=get(hs(i),'ydata');sy=sy(1:spacing:end);
sz=get(hs(i),'zdata');sz=sz(1:spacing:end);
hc=coneplot(x,y,z,ux,uy,uz,sx,sy,sz,2);
set(hc,'facecolor','red','EdgeColor', 'none')
end
axis([-1 1 -1 1 -1 1])
box on
light('position',[10 10 10])
set(gca,'projection','perspective')
view(30,30)
%positions of the right eye
from=get(gca,'cameraposition');
to=get(gca,'cameratarget');
up=get(gca,'cameraupvector');
ax1=gca;
%===========================
subplot(1,2,1)
%copy the whole data structure to a new axis
copyobj(get(ax1,'children'),gca);
axis([-1 1 -1 1 -1 1])
box on
light('position',[10 10 10])
set(gca,'projection','perspective')
d=.5; %eye spacing
%get the position of the left eye
lefteye=from+d*cross((from-to),up)...
/sqrt(sum((from-to).^2)) ;
set(gca,'cameraposition',lefteye);
A stereo camera.
Draw all the objects you want in a view for the right eye, then copy the objects
into another axis and compute the view for the left eye. Only the computer graphic
camera position changes.
%define a 3D line t=0:.01:2*pi; x=0.9*sin(2*t); y=0.9*cos(2*t); z=t/6; %=========================== subplot(1,2,2) %The right eye plot3(x,y,z, 'linewidth',2) % make the plotted region look nice grid on box on axis([-1 1 -1 1 0 1]) set(gca,'projection','perspective') view(30,30) %positions of the right eye from=get(gca,'cameraposition'); to=get(gca,'cameratarget'); up=get(gca,'cameraupvector'); ax1=gca; %=========================== subplot(1,2,1) %The left eye %copy the whole data structure to a new axis copyobj(get(ax1,'children'),gca); grid on box on axis([-1 1 -1 1 0 1]) set(gca,'projection','perspective') d=.5; %eye spacing %get the position of the left eye lefteye=from+d*cross((from-to),up)... /sqrt(sum((from-to).^2)) ; set(gca,'cameraposition',lefteye);
A hierarchical modeler.
Most of the information for this modeler is on a another
web page. The modeler allows you to construct elaborate 3D models and animate
them. One example image is shown below.
Computing and displaying trajectories.
The program below is a simple simulation of a 'butterfly' randomly searching
for regions of rich food sources. The trajectory is plotted as a series of dots
representing the butterfly. The butterfly has state variables of position and
velocity and is subject to small random accelerations. The butterfly is confined
to a 'cage' by reflective boundary conditions. The food distribution for this
simulation was periodic and is displayed as coutour lines of food density.
clf;
%initial butterfly position
x=0; y=0;
%initial butterfly velocity
vx=0; vy=0;
maxspeed=3;
%time step
dt=.1;
plot(x,y,'.')
s=10
axis([-s s -s s]);
hold on
set(gcf,'doublebuffer','on')
%build a food distribution and contour it
[foodx,foody]=meshgrid(-s:s,-s:s);
foodarray=((sin(foodx/2).^2+sin(foody/2).^2)/2).^4;
contour(foodx, foody, foodarray);
drawnow
for t=1:dt:1000
%assume random accelerations
vx = randn+vx;
vy = randn+vy;
%calculate current food and slow down if
%food is plentiful
food=((sin(x/2).^2+sin(y/2).^2)/2).^4;
vx=vx*(1-food/2);
vy=vy*(1-food/2);
%impose a maximum flying speed
speed=sqrt(vx^2+vy^2);
if speed>maxspeed
vx=vx*maxspeed/speed;
vy=vy*maxspeed/speed;
end
%update positions and check for out-of-cage
%reverse the velocity at the edges
x = x + vx*dt;
y = y + vy*dt;
if x>s | x<-s
vx=-vx;
end
if y>s | y<-s
vy=-vy;
end
plot(x,y,'.');
%text(0,-11,['t=',num2str(t)])
axis([-s s -s s])
drawnow
end