所以我有一个二进制矩阵,96x4000,其中96代表我记录的96个电极,4000个是时间点,即4000ms。每个1代表来自该神经元的一个尖峰。
我现在想做的是及时绘制这些频道的栅格。每个时间点必须显示所有96个通道中发生的尖峰。让我们说在第一个时间点,只有11个频道飙升。因此该行必须仅出现在11行中。
现在我想在每个时间点(动画)同时绘制所有96行。
我已经到了这里 -
https://gfycat.com/gifs/detail/EmptyFrailHalibut
但我仍然得到了这些大牌 -
这是我目前的代码 -
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)
如果有人可以帮助我,我将非常感激!谢谢!
答案 0 :(得分:0)
“大线”可能只是所有神经元都在一起发射的情况。因为您要为每个神经元创建一条短垂直线,所以它们会在视觉上叠加并连接在一起。一种选择是缩短用于每个电子的垂直距离(高度)从1到0.5。例如,不是第一个电子来自[1 2],而是从[1.2,1.8]开始。
我更喜欢的另一种选择是使用marker
选项,并将图形创建为点(每个神经元一个),每个电子一个点而不是一个短垂直线。交错的白色空间可以提供更自然的视觉差距。
您也可以对代码进行矢量化,而不是使用find
,因为您已经在处理二进制数据。要执行此操作,请创建y位置的矢量,对应于应在垂直轴上绘制每个通道的位置,并使用当时的尖峰对其进行索引。您的t
也是如此。
这是一种方法,我在模拟spikeTrains
和t_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不需要这样做;只是需要注意的事项。