2014-04-29 15 views
8

Tôi có một số lượng lớn (~ 1000) tệp từ trình ghi dữ liệu mà tôi đang cố gắng xử lý.Vẽ nhiều đường như một bản đồ nhiệt

Nếu tôi muốn vẽ đồ thị xu hướng từ một đơn một trong những tập tin log tôi có thể làm điều đó bằng

plot(timevalues,datavalues) 

Tôi muốn để có thể xem tất cả các dòng cùng lúc trong một cách tương tự làm thế nào một dao động có một chế độ "kiên trì".

Oscilloscope Diplay

tôi có lẽ có thể rai với nhau một cái gì đó có sử dụng biểu đồ nhưng tôi hy vọng có giải pháp tồn tại từ trước hoặc thanh lịch hơn cho vấn đề này.

+0

về cơ bản bạn muốn có 1000 dòng trong một ô? – thewaywewalk

+0

Tôi muốn sử dụng dữ liệu từ 1000 dòng để tạo ra một ô, giống như trong đồ thị dao động, nó hiển thị nhiều cập nhật cùng một lúc, bằng cách sử dụng màu sắc cho thấy nhiều dạng sóng này được "xếp chồng lên nhau" (tức là các phần màu đỏ) và nơi có sự khác biệt thường xuyên hoặc trục trặc trong dạng sóng (tức là các bộ phận màu xanh) – Hugoagogo

+1

điều này sẽ hữu ích? http://www.mathworks.com/help/comm/ref/commscope.eyediagram.html – bla

Trả lời

9

Bạn có thể thực hiện chính xác những gì bạn đang đề xuất, ví dụ: vẽ bản đồ nhiệt của tín hiệu.

Hãy xem xét những điều sau: Tôi sẽ xây dựng một tín hiệu thử nghiệm (ngoài sóng sin có biên độ khác nhau), sau đó tôi sẽ vẽ sơ đồ nhiệt qua hist3imagesc.

Ý tưởng là xây dựng một tín hiệu phụ trợ chỉ là vị trí của tất cả lịch sử thời gian của bạn (cả trong số xy), sau đó trích xuất số liệu thống kê bivariate cơ bản.

% # 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

Bạn có thể sử dụng cũng jet colormap thay vì hot colormap cho dễ đọc. Trong biên độ sau đây là gaussian thay vì homogeneus.

enter image description here

+1

Cảm ơn đây chỉ là những gì tôi đang tìm kiếm, tôi đã xem xét hist3 một thời gian ngắn nhưng không chắc chắn làm thế nào để đặt các mảnh lại với nhau. Trước khi tôi chấp nhận câu trả lời, có cách nào ngoài phép nội suy có thể được sử dụng để thêm nhiều dữ liệu hơn vào bản đồ nhiệt khi có sự thay đổi nhanh về tín hiệu, dẫn đến sự biến đổi dòng. – Hugoagogo

+0

@Hugoagogo, tôi thấy sự cố của bạn. Tôi đoán nội suy là một cách gọn gàng để giải quyết vấn đề. Tuy nhiên, bạn phải tăng độ phân giải thời gian bằng phép nội suy ở mọi thời điểm và không chỉ ở nơi bạn có vấn đề, nếu không chỉ số bivariate sẽ bị hủy hoại. – Acorbe

+0

Tôi đã tìm thấy ví dụ về mã này https://www.mathworks.com.au/matlabcentral/answers/63233-interpolating-the-2d-line-to-make-the-new-coordinates-equi-distant dường như hoạt động tốt đủ cho mục đích của tôi.Đánh dấu câu trả lời này là được chấp nhận – Hugoagogo

7

đây là một "nguyên thủy" giải pháp mà chỉ được sử dụng 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

Đây là cách tiếp cận mà tôi đã xem xét và hoạt động tốt, giải pháp @Acorbe cung cấp là tôi nghĩ rằng một giải pháp tốt hơn thanh lịch hơn vì vậy tôi đã chấp nhận câu trả lời đó. Mặc dù dữ liệu mẫu của bạn tốt hơn. – Hugoagogo

1

Tại sao bạn không chuẩn hóa dữ liệu và sau đó thêm tất cả các dòng với nhau? Sau đó bạn có thể vẽ sơ đồ nhiệt từ datafile đơn.

Các vấn đề liên quan