从图中的轴获取当前选定的数据点
Get currently selected data point from axes in a figure
我有一个 MATLAB 图,其坐标轴包含散点图。
此散点图上的每个点都有一个与之关联的信号数据数组。
我想将用户输入作为散点图中的点选择,并在同一图的另一个轴上绘制相应的信号数据。
将第二个轴的全局定义与数据游标上的 UpdateFcn 相结合。请参见下面的示例,它根据所选的随机变量生成正弦波。
function getSelectedDataPoint()
% create figure
fig = figure;
% make second axes a global to adress in myupdatefcn
global ax2
% define axes
ax1 = axes('parent',fig,'position',[0.05 0.05 0.9 0.4]);
ax2 = axes('parent',fig,'position',[0.05 0.55 0.9 0.4]);
% Random scatter
scatter(ax1,rand(25,1),rand(25,1),25,'filled')
% Set datacursormode to on
dcm_obj = datacursormode(fig);
datacursormode on
% Specify objective function for clock
set(dcm_obj,'UpdateFcn',@myupdatefcn)
% Define objective function
function text = myupdatefcn(~,obj)
text = sprintf('X: %f \n Y: %f',[obj.Position(1),obj.Position(2)]);
% Find corresponding signal
id = find(and(obj.Position(1) == obj.Target.XData,obj.Position(2) ==
obj.Target.YData));
% Do your thing with the signals
x = 0:0.1:100;
y = sin(obj.Target.XData(id)*x);
% plot on second axes
plot(ax2,x,y)
end
end
我不确定我是否完全理解你想做什么,但你可能想使用可用于 MATLAB 中许多对象的 "Tag" 选项。
将 "Random scatter" 下的行替换为:
% Random scatter
hold(ax1,'on')
scatTag = cell(1,10);
for i = 1:10
scatTag{i} = scatter(ax1,rand(1,1),rand(1,1),25,'filled');
scatTag{i}.Tag = num2str(i);
end
在数据游标更新函数中,替换行"id= find(..."
tagname = obj.Target.Tag;
并修改信号函数以指向您的目标标记,无论是什么函数。在我的示例中,您可以这样做来定义 y 值:
y = sin(str2double(tagname)*x);
它将根据标签生成另一个正弦波。
希望这对您有所帮助:)
我有一个 MATLAB 图,其坐标轴包含散点图。 此散点图上的每个点都有一个与之关联的信号数据数组。 我想将用户输入作为散点图中的点选择,并在同一图的另一个轴上绘制相应的信号数据。
将第二个轴的全局定义与数据游标上的 UpdateFcn 相结合。请参见下面的示例,它根据所选的随机变量生成正弦波。
function getSelectedDataPoint()
% create figure
fig = figure;
% make second axes a global to adress in myupdatefcn
global ax2
% define axes
ax1 = axes('parent',fig,'position',[0.05 0.05 0.9 0.4]);
ax2 = axes('parent',fig,'position',[0.05 0.55 0.9 0.4]);
% Random scatter
scatter(ax1,rand(25,1),rand(25,1),25,'filled')
% Set datacursormode to on
dcm_obj = datacursormode(fig);
datacursormode on
% Specify objective function for clock
set(dcm_obj,'UpdateFcn',@myupdatefcn)
% Define objective function
function text = myupdatefcn(~,obj)
text = sprintf('X: %f \n Y: %f',[obj.Position(1),obj.Position(2)]);
% Find corresponding signal
id = find(and(obj.Position(1) == obj.Target.XData,obj.Position(2) ==
obj.Target.YData));
% Do your thing with the signals
x = 0:0.1:100;
y = sin(obj.Target.XData(id)*x);
% plot on second axes
plot(ax2,x,y)
end
end
我不确定我是否完全理解你想做什么,但你可能想使用可用于 MATLAB 中许多对象的 "Tag" 选项。
将 "Random scatter" 下的行替换为:
% Random scatter
hold(ax1,'on')
scatTag = cell(1,10);
for i = 1:10
scatTag{i} = scatter(ax1,rand(1,1),rand(1,1),25,'filled');
scatTag{i}.Tag = num2str(i);
end
在数据游标更新函数中,替换行"id= find(..."
tagname = obj.Target.Tag;
并修改信号函数以指向您的目标标记,无论是什么函数。在我的示例中,您可以这样做来定义 y 值:
y = sin(str2double(tagname)*x);
它将根据标签生成另一个正弦波。
希望这对您有所帮助:)