将许多行绘制为热图

时间:2014-04-29 05:30:36

标签: matlab plot data-processing logfile-analysis

我正在尝试处理来自数据记录器的大量(~1000)文件。

如果我想用这些日志文件中的一个来绘制趋势,我可以使用

来完成
plot(timevalues,datavalues)

我希望能够以类似于示波器具有“持久性”的方式同时查看所有这些线路。模式。

Oscilloscope Diplay

我可以拼凑一些使用直方图的东西,但我希望这个问题有预先存在或更优雅的解决方案。

3 个答案:

答案 0 :(得分:9)

您可以完全按照自己的建议行事,即绘制信号的热图。

考虑以下因素:我将构建一个测试信号(由不同幅度的正弦波组成),然后我将通过hist3imagesc绘制热图。

这个想法是建立一个辅助信号,它只是所有时间历史的并置(在xy中),然后提取基本的双变量统计数据。

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

为了便于阅读,您还可以使用jet色彩映射而不是hot色彩映射。 在下文中,幅度是高斯而不是同质。

enter image description here

答案 1 :(得分:7)

这是一个只使用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

答案 2 :(得分:1)

为什么不规范数据然后将所有行添加到一起?然后,您可以从单个数据文件中绘制热图。