How to merge and smooth multiple curves in a plot, if there are discrete points?
5 views (last 30 days)
Show older comments
Zeynep Ertekin
on 29 Jun 2024
Commented: Mathieu NOE
on 5 Jul 2024
I have a graph, containing 4 different types of curves, in 5 frequency regions, overall 20 curves in a single graph. At some points, the curves meet, however at some points, the curves are super distant from the following one. I applied brushing, but still have discontinuities.
(Keeping the color coding) I need to merge them and smooth the sharp and points. How can I do this?
I uploaded the fig file. I have the excel data if needed.
Best
( 1. I failed to utilize link in figure properties 2. I tried to gather the data in excel, and delete the meeting points, it also didnt work)
6 Comments
Image Analyst
on 30 Jun 2024
@Paul thanks for letting us know that - I didn't know. However it's still extra work - we need to write and run code - when it would be easier on us if the original poster just made it displayed right from the start.
@Zeynep Ertekin Not sure what you don't understand or what poster you were referring to. Did you not understand how to attach your data file and m-file with the paperclip icon when I requested that you do that? Or was it something else you didn't understand? Regardless, we're still waiting for your data so we can show you how to do it. It might be as simple as locating NaNs and removing them, like I already said.
badIndexes = isnan(x) | isnan(y);
x(badIndexes) = []; % Remove the bad x values.
y(badIndexes) = []; % Remove the bad y values.
Accepted Answer
Mathieu NOE
on 2 Jul 2024
hello
tried afew options, probably here my best result in the very limited time I have now :
this is a demo on the first two line plots , extend to the other plots if you like it
load('dataread_matlab.mat')
% figure
% plot(TEM_34_S{:,3},-1*TEM_34_S{:,4},'r',TEM_62_S{:,3},-1*TEM_62_S{:,4},'r',TEM_90_S{:,3},-1*TEM_90_S{:,4},'r',TEM_159_S{:,3},-1*TEM_159_S{:,4},'r',TEM_284_S{:,3},-1*TEM_284_S{:,4},'r','LineWidth',4);
% hold on
% plot(TEM_34_S{:,7},-1*TEM_34_S{:,8},'b',TEM_62_S{:,7},-1*TEM_62_S{:,8},'b',TEM_90_S{:,7},-1*TEM_90_S{:,8},'b',TEM_159_S{:,7},-1*TEM_159_S{:,8},'b',TEM_284_S{:,7},-1*TEM_284_S{:,8},'b','LineWidth',4);
% hold on
%%
channel = 4;
x1 = [TEM_34_S{:,channel-1};TEM_62_S{:,channel-1};TEM_90_S{:,channel-1};TEM_159_S{:,channel-1};TEM_284_S{:,channel-1}];
y1 = [TEM_34_S{:,channel};TEM_62_S{:,channel};TEM_90_S{:,channel};TEM_159_S{:,channel};TEM_284_S{:,channel}];
%%
channel = 8;
x2 = [TEM_34_S{:,channel-1};TEM_62_S{:,channel-1};TEM_90_S{:,channel-1};TEM_159_S{:,channel-1};TEM_284_S{:,channel-1}];
y2 = [TEM_34_S{:,channel};TEM_62_S{:,channel};TEM_90_S{:,channel};TEM_159_S{:,channel};TEM_284_S{:,channel}];
%% main loop
[x1s,y1s] = mysmoother(x1,y1);
[x2s,y2s] = mysmoother(x2,y2);
figure
plot(x1,y1,'*r',x1s,y1s,'g',x2,y2,'*b',x2s,y2s,'y','LineWidth',4);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [xc,ys] = mysmoother(x,y)
% take unique values
[x,ia,~] = unique(x);
y = y(ia);
% my smoother
N = 100;
xi = linspace(min(x),max(x),N); %
% create median average in each bin
for k=1:N-1
ind = (x>=xi(k) & x<xi(k+1));
xc(k) = (xi(k) + xi(k+1))/2;
yc(k) = median(y(ind));
end
% add first and last points (assumed to be in a "clean" area)
xc = [x(1) xc x(end)];
yc = [y(1) yc y(end)];
% smooth it
ys = smoothdata(yc,'rloess',round(N/3));
end
4 Comments
Mathieu NOE
on 5 Jul 2024
Tx for the nice comments , but I still have to work hard if I want to access the top10 league !!!
have a great day !
More Answers (0)
See Also
Categories
Find more on Data Preprocessing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!