我想在每个时间点为96个通道的光栅图设置动画

时间:2017-08-23 17:15:11

标签: matlab animation raster

所以我有一个二进制矩阵,96x4000,其中96代表我记录的96个电极,4000个是时间点,即4000ms。每个1代表来自该神经元的一个尖峰。

我现在想做的是及时绘制这些频道的栅格。每个时间点必须显示所有96个通道中发生的尖峰。让我们说在第一个时间点,只有11个频道飙升。因此该行必须仅出现在11行中。

现在我想在每个时间点(动画)同时绘制所有96行。

我已经到了这里 -

https://gfycat.com/gifs/detail/EmptyFrailHalibut

但我仍然得到了这些大牌 -

http://imgur.com/a/vL68S

这是我目前的代码 -

figure
v = VideoWriter('testRaster')
open(v);
hold on
ylim([1 100])
xlim([-1 3])
for i = 1:4000
valIdx = [find(spikeTrains(:,i)==1)]';
if ~isempty(valIdx)
line([t(i)/1000 t(i)/1000],[[valIdx]' (spikeTrains(valIdx,i).*[valIdx]')+1],'Color','k')
drawnow
writeVideo(v, getframe(gcf));
end
end
close(v)

如果有人可以帮助我,我将非常感激!谢谢!

1 个答案:

答案 0 :(得分:0)

“大线”可能只是所有神经元都在一起发射的情况。因为您要为每个神经元创建一条短垂直线,所以它们会在视觉上叠加并连接在一起。一种选择是缩短用于每个电子的垂直距离(高度)从1到0.5。例如,不是第一个电子来自[1 2],而是从[1.2,1.8]开始。

我更喜欢的另一种选择是使用marker选项,并将图形创建为点(每个神经元一个),每个电子一个点而不是一个短垂直线。交错的白色空间可以提供更自然的视觉差距。

您也可以对代码进行矢量化,而不是使用find,因为您已经在处理二进制数据。要执行此操作,请创建y位置的矢量,对应于应在垂直轴上绘制每个通道的位置,并使用当时的尖峰对其进行索引。您的t也是如此。

这是一种方法,我在模拟spikeTrainst_s(您的t)的值。

clear all; close all;
figure;
v = VideoWriter('testRaster');
numChannels = 96;
spikeTrains = (randi(2,numChannels,4000)-1)&1;  %make it logical matrix
channels = 1:numChannels;
T_ms = 4000;
t_s = repmat(1:T_ms,numChannels,1)/1000;
open(v);
hold on;
ylim([1 100]);
xlim([-1 3]);
for k = 1:T_ms
    line(t_s(spikeTrains(:,k),k),channels(spikeTrains(:,k)),'Color','k',...
             'marker','.','linestyle','none');
    drawnow();
    writeVideo(v, getframe(gcf));
end
close(v)

如果spikeTrains是数字(类型为double)1和0,那么您可能需要将它们转换为逻辑1和0。我使用上面的&做了这个,但还有其他方法可以做到这一点

  • spikeTrains = spikeTrains==1; % transform numerical matrix to logical
  • spikeTrains = spikeTrains&1; % another way to do it

某些早期版本的MATLAB不需要这样做;只是需要注意的事项。