使用键盘输入切换值以绘制

Switching values to plot using keyboard input

我有矩阵中的数据集。我想在现场绘图,然后使用键盘输入移动到另一个。这样做很简单:

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

但是没有更优雅的东西吗? (点击一下没有得到瞄准镜的图形 - 这是一个大的全屏图形。)

您可以结合使用鼠标点击和 ginput。您可以做的是将您的代码放入 while 循环中,并等待用户单击屏幕上的某个位置。 ginput 暂停,直到发生某些用户输入。不过,这必须在图形屏幕上完成。完成后,检查按下的是哪个键,然后采取相应的行动。左键单击将意味着您将绘制下一组数据,而右键单击将意味着您将绘制上一组数据。

您可以这样调用 ginput

[x,y,b] = ginput(1);

xy分别表示图中发生动作的xy坐标window和b是你按下的按钮。您实际上不需要空间坐标,因此您可以在调用函数时忽略它们。

值 1 分配给左键单击,值 3 分配给右键单击。此外,escape(在我的计算机上)被分配了一个值 27。因此,您可以有一个 while 循环,在您按下 escape 之前,它会一直循环并在鼠标单击时绘制内容。当发生逃逸时,退出循环并停止请求输入。

但是,如果你想使用方向键,在我的电脑上,值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:

此演示向您展示了如何使用键盘的左右箭头甚至鼠标滚轮来切换数据集。

使用了KeyPressFcnand/orWindowScrollWheelFcn图的事件

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,但它没有那么令人印象深刻,因为它没有显示 keyboard/mouse 动作,只有图形更新: