Workspace parameter values UPDATE while using "Mouse Call-back" function
显示 更早的评论
Hello everyone!
I am struggling with the next problem, and I hope some of you can help me! :)
I have here a plot, having already defined the X and Y values as 1x10 double arrays, and a computation for the sum of the first 6 elements of the Y-axis array (just an example).
The Mouse_Callback function allows me to change the Y-axis values in real time, as you can see in the code attached below, and always get the new point coordinate in the command window.
Problem: Even though the function gives me the new coordinates of the YData, the Sum_Y is not re-calculated. It is very important to calculate the Sum_Y outside the function (in the main), because I would like to keep the function strictly for real-time Y-axis modification of the plot. I have to specify that the new Y-axis values appear only in the Command Window, without being updated in the Workspace (therefore the problem with the Sum_Y recalculation).
Question: How can I modify the Y-axis with drag&drop, like the function does, and get the values updated immediately in the Workspace, so I can immediately calculate Sum_Y and keep it updated everytime I change a point on the plot?
Thank you very much in advance! Any piece of advice would be very much appreciated!!!
close all
clear
clc
Graph_pos = [2.5 7 45 10];
x = [1 2 3 4 5 6 7 8 9 10 ];
y = [0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 ];
%% Plotting and Manually updating the values
fig_1 = figure('Units','centimeters','Position',Graph_pos);
clearvars Graph_pos
plot(x,y,'k-o','MarkerfaceColor','k','buttondownfcn',{@Mouse_Callback,'down'});
[x_coord,y_coord] = Mouse_Callback(gcf,gca,0);
Sum_Y = y(1) + y(2) + y(3) + y(4) + y(5) + y(6); % this sum is just an example, I need to get it updated in real time
% Callback function for each point
function [x_coord, y_coord] = Mouse_Callback(hObj,~,action)
persistent curobj xdata ydata ind
pos = get(gca,'CurrentPoint'); % gets the exact position of the point, when we click on it
switch action
case 'down' % down = click without release
curobj = hObj; % gives the plot properties (Color, Line settings, ..., XData, YData, ZData)
xdata = get(hObj,'XData'); % xdata takes the X-axis coordinates from the plot properties
ydata = get(hObj,'YData'); % ydata takes the Y-axis coordinates from the plot properties
[~,ind] = min(sum((xdata-pos(1)).^2+(ydata-pos(3)).^2,1)); % ind is the index of the axis value (1st, 2nd, ..., 10th)
set(gcf,...
'WindowButtonMotionFcn', {@Mouse_Callback,'move'},... % allows to move the point after pressing it
'WindowButtonUpFcn', {@Mouse_Callback,'up'}); % allows to release and keep the updated position of the point
case 'move' % drag the click without release
% vertical move
ydata(ind) = pos(3); % the selected point takes the new Y-axis coordinates value
set(curobj,'ydata',ydata) % the YData values get updated, and the point moves on the graph
case 'up' % release the click
set(gcf,...
'WindowButtonMotionFcn', '',...
'WindowButtonUpFcn', '');
disp(ydata) % Real time Y coordinates values
end
dataObjs = findobj(gcf,'-property','XData');
x_coord = dataObjs(1).XData;
dataObjs = findobj(gcf,'-property','YData');
y_coord = dataObjs(1).YData;
end
采纳的回答
更多回答(0 个)
类别
在 帮助中心 和 File Exchange 中查找有关 Creating, Deleting, and Querying Graphics Objects 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
