.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "examples/interpolate_channel.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_examples_interpolate_channel.py: Interpolate Channel. ======================== Channel interpolation example. .. GENERATED FROM PYTHON SOURCE LINES 7-21 .. code-block:: Python import os import matplotlib.pyplot as plt import mne import numpy as np from eegrasp import EEGrasp current_dir = os.getcwd() os.chdir(os.path.dirname(current_dir)) data_dir = './datasets' #os.makedirs(data_dir, exist_ok=True) #os.environ['MNE_EEGBCI_PATH'] = data_dir .. GENERATED FROM PYTHON SOURCE LINES 22-44 .. code-block:: Python subjects = np.arange(1, 10) runs = [4, 8, 12] # Download eegbci dataset through MNE # Comment the following line if already downloaded raw_fnames = [ mne.datasets.eegbci.load_data(s, runs, path=data_dir, update_path=True) for s in subjects ] raw_fnames = np.reshape(raw_fnames, -1) raws = [mne.io.read_raw_edf(f, preload=True) for f in raw_fnames] raw = mne.concatenate_raws(raws) mne.datasets.eegbci.standardize(raw) raw.annotations.rename(dict(T1='left', T2='right')) montage = mne.channels.make_standard_montage('standard_1005') raw.set_montage(montage) eeg_pos = np.array( [pos for _, pos in raw.get_montage().get_positions()['ch_pos'].items()]) ch_names = montage.ch_names .. rst-class:: sphx-glr-script-out .. code-block:: none Downloading EEGBCI data Downloading file 'S001/S001R04.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S001/S001R04.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S001/S001R08.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S001/S001R08.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S001/S001R12.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S001/S001R12.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Attempting to create new mne-python configuration file: /home/docs/.mne/mne-python.json Download complete in 39s (7.4 MB) Downloading EEGBCI data Downloading file 'S002/S002R04.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S002/S002R04.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S002/S002R08.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S002/S002R08.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S002/S002R12.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S002/S002R12.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Download complete in 36s (7.3 MB) Downloading EEGBCI data Downloading file 'S003/S003R04.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S003/S003R04.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S003/S003R08.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S003/S003R08.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S003/S003R12.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S003/S003R12.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Download complete in 35s (7.4 MB) Downloading EEGBCI data Downloading file 'S004/S004R04.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S004/S004R04.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S004/S004R08.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S004/S004R08.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S004/S004R12.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S004/S004R12.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Download complete in 35s (7.3 MB) Downloading EEGBCI data Downloading file 'S005/S005R04.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S005/S005R04.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S005/S005R08.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S005/S005R08.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S005/S005R12.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S005/S005R12.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Download complete in 37s (7.3 MB) Downloading EEGBCI data Downloading file 'S006/S006R04.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S006/S006R04.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S006/S006R08.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S006/S006R08.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S006/S006R12.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S006/S006R12.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Download complete in 33s (7.3 MB) Downloading EEGBCI data Downloading file 'S007/S007R04.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S007/S007R04.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S007/S007R08.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S007/S007R08.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S007/S007R12.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S007/S007R12.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Download complete in 36s (7.4 MB) Downloading EEGBCI data Downloading file 'S008/S008R04.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S008/S008R04.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S008/S008R08.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S008/S008R08.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S008/S008R12.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S008/S008R12.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Download complete in 34s (7.3 MB) Downloading EEGBCI data Downloading file 'S009/S009R04.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S009/S009R04.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S009/S009R08.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S009/S009R08.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Downloading file 'S009/S009R12.edf' from 'https://physionet.org/files/eegmmidb/1.0.0/S009/S009R12.edf' to '/home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0'. Download complete in 40s (7.3 MB) Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S001/S001R04.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19999 = 0.000 ... 124.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S001/S001R08.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19999 = 0.000 ... 124.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S001/S001R12.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19999 = 0.000 ... 124.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S002/S002R04.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S002/S002R08.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S002/S002R12.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S003/S003R04.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19999 = 0.000 ... 124.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S003/S003R08.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19999 = 0.000 ... 124.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S003/S003R12.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19999 = 0.000 ... 124.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S004/S004R04.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S004/S004R08.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S004/S004R12.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S005/S005R04.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S005/S005R08.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S005/S005R12.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S006/S006R04.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S006/S006R08.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S006/S006R12.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S007/S007R04.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19999 = 0.000 ... 124.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S007/S007R08.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19999 = 0.000 ... 124.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S007/S007R12.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19999 = 0.000 ... 124.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S008/S008R04.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S008/S008R08.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S008/S008R12.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S009/S009R04.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S009/S009R08.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... Extracting EDF parameters from /home/docs/checkouts/readthedocs.org/user_builds/eegrasp/checkouts/main/examples/datasets/MNE-eegbci-data/files/eegmmidb/1.0.0/S009/S009R12.edf... EDF file detected Setting channel info structure... Creating raw.info structure... Reading 0 ... 19679 = 0.000 ... 122.994 secs... .. GENERATED FROM PYTHON SOURCE LINES 45-52 .. code-block:: Python L_FREQ = 1 # Hz H_FREQ = 30 # Hz raw.filter(L_FREQ, H_FREQ, fir_design='firwin', skip_by_annotation='edge') raw, ref_data = mne.set_eeg_reference(raw) events, events_id = mne.events_from_annotations(raw) .. rst-class:: sphx-glr-script-out .. code-block:: none Filtering raw data in 27 contiguous segments Setting up band-pass filter from 1 - 30 Hz FIR filter parameters --------------------- Designing a one-pass, zero-phase, non-causal bandpass filter: - Windowed time-domain design (firwin) method - Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation - Lower passband edge: 1.00 - Lower transition bandwidth: 1.00 Hz (-6 dB cutoff frequency: 0.50 Hz) - Upper passband edge: 30.00 Hz - Upper transition bandwidth: 7.50 Hz (-6 dB cutoff frequency: 33.75 Hz) - Filter length: 529 samples (3.306 s) [Parallel(n_jobs=1)]: Done 17 tasks | elapsed: 0.0s [Parallel(n_jobs=1)]: Done 64 out of 64 | elapsed: 0.0s finished EEG channel type selected for re-referencing Applying average reference. Applying a custom ('EEG',) reference. Used Annotations descriptions: [np.str_('T0'), np.str_('left'), np.str_('right')] .. GENERATED FROM PYTHON SOURCE LINES 53-54 Exclude bad channels .. GENERATED FROM PYTHON SOURCE LINES 54-62 .. code-block:: Python TMIN, TMAX = -1.0, 3.0 picks = mne.pick_types(raw.info, meg=False, eeg=True, stim=False, eog=False, exclude='bads') epochs = mne.Epochs(raw, events, events_id, picks=picks, tmin=TMIN, tmax=TMAX, baseline=(-1, 0), detrend=1) data = epochs.average().get_data() .. rst-class:: sphx-glr-script-out .. code-block:: none Not setting metadata 810 matching events found Applying baseline correction (mode: mean) 0 projection items activated .. GENERATED FROM PYTHON SOURCE LINES 63-64 1. Define index of the missing channel .. GENERATED FROM PYTHON SOURCE LINES 64-77 .. code-block:: Python MISSING_IDX = 5 lost_ch = data[MISSING_IDX, :].copy() data[MISSING_IDX, :] = np.nan # delete channel info from array # 2. Initialize instance of EEGrasp eegsp = EEGrasp(data, eeg_pos, ch_names) # 3. Compute the electrode distance matrix dist_mat = eegsp.compute_distance(normalize=True) # 4. Compute the graph weights and make graph structure graph = eegsp.compute_graph(epsilon=0.5, sigma=0.1) W = eegsp.graph_weights # 5. Interpolate missing channel interpolated = eegsp.interpolate_channel(missing_idx=MISSING_IDX, graph=graph) .. GENERATED FROM PYTHON SOURCE LINES 78-90 .. code-block:: Python fs = epochs.info['sfreq'] t = np.arange(0, len(lost_ch) / fs, 1 / fs) plt.close('all') plt.figure(figsize=(6.5, 3.5)) plt.plot(t, lost_ch * 1e6, label='Original') plt.plot(t, interpolated[MISSING_IDX] * 1e6, label='Interpolated') plt.legend() plt.xlabel('tiempo [s]') plt.ylabel('voltaje [uV]') plt.title('Imputación de datos faltantes de un electrodo') plt.tight_layout() plt.show() .. image-sg:: /examples/images/sphx_glr_interpolate_channel_001.png :alt: Imputación de datos faltantes de un electrodo :srcset: /examples/images/sphx_glr_interpolate_channel_001.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-timing **Total running time of the script:** (5 minutes 34.219 seconds) **Estimated memory usage:** 1231 MB .. _sphx_glr_download_examples_interpolate_channel.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: interpolate_channel.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: interpolate_channel.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: interpolate_channel.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_