我在矩阵中有数据集。我想在集合上绘图,然后使用键盘输入移动到另一个。这种方式很简单:
for t=1:N
plot(data(:,t))
pause
end
但我希望及时前进t
(例如使用箭头)。好的,可以这样做:
direction = input('Forward or backward?','s')
if direction=='forward'
plot(data(:,ii+1))
else
plot(data(:,ii-1))
end
但是有没有更优雅的东西? (只需点击一下即可获得视线的图形 - 这是一个很大的全屏幕。)
答案 0 :(得分:7)
您可以将鼠标点击与ginput
结合使用。你可以做的是将你的代码放在while
循环中,等待用户点击屏幕上的某个地方。 ginput
暂停,直到某些用户输入发生。这必须在图形屏幕上完成。完成后,检查是否按下了哪个键,然后采取相应措施。左键单击意味着您将绘制下一组数据,而右键单击则意味着您绘制上一组数据。
你这样打电话给ginput
:
[x,y,b] = ginput(1);
x
和y
表示图形窗口中操作发生位置的x
和y
坐标,b
是您按下的按钮。实际上,您不需要空间坐标,因此在调用函数时可以忽略它们。
为值1分配左键单击,为值3分配右键单击。此外,转义(在我的计算机上)被赋值为27.因此,您可以使用while
循环来保持循环并在鼠标点击上绘制内容,直到您推送逃逸。当转义发生时,退出循环并停止询问输入。
但是,如果要在我的计算机上使用箭头键,则值28表示向左箭头,值29表示向右箭头。如果你想使用箭头键,我会在下面的代码中添加注释。
做这样的事情:
%// Generate random data
clear all; close all;
rng(123);
data = randn(100,10);
%// Show first set of points
ii = 1;
figure;
plot(data(:,ii), 'b.');
title('Data set #1');
%// Until we decide to quit...
while true
%// Get a button from the user
[~,~,b] = ginput(1);
%// Left click
%// Use this for left arrow
%// if b == 28
if b == 1
%// Check to make sure we don't go out of bounds
if ii < size(data,2)
ii = ii + 1; %// Move to the right
end
%// Right click
%// Use this for right arrow
%// elseif b == 29
elseif b == 3
if ii > 1 %// Again check for out of bounds
ii = ii - 1; %// Move to the left
end
%// Check for escape
elseif b == 27
break;
end
%// Plot new data
plot(data(:, ii), 'b.');
title(['Data set #' num2str(ii)]);
end
这是一个动画GIF,展示了它的用途:
答案 1 :(得分:6)
此演示向您展示如何使用键盘的左右箭头切换数据集甚至鼠标滚轮。
它使用图中的KeyPressFcn
和/或WindowScrollWheelFcn
事件。
function h = change_dataset_demo
%// sample data
nDataset = 8 ;
x = linspace(0,2*pi,50).' ; %'// ignore this comment
data = sin( x*(1:nDataset) ) ;
index.max = nDataset ;
index.current = 1 ;
%// Plot the first one
h.fig = figure ;
h.plot = plot( data(:,index.current) ) ;
%// store data in figure appdata
setappdata( h.fig , 'data', data )
setappdata( h.fig , 'index', index )
%// set the figure event callbacks
set(h.fig, 'KeyPressFcn', @KeyPressFcn_callback ) ; %// Set figure KeyPressFcn function
set(h.fig, 'WindowScrollWheelFcn',@mouseWheelCallback) %// Set figure Mouse wheel function
guidata( h.fig , h )
function mouseWheelCallback(hobj,evt)
update_display( hobj , evt.VerticalScrollCount )
function KeyPressFcn_callback(hobj,evt)
if ~isempty( evt.Modifier ) ; return ; end % Bail out if there is a modifier
switch evt.Key
case 'rightarrow'
increment = +1 ;
case 'leftarrow'
increment = -1 ;
otherwise
% do nothing
return ;
end
update_display( hobj , increment )
function update_display( hobj , increment )
h = guidata( hobj ) ;
index = getappdata( h.fig , 'index' ) ;
data = getappdata( h.fig , 'data' ) ;
newindex = index.current + increment ;
%// roll over if we go out of bound
if newindex > index.max
newindex = 1 ;
elseif newindex < 1
newindex = index.max ;
end
set( h.plot , 'YData' , data(:,newindex) ) ;
index.current = newindex ;
setappdata( h.fig , 'index', index )
当到达数据集的末尾时,这将翻转。
也做了一点gif,但它不那么令人印象深刻,因为它没有显示键盘/鼠标操作,只有图表更新: