2015-08-10 1 views
0

J'ai 30 fichiers (UE1.dat, UE2.dat, ......), tous les se composent de 2 colonnes (le premier est le retard et le second est son CDF). Donc parce que je n'ai pas la valeur CDF pour tous les retards dans la plage [100: 600], j'ai dû interpoler les deuxièmes colonnes selon la première dans tous ces 30 fichiers et ensuite normaliser les données entre 0 et 1 Tout fonctionne parfaitement jusqu'à maintenant. En fin de compte, je dois tracer un graphe, qui consiste en x, y et les barres d'erreur y. est la plage (100: 1: 600), y est la moyenne pour chaque ligne des données interpolées pour chaque x de 100 à 600 par l'étape 1, et pour les barres d'erreur y, je calcule l'écart type pour chaque ligne y ainsi que.Y barres d'erreur dans matlab

Mais quand je trace les données avec des barres d'erreur, ça a l'air bizarre et j'ai des tirets étranges, alors que si je ne trace que x contre y tout semble bon. Pouvez-vous me donner quelques conseils pour résoudre le problème avec les barres d'erreur y, peut-être que je manque quelque chose. Ci-dessous le code MATLAB est joint et les graphiques aussi.

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 contre y:

enter image description here

x contre y avec des barres d'erreur:

enter image description here

+0

Il n'y a pas de problème ici. Ce ne sont pas des "étranges tirets" mais les limites supérieures et inférieures de la barre d'erreur. Vous avez de très petites marges d'erreur entre 0 et 320 pour que la barre apparaisse petite. –

+0

ok c'est plus clair pour moi maintenant, mais comment puis-je tracer uniquement les erreurs verticales sans les horizontales? –

+0

Cochez ceci: http://fr.mathworks.com/matlabcentral/newsreader/view_thread/167875 –

Répondre

0

Pour supprimer les errorbars vous pouvez utiliser la réponse fournie par david szotten dans la question Matlab centrale suivante: http://uk.mathworks.com/matlabcentral/newsreader/view_thread/167875

Je copier et coller la réponse fournie là:

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 

Note: Je poste cette question ici afin d'assurer que les connaissances (et code) est également Stackoverflow.