Neuropixels 数据可视化实战指南:用 SpikeInterface 绘制发表级科研图表(scientific-agent-skills / neuropixels-analysis)
2026/9/12 1:36:53 网站建设 项目流程

Neuropixels 数据可视化实战指南:用 SpikeInterface 绘制发表级科研图表(scientific-agent-skills / neuropixels-analysis)

【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills

本篇技术指南围绕 scientific-agent-skills 仓库中 neuropixels-analysis 技能自带的 绘图指南,系统讲解如何用 SpikeInterface 的 widgets 模块与 Matplotlib 为 Neuropixels 胞外记录生成从「漂移检查」到「单单元汇总」的完整可视化套件。读完本文,你将掌握漂移图、波形图、质量指标分布、相关图、峰电位栅栏图、ISI 直方图等全部图型的标准调用方式,以及面向论文发表的分辨率、字号、尺寸与配色设置,并理解这些绘图在仓库端到端管线中的实际落地方式。

1. 绘图在整个 Neuropixels 分析流程中的位置

Neuropixels 高密度探针单次记录可覆盖数百通道(Neuropixels 1.0 为 384 通道、2.0 单柄 384 通道),原始数据无法靠肉眼直接解读。绘图能力贯穿整个分析管线,而非事后装饰:

  • 预处理后、排序前:绘制漂移栅栏图,判断是否需要进行运动校正(排序前漂移超过约 10 μm 会明显劣化质量);
  • 排序与后处理后:绘制波形、模板、相关图、ISI 直方图,判断单元分离质量;
  • 质量指标计算后:绘制指标分布与散点矩阵,支撑阈值筛选与 good/mua/noise 分类;
  • 策展阶段:绘制单元汇总图,供人工或 AI 辅助审阅,导出到 Phy 后做最终人工核验。

仓库的 end-to-end 管线 将上述流程串成了load → preprocess → drift check → motion correction → sorting → postprocess → metrics → curation → export一条命令,其内部就包含绘图步骤(详见 第 12 节)。所有绘图均基于 SpikeInterface 真实 API(spikeinterface.full as sispikeinterface.widgets as sw),无需额外安装绘图专用包。

2. 环境准备与全局绘图设置

绘图脚本通常需要matplotlibnumpy以及 SpikeInterface 的核心与 widgets 模块。绘图指南推荐的初始化设置如下:

import matplotlib.pyplot as plt import numpy as np import spikeinterface.full as si import spikeinterface.widgets as sw # High-quality settings plt.rcParams['figure.dpi'] = 150 plt.rcParams['savefig.dpi'] = 300 plt.rcParams['font.size'] = 10 plt.rcParams['font.family'] = 'sans-serif'
  • figure.dpi = 150:屏幕预览分辨率,兼顾细节与交互流畅度;
  • savefig.dpi = 300:保存 PNG 时的默认输出分辨率,满足大多数期刊的位图要求(600 dpi 的更高规格见第 11 节导出设置);
  • font.size = 10font.family = 'sans-serif':统一正文字号与无衬线字体,保证多张图之间风格一致。

这些是全局基线,面向具体论文排版时还可通过plt.rcParams.update({...})覆盖(见第 11 节)。安装依赖时,仓库建议uv pip install "spikeinterface[full]" probeinterface neo,其中[full]即包含 widgets 与绘图所需组件,详见 SKILL.md 的 Installation 一节。

3. 漂移与运动可视化

漂移(drift)指神经元在探针上的空间位置随时间缓慢移动。排序前必须检查漂移,因此漂移图通常是分析流程中第一张图。

3.1 基础漂移栅栏图(Drift Raster Map)

绘图前需要先做两步计算:峰值检测(detect_peaks)与峰值定位(localize_peaks),分别来自spikeinterface.sortingcomponents.peak_detectionspikeinterface.sortingcomponents.peak_localization

from spikeinterface.sortingcomponents.peak_detection import detect_peaks from spikeinterface.sortingcomponents.peak_localization import localize_peaks noise_levels = si.get_noise_levels(recording, return_in_uV=False) peaks = detect_peaks(recording, method='locally_exclusive', noise_levels=noise_levels, detect_threshold=5, radius_um=50.0) peak_locations = localize_peaks(recording, peaks, method='center_of_mass') si.plot_drift_raster_map( peaks=peaks, peak_locations=peak_locations, recording=recording, clim=(-50, 50), ) plt.savefig('drift_raster.png', bbox_inches='tight')

参数含义与推荐值:

参数含义推荐值
method='locally_exclusive'局部排除式峰值检测,对稠密数据更稳健默认推荐
detect_threshold相对噪声水平的检测阈值(倍数)5
radius_um排除窗口半径(μm)50.0
method='center_of_mass'质心法定位峰值空间位置常用默认
clim=(-50, 50)色彩范围(μV),控制栅栏图对比度按数据幅度调整

get_noise_levels(recording, return_in_uV=False)返回与原始数据相同单位的噪声水平——注意此处传False,这样detect_threshold才能按信号倍数语义解释。

从源码角度看,这条链路在 neuropixels_pipeline.py 的check_drift()函数 中有完整实现:它使用n_jobs=8, chunk_duration='1s', progress_bar=True的 job 参数加速峰值检测与定位,并对超过 10 万个峰值做随机下采样(n_plot = min(100000, len(peaks)))后再用ax.scatter绘制,避免百万级点拖垮渲染。管线还据此估算漂移量:

y_positions = peak_locations['y'] drift_estimate = np.percentile(y_positions, 95) - np.percentile(y_positions, 5)

当该 5–95 分位数跨度超过 20 μm 时,run_pipeline 会自动触发运动校正,这一阈值逻辑正是「先看图、再定量」工程化的体现。

3.2 运动估计结果可视化

调用si.correct_motion(..., output_motion_info=True)会返回(recording, motion_info)二元组。motion_info字典可直接交给内置 widget 绘制(漂移栅栏 + 运动场叠加):

rec_corrected, motion_info = si.correct_motion( recording, preset='nonrigid_fast_and_accurate', output_motion_info=True, folder='motion/' ) # Built-in motion visualization (drift raster + motion field) sw.plot_motion_info(motion_info, recording=recording) plt.savefig('motion_analysis.png', dpi=300, bbox_inches='tight') # Or inspect the Motion object directly motion = motion_info['motion'] displacement = motion.displacement[0] # (n_temporal_bins, n_spatial_bins) temporal_bins = motion.temporal_bins_s[0] plt.figure(figsize=(10, 4)) plt.plot(temporal_bins, displacement, alpha=0.5) plt.xlabel('Time (s)'); plt.ylabel('Displacement (um)'); plt.title('Estimated Motion') plt.savefig('motion_traces.png', dpi=300, bbox_inches='tight')

preset的可选值与适用场景(出自 SKILL.md):

preset适用场景
rigid_fast快速刚性校正
kilosort_like近似 Kilosort 内部行为
nonrigid_accurate严重漂移
nonrigid_fast_and_accurate平衡默认(correct_motion未指定时默认值)
dredge/dredge_fast当前最先进方法

motion.displacement的 shape 为(n_temporal_bins, n_spatial_bins),第一维对应时间分箱、第二维对应空间分箱;配合motion.temporal_bins_s即可手工绘制「时间-位移」曲线,方便嵌入自定义报告模板。

4. 波形图

波形是判断单元分离质量的第一手证据。所有波形类绘图都要求先对 SortingAnalyzer 计算过waveformstemplates扩展(对应 standard_workflow.md 第 5 节)。

4.1 单单元波形

unit_id = 0 # Basic waveforms sw.plot_unit_waveforms(analyzer, unit_ids=[unit_id]) plt.savefig(f'unit_{unit_id}_waveforms.png') # With density map sw.plot_unit_waveform_density_map(analyzer, unit_ids=[unit_id]) plt.savefig(f'unit_{unit_id}_density.png')

plot_unit_waveforms绘制该单元的全部(或采样后的)原始波形叠加;plot_unit_waveform_density_map则用密度色带代替散点叠加,视觉上更利于观察波形主分布与离群伪迹。

4.2 多单元模板对比

# Compare multiple units unit_ids = [0, 1, 2, 3] sw.plot_unit_templates(analyzer, unit_ids=unit_ids) plt.savefig('template_comparison.png')

将多个单元的模板并排绘制,用于快速排查模板相似单元(此时可结合template_similarity扩展进一步量化,见 standard_workflow.md 中的analyzer.compute("template_similarity"))。

4.3 探针上的空间波形

# Show waveforms spatially on probe sw.plot_unit_waveforms_on_probe( analyzer, unit_ids=[unit_id], plot_channels=True, ) plt.savefig(f'unit_{unit_id}_probe.png')

把波形按其记录的电极通道位置绘制在探针几何布局上,可直观看到单元在通道阵列上的空间足迹,用于判断「一个神经元是否被分裂成多个模板」(分裂单元通常共享相同空间足迹)。

5. 质量指标可视化

质量指标是策展(curation)的量化基础。绘图前先保证指标已计算并取出 DataFrame:

analyzer.compute('quality_metrics', metric_names=[ 'firing_rate', 'snr', 'isi_violations_ratio', 'presence_ratio', 'amplitude_cutoff', 'amplitude_cv', ]) metrics = analyzer.get_extension('quality_metrics').get_data()

5.1 指标总览(内置 scatter matrix)

# Built-in quality-metrics widget (scatter matrix of all computed metrics) sw.plot_quality_metrics(analyzer) plt.savefig('quality_overview.png', dpi=300, bbox_inches='tight')

plot_quality_metrics是 SpikeInterface 内置的散点矩阵 widget,把每个单元的所有已计算指标两两对比,异常单元会立即表现为散点云中的离群点,是「先全局浏览、再局部深挖」的高效起点。

5.2 单指标分布直方图

fig, axes = plt.subplots(2, 3, figsize=(12, 8)) metric_names = ['snr', 'isi_violations_ratio', 'presence_ratio', 'amplitude_cutoff', 'firing_rate', 'amplitude_cv'] for ax, metric in zip(axes.flat, metric_names): if metric in metrics.columns: values = metrics[metric].dropna() ax.hist(values, bins=30, edgecolor='black', alpha=0.7) ax.axvline(values.median(), color='red', linestyle='--', label='median') ax.set_xlabel(metric) ax.set_ylabel('Count') ax.legend() plt.tight_layout() plt.savefig('metrics_distribution.png', dpi=300)
  • dropna():部分指标(如需要 PCA 的隔离度指标)在某些单元上可能缺失;
  • 红色中位数参考线帮助快速判断分布偏态——例如isi_violations_ratio的中位数若普遍偏高,说明排序参数可能过松。

指标的含义与经验阈值可对照 QUALITY_METRICS.md:snr > 5为良好、isi_violations_ratio < 0.5允许、presence_ratio > 0.9良好、amplitude_cutoff < 0.1良好、firing_rate > 0.1 Hz良好。绘制分布时在阈值处添加参考线(该文档的ax.axvline(5, ...)等做法)能让阈值决策一目了然。

5.3 关键指标散点矩阵(pandas)

import pandas as pd key_metrics = ['snr', 'isi_violations_ratio', 'presence_ratio', 'firing_rate'] pd.plotting.scatter_matrix( metrics[key_metrics], figsize=(10, 10), alpha=0.5, diagonal='hist', ) plt.savefig('metrics_scatter.png', dpi=300)

pd.plotting.scatter_matrix是轻量替代方案:对角线为直方图、非对角线为两两散点。相比内置 widget,它对「只关心少数几个关键指标」的场景更可控,且不需要额外 SpikeInterface 渲染。

5.4 按标签分组对比(good / mua / noise)

labels_series = pd.Series(labels) fig, axes = plt.subplots(1, 3, figsize=(12, 4)) for ax, metric in zip(axes, ['snr', 'isi_violations_ratio', 'presence_ratio']): for label in ['good', 'mua', 'noise']: mask = labels_series == label if mask.any(): ax.hist(metrics.loc[mask.index[mask], metric], alpha=0.5, label=label, bins=20) ax.set_xlabel(metric) ax.legend() plt.tight_layout() plt.savefig('metrics_by_label.png', dpi=300)

这张图用于验证策展阈值是否合理:理想情况下 three 类在snrisi_violations_ratiopresence_ratio上的分布应可区分。若goodmua在关键指标上高度重叠,说明需要收紧/调整阈值。标签来源可以是 standard_workflow.md 的阈值查询结果,也可以是 神经管线curate_units()allen/ibl/strict三种预设的输出(其分类逻辑:先以snr < 1.5判 noise,再按各预设的presence_ratioisi_violations_ratioamplitude_cutofffiring_rate边界分 good/mua/unsorted)。

6. 相关图(Correlograms)

相关图反映单元发放的时间结构,是评估「是否真的只有一个神经元」的核心工具:真正的单单元在自相关图上应在 0 ms 附近存在不应期缺口。

6.1 自相关图

sw.plot_autocorrelograms( analyzer, unit_ids=[unit_id], window_ms=50, bin_ms=1, ) plt.savefig(f'unit_{unit_id}_acg.png')

window_ms=50表示展示 ±50 ms 的时间窗,bin_ms=1表示 1 ms 分箱。仓库的排序后处理默认采用window_ms=50.0, bin_ms=1.0(见 analysis_template.py 与 neuropixels_pipeline.py),与分析模板保持一致可避免「绘图参数与计算参数不一致」的困惑。

6.2 互相关图

unit_pairs = [(0, 1), (0, 2), (1, 2)] sw.plot_crosscorrelograms( analyzer, unit_pairs=unit_pairs, window_ms=50, bin_ms=1, ) plt.savefig('crosscorrelograms.png')

unit_pairs显式指定要考察的单元对。互相关图中 0 ms 附近的对称峰值提示功能连接或共同输入,而单侧偏移峰则提示单向连接或排序分裂。

6.3 相关图矩阵

sw.plot_autocorrelograms( analyzer, unit_ids=analyzer.sorting.unit_ids[:10], # First 10 units ) plt.savefig('acg_matrix.png')

不指定window_ms/bin_ms时使用计算扩展时保存的参数(此处沿用 50/1 ms)。一次绘制前 10 个单元的自相关图矩阵,作为「全单元质量一瞥」。

7. 峰电位序列图(Spike Train)

7.1 栅栏图(Raster)

sw.plot_rasters( sorting, time_range=(0, 30), # First 30 seconds unit_ids=unit_ids[:5], ) plt.savefig('raster.png')

time_range=(0, 30)限定只显示前 30 秒;unit_ids[:5]控制参与绘制的单元数量,避免单元过多时栅栏过密无法阅读。

7.2 随时间变化的发放率

unit_id = 0 spike_train = sorting.get_unit_spike_train(unit_id) fs = recording.get_sampling_frequency() times = spike_train / fs # Compute firing rate histogram bin_width = 1.0 # seconds bins = np.arange(0, recording.get_total_duration(), bin_width) hist, _ = np.histogram(times, bins=bins) firing_rate = hist / bin_width plt.figure(figsize=(12, 3)) plt.bar(bins[:-1], firing_rate, width=bin_width, edgecolor='none') plt.xlabel('Time (s)') plt.ylabel('Firing rate (Hz)') plt.title(f'Unit {unit_id} firing rate') plt.savefig(f'unit_{unit_id}_firing_rate.png', dpi=300)
  • 峰电位时间戳以采样点为整数(sample index),需除以采样率fs转为秒;
  • bin_width = 1.0秒的直方图即 1 秒分辨率下的瞬时发放率曲线;
  • 该图能直接暴露「单元在记录中途消失」(发放率塌到 0)等稳定性问题,与presence_ratio指标互为印证。

8. 探针与位置图

8.1 探针布局

sw.plot_probe_map(recording, with_channel_ids=True) plt.savefig('probe_layout.png')

plot_probe_map按探针几何绘制所有通道位置。仓库的 explore_recording.py 用它生成长条形的探针布局图(figsize=(4, 12)),用于数据检查阶段的probe_map.png输出。

8.2 单元在探针上的位置

sw.plot_unit_locations(analyzer, with_channel_ids=True) plt.savefig('unit_locations.png')

plot_unit_locations展示所有单元在探针深度上的分布,需要已计算unit_locations扩展(standard_workflow.md 使用method="monopolar_triangulation"单极三角定位)。

8.3 峰电位位置分布

sw.plot_spike_locations(analyzer, unit_ids=[unit_id]) plt.savefig(f'unit_{unit_id}_spike_locations.png')

展示单个单元每次发放的空间位置散布,散布范围小且集中说明该单元空间足迹稳定,范围过大则可能混入了邻近神经元。

9. 幅度图

9.1 幅度随时间变化

sw.plot_amplitudes( analyzer, unit_ids=[unit_id], plot_histograms=True, ) plt.savefig(f'unit_{unit_id}_amplitudes.png')

plot_histograms=True在时间序列旁边附加幅度分布直方图。幅度随时间的稳定性是单元质量的重要维度——若幅度呈台阶式突变,往往是两个单元被合并或单元在漂移。

9.2 手动绘制幅度分布

amplitudes = analyzer.get_extension('spike_amplitudes').get_data() spike_vector = sorting.to_spike_vector() unit_idx = list(sorting.unit_ids).index(unit_id) unit_mask = spike_vector['unit_index'] == unit_idx unit_amps = amplitudes[unit_mask] fig, ax = plt.subplots(figsize=(6, 4)) ax.hist(unit_amps, bins=50, edgecolor='black', alpha=0.7) ax.axvline(np.median(unit_amps), color='red', linestyle='--', label='median') ax.set_xlabel('Amplitude (uV)') ax.set_ylabel('Count') ax.set_title(f'Unit {unit_id} Amplitude Distribution') ax.legend() plt.savefig(f'unit_{unit_id}_amp_dist.png', dpi=300)

这里展示了直接从扩展取数的底层做法:spike_amplitudes扩展的get_data()返回与sorting.to_spike_vector()行序一致的幅度数组,因此可用unit_index掩码按单元切片。该模式是后续「手动多面板汇总图」(第 10.2 节)的基础。

10. ISI 图(发放间隔直方图)

10.1 内置 ISI 分布

sw.plot_isi_distribution( analyzer, unit_ids=[unit_id], window_ms=100, bin_ms=1, ) plt.savefig(f'unit_{unit_id}_isi.png')

发放间隔(Inter-Spike Interval, ISI)是检验不应期的最直接手段:所有神经元都有约 1.5 ms 的不应期,ISI 直方图在 0 ms 附近的缺口越干净,单元隔离质量越高(参考 QUALITY_METRICS.md 中isi_violations_ratio一节)。

10.2 带不应期参考线的精细 ISI 图

spike_train = sorting.get_unit_spike_train(unit_id) fs = recording.get_sampling_frequency() isis = np.diff(spike_train) / fs * 1000 # ms fig, ax = plt.subplots(figsize=(8, 4)) ax.hist(isis[isis < 100], bins=100, edgecolor='black', alpha=0.7) ax.axvline(1.5, color='red', linestyle='--', label='1.5ms refractory') ax.axvline(3.0, color='orange', linestyle='--', label='3ms threshold') ax.set_xlabel('ISI (ms)') ax.set_ylabel('Count') ax.set_title(f'Unit {unit_id} ISI Distribution') ax.legend() plt.savefig(f'unit_{unit_id}_isi_detailed.png', dpi=300)
  • np.diff(spike_train) / fs * 1000:相邻发放时间差(秒)转毫秒;
  • 1.5 ms 红线标注生理不应期边界,3.0 ms 橙线标注isi_violations_ratio计算中常用的滑动窗口参考点;
  • 仅统计< 100 ms的间隔,聚焦短间隔区域,长间隔在大尺度分布中会被压缩到不可读。

11. 汇总图(Summary)

11.1 内置单单元汇总面板

# Built-in one-call summary (waveform, template, ACG, amplitudes, location) sw.plot_unit_summary(analyzer, unit_id=unit_id) plt.savefig(f'unit_{unit_id}_summary.png', dpi=300, bbox_inches='tight')

plot_unit_summary一个调用即可生成包含波形、模板、自相关图、幅度轨迹与单元位置的多面板图,是审阅单个单元的最高效入口。该图在 AI 辅助策展中同样关键:AI_CURATION.md 推荐先渲染unit_summary图再交给视觉语言模型判断隔离质量,并给出每个面板的审阅要点:

面板内容观察要点
Waveforms单次波形一致性、形状
Template均值 ± 标准差干净的负峰、生理形状
Autocorrelogram发放时间结构0 ms 处的不应期缺口
Amplitudes幅度随时间变化稳定性、无漂移
ISI histogram发放间隔不应期缺口 < ~1.5 ms

11.2 手动多面板汇总图

当需要完全控制面板组成与排版(例如论文补充图)时,可从扩展直接取数手动拼装:

fig = plt.figure(figsize=(16, 12)) # Waveforms ax1 = fig.add_subplot(2, 3, 1) wfs = analyzer.get_extension('waveforms').get_waveforms(unit_id) for i in range(min(50, wfs.shape[0])): ax1.plot(wfs[i, :, 0], 'k', alpha=0.1, linewidth=0.5) template = wfs.mean(axis=0)[:, 0] ax1.plot(template, 'b', linewidth=2) ax1.set_title('Waveforms') # Template ax2 = fig.add_subplot(2, 3, 2) templates_ext = analyzer.get_extension('templates') template = templates_ext.get_unit_template(unit_id, operator='average') template_std = templates_ext.get_unit_template(unit_id, operator='std') x = range(template.shape[0]) ax2.plot(x, template[:, 0], 'b', linewidth=2) ax2.fill_between(x, template[:, 0] - template_std[:, 0], template[:, 0] + template_std[:, 0], alpha=0.3) ax2.set_title('Template') # Autocorrelogram ax3 = fig.add_subplot(2, 3, 3) correlograms = analyzer.get_extension('correlograms') ccg, bins = correlograms.get_data() unit_idx = list(sorting.unit_ids).index(unit_id) ax3.bar(bins[:-1], ccg[unit_idx, unit_idx, :], width=bins[1]-bins[0], color='gray') ax3.axvline(0, color='r', linestyle='--', alpha=0.5) ax3.set_title('Autocorrelogram') # Amplitudes ax4 = fig.add_subplot(2, 3, 4) amps_ext = analyzer.get_extension('spike_amplitudes') amps = amps_ext.get_data() spike_vector = sorting.to_spike_vector() unit_mask = spike_vector['unit_index'] == unit_idx unit_times = spike_vector['sample_index'][unit_mask] / fs unit_amps = amps[unit_mask] ax4.scatter(unit_times, unit_amps, s=1, alpha=0.3) ax4.set_xlabel('Time (s)') ax4.set_ylabel('Amplitude') ax4.set_title('Amplitudes') # ISI ax5 = fig.add_subplot(2, 3, 5) isis = np.diff(sorting.get_unit_spike_train(unit_id)) / fs * 1000 ax5.hist(isis[isis < 100], bins=50, color='gray', edgecolor='black') ax5.axvline(1.5, color='r', linestyle='--') ax5.set_xlabel('ISI (ms)') ax5.set_title('ISI Distribution') # Metrics ax6 = fig.add_subplot(2, 3, 6) unit_metrics = metrics.loc[unit_id] text_lines = [f"{k}: {v:.4f}" for k, v in unit_metrics.items() if not np.isnan(v)] ax6.text(0.1, 0.9, '\n'.join(text_lines[:8]), transform=ax6.transAxes, verticalalignment='top', fontsize=10, family='monospace') ax6.axis('off') ax6.set_title('Metrics') plt.tight_layout() plt.savefig(f'unit_{unit_id}_full_summary.png', dpi=300)

逐面板实现要点:

  • Waveformsget_waveforms(unit_id)返回 shape 为(n_spikes, n_samples, n_channels)的数组,取[:, :, 0]即主通道波形,绘制前 50 条半透明黑线叠加均值蓝线;
  • Templatetemplates扩展的get_unit_template(unit_id, operator='average'/'std')分别取均值与标准差模板,用fill_between绘制均值 ± 标准差包络;
  • Autocorrelogramcorrelograms.get_data()返回(ccg, bins),其中ccg的 shape 为(n_units, n_units, n_bins),对角线切片ccg[unit_idx, unit_idx, :]即目标单元的自相关;
  • Metrics:从质量指标 DataFrame 中取当前单元行,过滤 NaN 后以等宽字体列出前 8 项——注意metrics.loc[unit_id]要求索引与单元 ID 一一对应,若排序器返回的 unit_id 是整数,此处直接可用。

这套模式把「widget 封装的渲染」与「扩展数据」打通,是理解 SpikeInterface 数据模型(waveforms / templates / correlograms / spike_amplitudes 均为 analyzer 的扩展)的最佳示例。

12. 发表级排版设置

12.1 图幅尺寸

# Single column (3.5 inches) fig, ax = plt.subplots(figsize=(3.5, 3)) # Double column (7 inches) fig, ax = plt.subplots(figsize=(7, 4)) # Full page fig, ax = plt.subplots(figsize=(7, 9))

按目标期刊的单栏(约 3.5 英寸)、双栏(约 7 英寸)与整页(7 × 9 英寸)规格创建画布,是避免投稿后被要求重排图的低成本习惯。

12.2 字号设置

plt.rcParams.update({ 'font.size': 8, 'axes.titlesize': 9, 'axes.labelsize': 8, 'xtick.labelsize': 7, 'ytick.labelsize': 7, 'legend.fontsize': 7, 'font.family': 'Arial', })

打印(print)规格下字号普遍在 7–9 pt 之间:标题略大于正文(9),坐标轴标签 8,刻度与图例 7。font.family='Arial'是多数期刊接受的无衬线默认字体。

12.3 导出设置

# For publications plt.savefig('figure.pdf', format='pdf', bbox_inches='tight') plt.savefig('figure.svg', format='svg', bbox_inches='tight') # High-res PNG plt.savefig('figure.png', dpi=600, bbox_inches='tight', facecolor='white')
  • 矢量格式优先:PDF/SVG 用于正文插图与投稿系统,缩放不失真;
  • 高分辨率位图:600 dpi PNG 用于预览与部分期刊的位图要求;
  • bbox_inches='tight'裁掉空白边距,facecolor='white'避免透明背景在部分排版环境变黑。

12.4 色盲友好配色

# Colorblind-friendly colors = ['#0072B2', '#E69F00', '#009E73', '#CC79A7', '#F0E442'] # For good/mua/noise label_colors = {'good': '#2ecc71', 'mua': '#f39c12', 'noise': '#e74c3c'}

第一组来自色盲友好的 Okabe-Ito 调色板(蓝色、橙色、绿色、品红、黄色),第二组用于区分策展标签。将label_colors传入第 5.4 节的分组直方图,即可让 good/mua/noise 在黑白打印或色盲读者眼中依然可区分。

13. 与仓库脚本结合:pipeline 与探索脚本中的真实绘图

绘图指南中的 API 在仓库脚本中有多处直接落地,可作为「怎么把图画进自动化流程」的参考:

探索脚本 explore_recording.py--plot参数触发三张检查图——plot_probe()(探针布局)、plot_traces()(抽取至多 20 通道的 1 秒原始轨迹,按通道偏移叠加绘制)、plot_power_spectrum()scipy.signal.welch计算功率谱,用 300/6000 Hz 竖线标注滤波边界)。调用方式:

python scripts/explore_recording.py /path/to/data --plot --output plots/

端到端管线 neuropixels_pipeline.pycheck_drift()将漂移栅栏以散点图形式保存为drift_check.png(12 × 6 英寸、150 dpi),同时在终端输出估算漂移范围,供run_pipeline()决定是否执行运动校正。其余导出环节还通过si.export_report(analyzer, "report/", format="png")自动生成全单元图报告(见 SKILL.md 的 Export 一节),可作为「批量出图」的现成方案。

分析模板 analysis_template.py:完整模板展示了绘图所需的扩展计算顺序(random_spikes → waveforms → templates → noise_levels → spike_amplitudes → correlograms → unit_locations),并输出quality_metrics.csv——绘图中用到的metricsDataFrame 正来自这里。复制该模板到自己的工作目录(cp assets/analysis_template.py my_analysis.py)并修改 PARAMETERS 段,即可获得包含全部绘图前提的基线工程。

14. 常见误区与最佳实践

  1. 先算扩展再绘图:所有波形/相关图/幅度图依赖 analyzer 扩展;漏算waveformscorrelograms时 widget 会直接报错。建议按 analysis_template.py 的顺序一次性计算。
  2. 绘图参数与计算参数保持一致:自相关/互相关/ISI 的window_msbin_ms最好与analyzer.compute('correlograms', ...)保持一致,避免看到与数据实际分箱不一致的图。
  3. 漂移图必须在排序前看:超过约 10 μm 的漂移会显著劣化排序质量(SKILL.md 的 Pitfalls),管线以 20 μm 为自动运动校正触发阈值。
  4. 栅栏图注意点密度:超过约 10 万个峰时建议随机下采样再散点绘制(管线做法),否则渲染极慢且文件巨大。
  5. 汇总图用于终审:内置plot_unit_summary是人工或 AI 审阅每个单元的标准入口,结合 AI_CURATION.md 中「waveform 一致性、自相关不应期缺口、幅度稳定性」三条准则可系统化判断 good/mua/noise。
  6. 面向发表的图尽早确定规格:从第一张图就套用第 12 节的字号/尺寸/配色,避免后期批量重排。

15. 小结

从漂移栅栏图到手动多面板汇总图,SpikeInterface 的 widgets 模块覆盖了 Neuropixels 分析全生命周期的可视化需求。绘图指南给出的每一类图都对应一个可验证的质量维度:漂移图对应运动稳定性、波形/模板图对应空间与形态特征、相关图与 ISI 图对应不应期与隔离质量、幅度图对应稳定性、质量指标图对应策展决策。将这些图嵌入仓库提供的探索脚本、端到端管线与分析模板,即可得到从原始数据到论文图表的完整、可复现的视觉工作流。完整函数清单可对照 api_reference.md,深入理解指标阈值可阅读 QUALITY_METRICS.md。

【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询