matlab 中的 Y 误差线
Y error-bars in matlab
我有30个文件(UE1.dat, UE2.dat, ......),它们都由2列组成(第一列是延迟,第二列是它的CDF)。所以因为我没有 [100:600] 范围内所有延迟的 CDF 值,我不得不根据所有这 30 个文件中的第一列插入第二列,然后将数据标准化为 0 和 1 之间. 直到现在一切都很完美。
最后我必须绘制一个图形,它由 x、y 和 y 误差线组成。 x
是范围 (100:1:600),y
是每个 x
从 100 到 600 的每行插值数据的平均值,对于 y error-bars 我也计算每一行的标准偏差。
但是,当我用误差线绘制数据时,它看起来很奇怪,而且我有一些奇怪的 x 破折号,而如果我只绘制 x 对 y,一切看起来都不错。你能给我一些提示如何解决 y 错误栏的问题吗,也许我错过了什么。下面附上MATLAB代码和图表。
clc;
close all;
clear all;
% xq1 = (100:600)
NUM_UES = 30;
NUM_SAMPLES = 501;
for i=1:NUM_UES
%% Loading data
x = load(strcat('C:\Users\tgetsov\Documents\BA THESIS\temp_200\ral\UE',num2str(i),'.cdf.dat'));
y = strcat('C:\Users\tgetsov\Documents\BA THESIS\temp_200\ral\UE',num2str(i),'.cdf.dat');
xq = 100:1:600;
Result(:, i) = interp1(x(:,1), x(:,2), xq, 'linear', 'extrap');
Result_norm(:, i) = (Result(:, i) - min(Result(:, i)))/(max(Result(:, i) - min(Result(:, i))));
end
% p=0:length(Result)-1;
%%Plotting Data
% figure(i);
% % plot(p,Result); hold on;grid;
% plot(xq_i,Result_i);
% hold on;
% grid;
for k=1:NUM_SAMPLES
avg(k) = mean(Result_norm(k,:));
min_30_ral(k) = min(Result_norm(k,:),[],2);
max_30_ral(k)= max(Result_norm(k,:),[],2);
stdev(k) = std(Result_norm(k,:))*ones(size(xq(:, k)));
variance(k) = var(Result_norm(k, :));
end
v = variance;
v2 = zeros(size(v));
v2(1:50:end) = v(1:50:end);
m = stdev;
m2 = zeros(size(m));
m2(1:50:end) = m(1:50:end);
% [F , X] = ecdf(avg)
figure (1)
% errorbar(xq,avg,min_30_ral,max_30_ral);
% errorbar(xq,avg,m2);
% errorbar(xq,avg,v2);
errorbar(xq,avg,m2);
hold on;
grid;
figure (2)
plot (xq, avg);
hold on;
grid;
x 对 y:
x 与 y 的误差线:
要删除错误栏,您可以使用 david szotten 在以下 Matlab 中心问题中提供的答案:http://uk.mathworks.com/matlabcentral/newsreader/view_thread/167875
我将复制并粘贴此处提供的答案:
removeErrorBarEnds.m :
-------------
function removeErrorBarEnds(hErrBar)
%removeErrorBarEnds
% removeErrorBarEnds(hErrBar) removes the lines
above/below errorbars
% generated by the matlab function hErrBar = errorbar()
%
% Example:
% x = 1:10;
% y = sin(x);
% e = std(y)*ones(size(x));
% h = errorbar(x,y,e)
% oldAx = axis;
% removeErrorBarEnds(h)
% axis(oldAx)
% david szotten
%use length of xdata to find the right handle
%there may be an easier way to do this
dataLen = length( get(hErrBar, 'xdata') );
%objects to try, one of this is the errorbars
candidateList = findall(hErrBar);
for candidate = candidateList(:)'
candLen = length( get(candidate, 'xdata') );
%found it
if candLen == 9 * dataLen
xOrg = get(candidate, 'xdata');
yOrg = get(candidate, 'ydata');
%we only want the first 3 out or every 9
valuesToExtract = find( kron( ones
(1,dataLen), [ones(1,3) zeros(1,6)]) );
xNew = xOrg(valuesToExtract);
yNew = yOrg(valuesToExtract);
set(candidate, 'xdata', xNew);
set(candidate, 'ydata', yNew);
end
end
end
注意: 我在这里发布这个问题是为了确保知识(和代码)也在 Whosebug 中。
我有30个文件(UE1.dat, UE2.dat, ......),它们都由2列组成(第一列是延迟,第二列是它的CDF)。所以因为我没有 [100:600] 范围内所有延迟的 CDF 值,我不得不根据所有这 30 个文件中的第一列插入第二列,然后将数据标准化为 0 和 1 之间. 直到现在一切都很完美。
最后我必须绘制一个图形,它由 x、y 和 y 误差线组成。 x
是范围 (100:1:600),y
是每个 x
从 100 到 600 的每行插值数据的平均值,对于 y error-bars 我也计算每一行的标准偏差。
但是,当我用误差线绘制数据时,它看起来很奇怪,而且我有一些奇怪的 x 破折号,而如果我只绘制 x 对 y,一切看起来都不错。你能给我一些提示如何解决 y 错误栏的问题吗,也许我错过了什么。下面附上MATLAB代码和图表。
clc;
close all;
clear all;
% xq1 = (100:600)
NUM_UES = 30;
NUM_SAMPLES = 501;
for i=1:NUM_UES
%% Loading data
x = load(strcat('C:\Users\tgetsov\Documents\BA THESIS\temp_200\ral\UE',num2str(i),'.cdf.dat'));
y = strcat('C:\Users\tgetsov\Documents\BA THESIS\temp_200\ral\UE',num2str(i),'.cdf.dat');
xq = 100:1:600;
Result(:, i) = interp1(x(:,1), x(:,2), xq, 'linear', 'extrap');
Result_norm(:, i) = (Result(:, i) - min(Result(:, i)))/(max(Result(:, i) - min(Result(:, i))));
end
% p=0:length(Result)-1;
%%Plotting Data
% figure(i);
% % plot(p,Result); hold on;grid;
% plot(xq_i,Result_i);
% hold on;
% grid;
for k=1:NUM_SAMPLES
avg(k) = mean(Result_norm(k,:));
min_30_ral(k) = min(Result_norm(k,:),[],2);
max_30_ral(k)= max(Result_norm(k,:),[],2);
stdev(k) = std(Result_norm(k,:))*ones(size(xq(:, k)));
variance(k) = var(Result_norm(k, :));
end
v = variance;
v2 = zeros(size(v));
v2(1:50:end) = v(1:50:end);
m = stdev;
m2 = zeros(size(m));
m2(1:50:end) = m(1:50:end);
% [F , X] = ecdf(avg)
figure (1)
% errorbar(xq,avg,min_30_ral,max_30_ral);
% errorbar(xq,avg,m2);
% errorbar(xq,avg,v2);
errorbar(xq,avg,m2);
hold on;
grid;
figure (2)
plot (xq, avg);
hold on;
grid;
x 对 y:
x 与 y 的误差线:
要删除错误栏,您可以使用 david szotten 在以下 Matlab 中心问题中提供的答案:http://uk.mathworks.com/matlabcentral/newsreader/view_thread/167875
我将复制并粘贴此处提供的答案:
removeErrorBarEnds.m :
-------------
function removeErrorBarEnds(hErrBar)
%removeErrorBarEnds
% removeErrorBarEnds(hErrBar) removes the lines
above/below errorbars
% generated by the matlab function hErrBar = errorbar()
%
% Example:
% x = 1:10;
% y = sin(x);
% e = std(y)*ones(size(x));
% h = errorbar(x,y,e)
% oldAx = axis;
% removeErrorBarEnds(h)
% axis(oldAx)
% david szotten
%use length of xdata to find the right handle
%there may be an easier way to do this
dataLen = length( get(hErrBar, 'xdata') );
%objects to try, one of this is the errorbars
candidateList = findall(hErrBar);
for candidate = candidateList(:)'
candLen = length( get(candidate, 'xdata') );
%found it
if candLen == 9 * dataLen
xOrg = get(candidate, 'xdata');
yOrg = get(candidate, 'ydata');
%we only want the first 3 out or every 9
valuesToExtract = find( kron( ones
(1,dataLen), [ones(1,3) zeros(1,6)]) );
xNew = xOrg(valuesToExtract);
yNew = yOrg(valuesToExtract);
set(candidate, 'xdata', xNew);
set(candidate, 'ydata', yNew);
end
end
end
注意: 我在这里发布这个问题是为了确保知识(和代码)也在 Whosebug 中。