# How to smooth plot without affecting the data. While I used smooth in plots, the data was reduced at some points.

3 views (last 30 days)
hussain soomro on 25 Feb 2021
Commented: hussain soomro on 26 Feb 2021
For example P = [0.8449;1.9194;3.6072;4.8034;6.1154;6.8659;7.2927;6.8533;4.8565;2.9631;1.2971]
Now when I use smooth
Ps = smooth(P)
plot(Ps)
the resulting figure is
in the P there is value above 7, but in plot the curve is not even touching 7.
Kindly anyone help.
Thanks and regards

Mathieu NOE on 25 Feb 2021
hello
to have a smoothed curved that goes closer to your input points, you have to interpolate first to have more data points, then smooth
I prefered my own version of data smoothing vs the movmean function (better handling of start / end points)
here is my result : yellow is the improved smoothing after interpolation, orange is without interpolation
P = [0.8449;1.9194;3.6072;4.8034;6.1154;6.8659;7.2927;6.8533;4.8565;2.9631;1.2971]
x = 1:length(P);
% Ps = movmean(P,5)
Ps = myslidingavg(P,5);
% increase points density and smoothing with myslidingavg
xx = linspace(1,length(P),200);
yy = interp1(x,P,xx,'pchip');
% yys = movmean(yy,25);
yys = myslidingavg(yy,25);
figure(1),plot(x,P,'*',x,Ps,'-',xx,yys,'-');
function out = myslidingavg(in, N)
% OUTPUT_ARRAY = MYSLIDINGAVG(INPUT_ARRAY, N)
%
% The function 'slidingavg' implements a one-dimensional filtering, applying a sliding window to a sequence. Such filtering replaces the center value in
% the window with the average value of all the points within the window. When the sliding window is exceeding the lower or upper boundaries of the input
% vector INPUT_ARRAY, the average is computed among the available points. Indicating with nx the length of the the input sequence, we note that for values
% of N larger or equal to 2*(nx - 1), each value of the output data array are identical and equal to mean(in).
%
% * The input argument INPUT_ARRAY is the numerical data array to be processed.
% * The input argument N is the number of neighboring data points to average over for each point of IN.
%
% * The output argument OUTPUT_ARRAY is the output data array.
if (isempty(in)) | (N<=0) % If the input array is empty or N is non-positive,
disp(sprintf('SlidingAvg: (Error) empty input data or N null.')); % an error is reported to the standard output and the
return; % execution of the routine is stopped.
end % if
if (N==1) % If the number of neighbouring points over which the sliding
out = in; % average will be performed is '1', then no average actually occur and
return; % OUTPUT_ARRAY will be the copy of INPUT_ARRAY and the execution of the routine
end % if % is stopped.
nx = length(in); % The length of the input data structure is acquired to later evaluate the 'mean' over the appropriate boundaries.
if (N>=(2*(nx-1))) % If the number of neighbouring points over which the sliding
out = mean(in)*ones(size(in)); % average will be performed is large enough, then the average actually covers all the points
return; % of INPUT_ARRAY, for each index of OUTPUT_ARRAY and some CPU time can be gained by such an approach.
end % if % The execution of the routine is stopped.
out = zeros(size(in)); % In all the other situations, the initialization of the output data structure is performed.
if rem(N,2)~=1 % When N is even, then we proceed in taking the half of it:
m = N/2; % m = N / 2.
else % Otherwise (N >= 3, N odd), N-1 is even ( N-1 >= 2) and we proceed taking the half of it:
m = (N-1)/2; % m = (N-1) / 2.
end % if
for i=1:nx, % For each element (i-th) contained in the input numerical array, a check must be performed:
dist2start = i-1; % index distance from current index to start index (1)
dist2end = nx-i; % index distance from current index to end index (nx)
if dist2start<m || dist2end<m % if we are close to start / end of data, reduce the mean calculation on centered data vector reduced to available samples
dd = min(dist2start,dist2end); % min of the two distance (start or end)
else
dd = m;
end % if
out(i) = mean(in(i-dd:i+dd)); % mean of centered data , reduced to available samples at both ends of the data vector
end % for i
end
hussain soomro on 26 Feb 2021
Excellent sir. Thanks a lot