Drawing and animation in Matlab
Mostrar comentarios más antiguos
Hello, I'm sorry for my English, but I hope you will understand me right)
I want to visualize data in Matlab - plot some lines, cycles and other objects according to the matrix. For example:
I have 3 different states, shown in circles, and matrix, which contains the path of these states (See Figure) http://dl.dropbox.com/u/2827213/Stuff/Pics/Scheme_Plot.png How can I plot cycles, pathes and animate it- refresh every time with matrix changing.
I'm sure that there are instruments in Matlab for my purposes, but I can find it. Can you help me?
1 comentario
Paulo Silva
el 25 de Feb. de 2011
is that related to neural networks?
Respuesta aceptada
Más respuestas (4)
Paulo Silva
el 25 de Feb. de 2011
function drawpj
fig=figure;
init
set(fig,'CloseRequestFcn',@my_closefcn)
butt=uicontrol('Style','pushbutton','String','Start',...
'Callback',@drawlines,...
'Units','Normalized','Position',[0.5 0.1 0.1 0.1],...
'Parent',fig);
butt1=uicontrol('Style','pushbutton','String','Clean',...
'Callback',@clean,...
'Units','Normalized','Position',[0.6 0.1 0.1 0.1],...
'Parent',fig);
butt2=uicontrol('Style','pushbutton','String','Demo',...
'Callback',@dem,...
'Units','Normalized','Position',[0.7 0.1 0.1 0.1],...
'Parent',fig);
ed=uicontrol('Style','edit','String','','FontSize',12,...
'Callback',@drawlines,...
'Units','Normalized','Position',[0.4 0.1 0.1 0.1],...
'Parent',fig);
tocheck=uicontrol('Style','checkbox','String','loop','FontSize',12,...
'Units','Normalized','Position',[0.8 0.1 0.1 0.1],...
'Parent',fig);
function my_closefcn(gg,gg1)
set(tocheck,'Value',get(tocheck,'Min'))
delete(fig)
end
function clean(gg,gg1)
set(ed,'String','')
init
end
function dem(gg,gg1)
a=[randperm(3) randperm(3)];
b=num2str(a(1:5));
b=strrep(b,' ','');
set(ed,'String',b)
drawlines
if (~ishandle(fig)),return,end
if get(tocheck,'Value')==get(tocheck,'Max')
pause(0.5)
dem
end
end
function init
set(fig,'color',[1 1 1])
a=[1:3;1:3;1:3;1:3;1:3];
plot(a,'ko','MarkerSize',30,'Linewidth',2)
axis([0.5 5.5 0 4]);box off;axis off
end
function drawlines(gg,gg1)
init
ci=get(ed,'String');
if isempty(ci)
msgbox('Before pressing start you must insert the number inside the textbox')
return
end
if ((numel(ci)>5) | (numel(ci)<5))
msgbox('The number must have 5 digits')
return
end
c=[];
for f=1:5,c=[c str2num(ci(f))];,end
if ((max(c)>3) | (min(c)<1))
msgbox('The only alowed digits are 1,2 and 3')
return
end
set(butt,'Enable','off');
set(butt1,'Enable','off');
set(butt2,'Enable','off');
th = linspace(0,2*pi);
r = 0.22;
x = r*cos(th);
y = r*sin(th);
for b=1:4
patch(b+x,4-c(b)+y,'k')
pause(0.3)
line([b b+1],[4-c(b) 4-c(b+1)],'Color',[0 0 0],'LineWidth',5)
patch(b+x,4-c(b)+y,'w')
pause(0.3)
patch(b+1+x,4-c(b+1)+y,'k')
pause(0.3)
if b==4,patch(b+1+x,4-c(b+1)+y,'w'),end
if (~ishandle(fig)),return,end
end
set(butt,'Enable','on');
set(butt1,'Enable','on');
set(butt2,'Enable','on');
end
end
Matt Tearle
el 25 de Feb. de 2011
Doh. Too late. Still, how's this:
paths = [3,3,2,1,1;1,2,1,3,2;3,3,3,2,3];
[m,n] = size(paths);
th = linspace(0,2*pi);
r = 0.3;
x = r*cos(th);
y = r*sin(th);
for k=1:m
for j=1:n-1
line([j,j+1],[paths(k,j),paths(k,j+1)],'color','k','linewidth',2)
end
end
for k=1:m
for j=1:n
patch(j+x,k+y,'w')
line(j+x,k+y,'color','k','linewidth',2)
end
end
axis([0.5,n+0.5,0.5,m+0.5])
set(gca,'XTick',[],'YTick',1:m,'DataAspectRatio',[1 1 1],...
'YDir','reverse','Box','on','TickLength',[0,0])
If you like it, I can add animation.
EDIT: because I'm a dork, I added animation, whether you like it or not. So combining some of Paulo's ideas, which I thought were cute:
paths = [3,3,2,1,1;1,2,1,3,2;3,3,3,2,3];
[m,n] = size(paths);
pmax = max(paths(:));
h = zeros(n-1,m);
for k=1:m
for j=1:n-1
h(j,k) = line([j,j+1],[paths(k,j),paths(k,j+1)],...
'color','k','linewidth',2);
end
end
[x,y] = meshgrid(1:n,1:m);
line(x(:),y(:),'Linestyle','none','LineWidth',2,'Color','k',...
'Marker','o','MarkerSize',25,'MarkerFaceColor','w')
axis([0.5,n+0.5,0.5,m+0.5])
set(gca,'XTick',[],'YTick',1:m,'DataAspectRatio',[1 1 1],...
'YDir','reverse','Box','on','TickLength',[0,0])
set(h,'visible','off')
for k = 1:m*(n-1)
pause(0.5)
set(h(k),'visible','on')
end
1 comentario
Paulo Silva
el 25 de Feb. de 2011
Matt your are never too late!
Konstantin
el 25 de Feb. de 2011
0 votos
2 comentarios
Paulo Silva
el 25 de Feb. de 2011
We are crazy for new challenges because we learn alot from them and improve our matlab skills :)
Matt Tearle
el 25 de Feb. de 2011
Or just because we're crazy o_O
Jiro Doke
el 25 de Feb. de 2011
Just a little more fun... (adding on to Matt's and Paulo's ideas)
% paths = randi(5, [4, 6])
paths = ceil(5*rand(4, 6))
[m,n] = size(paths);
mx = max(paths(:));
set(gca, 'XLim', [0, n+1], 'YLim', [0, mx+1], 'YDir', 'reverse', ...
'Box', 'on', 'XTick', [], 'YTick', []);
h = line(NaN, NaN, 'LineWidth', 3, 'Color', 'Black');
[X,Y] = meshgrid(1:n, 1:mx);
line(X(:), Y(:), 'LineStyle', 'None', 'Marker', 'o', ...
'MarkerFaceColor', 'white', ...
'MarkerEdgeColor', 'black', 'MarkerSize', 20);
pt = line(NaN, NaN, 'Marker', 'o', 'MarkerEdgeColor', ...
'none', 'MarkerSize', 18);
for id1 = 1:m
title(num2str(paths(id1, :)));
for id2 = 1:n
set(h, 'XData', 1:id2, 'YData', paths(id1, 1:id2));
for id3 = 1:100
set(pt, 'XData', id2, 'YData', paths(id1, id2), ...
'MarkerFaceColor', 0.01*id3*[1 1 1]);
drawnow;
end
pause(0.5)
end
end
1 comentario
Paulo Silva
el 25 de Feb. de 2011
Nice and compact code, it gave me more ideas but I'm keeping the original problem size, I added the ball animation and a loop to the demo.
Categorías
Más información sobre Animation en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!