2014-04-29 16 views
8

Ho un numero elevato (~ 1000) di file da un registratore di dati che sto tentando di elaborare.Tracciare più linee come heatmap

Se volessi tracciare la tendenza da uno solo di questi file di log che potrei farlo utilizzando

plot(timevalues,datavalues) 

Mi piacerebbe essere in grado di vedere tutte queste linee allo stesso tempo in modo simile a come un oscilloscopio ha una modalità "persistente".

Oscilloscope Diplay

Probabilmente posso mettere insieme qualcosa che utilizza gli istogrammi, ma sto sperando c'è soluzione pre-esistente o più elegante a questo problema.

+0

fondamentalmente vuoi avere 1000 linee in un grafico? – thewaywewalk

+0

Voglio usare i dati da 1000 linee per produrre un grafico, come nel grafico dell'oscilloscopio, mostra molti aggiornamenti contemporaneamente, con l'uso dei colori mostra dove più di queste forme d'onda sono "accatastate" (vale a dire le parti rosse) e dove vi è la differenza occasionale o glitch in forme d'onda (cioè le parti blu) – Hugoagogo

+1

sarà utile? http://www.mathworks.com/help/comm/ref/commscope.eyediagram.html – bla

risposta

9

È possibile eseguire esattamente ciò che si sta suggerendo da soli, ovvero tracciare la mappa termica dei segnali.

Considerare quanto segue: Costruirò un segnale di prova (fuori dalle onde sinusoidali di diversa ampiezza), quindi traccerò la heatmap tramite hist3 e imagesc.

L'idea è di costruire un segnale ausiliario che sia solo la giustapposizione di tutte le cronologie di tempo (sia in x e), quindi estrarre statistiche bivariate di base da questo.

% # Test signals 
xx = 0 : .01 : 2* pi; 
center = 1; 
eps_ = .2; 
amps = linspace(center - eps_ , center + eps_ , 100); 

% # the auxiliary signal will be stored in the following variables 
yy = []; 
xx_f = []; 

for A = amps 
    xx_f = [xx_f,xx]; 
    yy = [yy A*sin(xx)]; 
end 

% # final heat map 
colormap(hot) 
[N,C] = hist3([xx_f' yy'],[100 100]); 
imagesc(C{1},C{2},N') 

enter image description here

È possibile utilizzare anche jet mappa colore, invece di hot mappa dei colori per migliorare la leggibilità. Nel seguito l'ampiezza è gaussiana anziché omogenea.

enter image description here

+1

Grazie a ciò che stavo cercando, ho guardato brevemente a hist3 ma non ero sicuro di come mettere insieme i pezzi. Prima di accettare la risposta, c'è un modo oltre all'interpolazione che può essere utilizzato per aggiungere più dati alla mappa di calore quando c'è un rapido cambiamento nel segnale, con conseguente scomparsa della linea. – Hugoagogo

+0

@Hugoagogo, vedo il tuo problema. Immagino che l'interpolazione sia un modo pulito per affrontare il problema. Tuttavia, è necessario aumentare la risoluzione temporale per interpolazione in ogni momento e non solo dove si ha il problema, altrimenti le statistiche bivariate si rovineranno. – Acorbe

+0

Ho trovato questo esempio di codice https://www.mathworks.com.au/matlabcentral/answers/63233-interpolating-the-2d-line-to-make-the-new-coordinates-equististant che sembra funzionare bene abbastanza per i miei scopi.Contrassegnare questa risposta come accettata – Hugoagogo

7

ecco una soluzione di "primitivo" che sta solo utilizzando hist:

%# generate some fake data 

x=-8:0.01:8; 
y=10*sinc(x); 
yy=bsxfun(@plus,y,0.1*randn(numel(x),1000)'); 
yy(randi(1000,1,200),:)= 5-randi(10)+ circshift(yy(randi(1000,1,200),:),[1 randi(numel(x),1,200)]); 

%# get plot limit parameters 

plot(x,yy) 
yl=get(gca,'Ylim'); 
xl=get(gca,'Xlim'); 
close all; 


%# set 2-d histogram ranges 

ybins=100; 
xbins=numel(x); 
yrange=linspace(yl(1),yl(2),ybins); 
xrange=linspace(xl(1),xl(2),xbins); 

%# prealocate 

m=zeros(numel(yrange),numel(xrange)); 

% build 2d hist 
for n=1:numel(x) 
    ind=hist(yy(:,n),yrange); 
    m(:,n)=m(:,n)+ind(:); 
end 

imagesc(xrange,yrange,m) 
set(gca,'Ydir','normal') 

enter image description here

+1

Questo è l'approccio che stavo considerando e funziona alla grande, la soluzione che @Acorbe fornisce è una soluzione più elegante, quindi ho accettato questa risposta. I tuoi dati di esempio sono comunque migliori. – Hugoagogo

1

Perché non normalizzare i dati e quindi aggiungere tutte le linee insieme? È quindi possibile tracciare la heatmap dal singolo file di dati.