将许多行绘制为热图

Hug*_*ogo 8 matlab plot logfile-analysis data-processing

我有一大堆(~1000)来自我正在尝试处理的数据记录器的文件.

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

plot(timevalues,datavalues)
Run Code Online (Sandbox Code Playgroud)

我希望能够以与示波器具有"持久"模式的方式类似的方式同时查看所有这些线.

示波器Diplay

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

Aco*_*rbe 9

您可以完全按照自己的建议进行操作,即绘制信号的热图.

请考虑以下内容:我将构建一个测试信号(来自不同幅度的正弦波),然后我将通过hist3和绘制热图imagesc.

我们的想法是构建一个辅助信号,它只是所有时间历史(包括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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您还可以使用jetcolormap而不是hotcolormap来提高可读性.在下文中,幅度是高斯而不是同质.

在此输入图像描述


bla*_*bla 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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述