作为热图绘制的多条线

8
我有一个数据记录器产生的大量文件(约1000个)需要处理。
如果我想要绘制单个日志文件的趋势,我可以使用
plot(timevalues,datavalues)

我希望能够以类似示波器的“持续”模式查看所有这些行,同时在同一时间内显示出来。
我可能可以拼凑出一个使用直方图的东西,但希望有现成或更优雅的解决方案来解决这个问题。

你的意思是想在一个图中展示1000条线吗? - Robert Seifert
我想使用1000行数据生成一个图表,就像示波器图中一样,它可以同时显示许多更新。通过使用颜色,它显示了这些波形“堆叠”更多的地方(即红色部分),以及波形偶尔出现差异或故障的地方(即蓝色部分)。 - Hugoagogo
1
这个对你有帮助吗?http://www.mathworks.com/help/comm/ref/commscope.eyediagram.html - bla
3个回答

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')

输入图像描述

您还可以使用jet颜色映射代替hot颜色映射,以提高可读性。 下面的振幅是高斯函数而不是均匀函数。

输入图像描述


1
谢谢,这正是我在寻找的。我曾经简单地看过hist3,但不确定如何将其组合起来。在我接受答案之前,除了插值之外,是否有其他方法可以用于在信号快速变化导致线条消失时向热图添加更多数据? - Hugoagogo
@Hugoagogo,我看到了你的问题。我猜插值是解决这个问题的一个好方法。不过,你必须通过在每个时间点进行插值来增加时间分辨率,而不仅仅是在出现问题的地方,否则双变量统计数据将会被破坏。 - Acorbe
我找到了这个代码示例https://www.mathworks.com.au/matlabcentral/answers/63233-interpolating-the-2d-line-to-make-the-new-coordinates-equi-distant,它似乎对我的目的足够好。将此答案标记为已接受。 - Hugoagogo
另一个重要的注意事项是将每个文件中的所有点附加在一起(如示例所示),会导致内存问题以及在重新分配数组时速度变慢。通过预先计算二进制中心,为每个文件计算具有这些中心的直方图并将结果相加,我能够获得很高的速度,从而防止了内存消耗不断增加。 - Hugoagogo

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


1
这是我考虑的方法,效果很好。@Acorbe提供的解决方案更加优雅,所以我接受了那个答案。不过你提供的样本数据更好。 - Hugoagogo

1
为什么不将数据规范化,然后将所有行相加?然后您可以从单个数据文件绘制热图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接