How to manually move (smoothly) a set of evenly spaced xlines
7 ビュー (過去 30 日間)
表示 古いコメント
Paul Hoffrichter
2022 年 11 月 18 日
コメント済み: Paul Hoffrichter
2022 年 11 月 23 日
In R2020a on a plot I plan on having a loop to produce 20 xlines that are 200 samples apart. (I know that in later versions, one xline can have an array, but not in R2020a.)
I would like to be able to manually move all of them by some offset < 200, preferably with a mouse. Ideally, I would select the left-most xline with a mouse (or even any point between the first two xlines), and as I move the mouse to the right, all 20 xlines would move smoothly to the right keeping their difference of 200 samples intact. When I let go of the mouse select key, then I would like to know the exact x-coordinate of the left-most xline. (Using the figure tooltip only gives an approximate x-coordinate.) I should then be able to repeat this until I am satisified that all the gaps between the xlines have captured the data symbols correctly.
In following example, I would want to slide the xlines to lie on top of the peaks. (Actual signals are not as clear.)
f = 50*1e6;
phi = 14*pi/9;
t = linspace(0,1,100e3);
y = sin(2*pi*f*t + phi);
plot(y)
for ii = 0:10
xline(ii*200 + 25);
end
xlim( [1 2300] );
0 件のコメント
採用された回答
Steven Lord
2022 年 11 月 18 日
While you can't create a vector of xline objects in one call in release R2020a, you can store those handles in an array.
axis([-5 5 0 10])
h = gobjects(1, 5);
for k = 1:5
h(k) = xline(k-3); % Lines at -2, -1, 0, 1, and 2
end
Now just update the Value property of each line. A simple for loop would be easiest, but you can change all their properties at once using a one line command if you don't mind it being a little cryptic. This moves the lines to be at positions -3:1.
set(h, {'Value'}, arrayfun(@(obj) obj.Value-1, h, 'UniformOutput', false).')
This uses the "set(H,NameArray,ValueArray)" syntax from the set function's documentation page.
その他の回答 (1 件)
Steven Lord
2022 年 11 月 18 日
With your clarifying picture there may be another possibility. You could just put the xline objects in their required position automatically.
x = 0:3600;
y = sind(x);
L = islocalmax(y);
plot(x, y, '-');
hold on
peakLocations = x(L);
for whichpeak = 1:numel(peakLocations)
xline(peakLocations(whichpeak));
end
Another potential approach to highlight the peaks is to add a stem plot.
% stem(x(L), y(L))
参考
カテゴリ
Help Center および File Exchange で Annotations についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!