    [2]:

    from matplotlib import pyplot as plt
    from matplotlib import lines
    import matplotlib
    import numpy as np

    plt.style.use('ggplot')

# Databases

    [3]:

    def adjust_lightness(color, amount=0.5):
        import matplotlib.colors as mc
        import colorsys
        try:
            c = mc.cnames[color]
        except:
            c = color
        c = colorsys.rgb_to_hls(*mc.to_rgb(c))
        return colorsys.hls_to_rgb(c[0], max(0, min(1, amount * c[1])), c[2])

    def build_paradigm(data):
    #     ax = plt.subplot(111)
    #     ax = fig.add_subplot(axes_class=AxesZero)

        ax = plt.gca()

    #     ax = plt.axes(frameon=False)
        ax.set_frame_on(False)
        ax.get_xaxis().tick_bottom()
        ax.axes.get_yaxis().set_visible(False)

        Y = 1
        ticks = []
        ticks_label = []
        extra = []
        alpha = 1

        max_y = 0
        min_y = 0
        for i, frame  in  enumerate(data):

            p = frame['time']
            alpha = frame.get('alpha', 1)
            label = frame['label']
            label_extra = frame.get('label_extra', None)
            color = frame.get('color', f'C{i}')

            rotation = frame.get('rotation', 0)
            fontsize = frame.get('fontsize', 14)

            level = frame.get('level', (0, 1))
            level = [0.1+l for l in level]
            max_y = max(max_y, *level)
            min_y = min(min_y, *level)

            restart = frame.get('restart', False)

            if restart:
                ticks_label.extend([i-p[0] for i in p])
                p = [i+ticks[-1] for i in p]
            else:
                ticks_label.extend(p)

            ticks.extend(p)

            plt.fill_between([p[0], p[-1]], *level, facecolor=color, alpha=alpha, linewidth=0, edgecolor=color)

            if hatch := frame.get('hatch', ''):
                plt.fill_between([p[0], p[-1]], *level, edgecolor=adjust_lightness(color, 0.85), facecolor='none', alpha=1, hatch=hatch, linewidth=0)

            if len(p) > 2:
                plt.fill_between(p[1:], *level, edgecolor=adjust_lightness(color, 0.85), facecolor='none', alpha=1, hatch='///', linewidth=0)
                if label_extra is None:
    #                 label_extra = f'{1000*(p[2]-p[1]):.0f} ms'
                    label_extra = f"\n{abs(p[1] - p[0]):.1f}s ~ {abs(p[-1]- p[0]):.1f}s"
    #             if label_extra != '':
    #                 plt.annotate(label_extra, (np.mean(p[1:]), np.mean(level)), ha='center', va='center', color='w', fontsize=fontsize, rotation=rotation)
                elif label_extra:
                    label_extra = f"\n{label_extra}"
            else:
                label_extra = ''

    #         if frame.get('ha', 'center') == 'center':
    #             x_ = np.mean(p)
    #         else:
    #             x_ = np.min(p)+0.1

            if marker := frame.get('marker', False):

                lev = [1+(0.2*marker['level']), 1.2+(0.2*marker['level'])]
    #             q = p[:]

                max_y = max(max_y, *lev)
                lev = [0.1+l for l in lev]

                q = p[0]
                extra.append(q+marker['width'])
                plt.fill_between([q, q+marker['width']], *lev, facecolor=color, alpha=alpha, linewidth=0, edgecolor=color)
                plt.fill_between([q, q+marker['width']], *lev, edgecolor=adjust_lightness(color, 0.85), facecolor='none', alpha=1, hatch='...', linewidth=0)
                plt.annotate(marker['label'], (np.mean([q, q+marker['width']]), np.mean(lev)), ha='center', va='center', color='w', fontsize=12, zorder=999)
                plt.vlines(q, marker.get('min', 0.1), lev[1], linestyle='--', linewidth=1, color='k', zorder=99)

                if marker.get('label_end', False):
                    q = p[-1]
                    extra.append(q+marker['width'])
                    plt.fill_between([q, q+marker['width']], *lev, facecolor=color, alpha=alpha, linewidth=0, edgecolor=color)
                    plt.fill_between([q, q+marker['width']], *lev, edgecolor=adjust_lightness(color, 0.85), facecolor='none', alpha=1, hatch='...', linewidth=0)
                    plt.annotate(marker['label_end'], (np.mean([q, q+marker['width']]), np.mean(lev)), ha='center', va='center', color='w', fontsize=12, zorder=999)
                    plt.vlines(q, 0.1, lev[1], linestyle='--', linewidth=1, color='k', zorder=99)

            a, b = 0, 0
    #         if rotation == 90:
    #             a = -0.05
    #             if label_extra:
    #                 a -= 1
    #         else:
    #             b = 0.05
    #             if label_extra:
    #                 b -= 0.05

            plt.annotate(f"{label}{label_extra}", (np.mean([p[0], p[-1]])-a, np.mean(level)-b), ha=frame.get('ha', 'center'), va='center', color='w', fontsize=fontsize, rotation=rotation)

        xmin, xmax = min(ticks), max(ticks+extra)

        plt.xticks([])
        ax.set_xticklabels([])
    #     plt.xticks(list(ticks))
    #     ax.set_xticklabels([f"{i:.1f}s" for i in list(ticks_label)])
        ax.add_artist(lines.Line2D((xmin, xmax), (0, 0), color='black', linewidth=2))

        plt.xlabel('Time')

        plt.xlim(xmin, xmax)

        plt.ylim(min_y, max_y+0.1)

        ax.arrow(0, 0, xmax, 0, fc='k', ec='none',
                 head_width=max_y * 0.07, head_length=max_y * 0.07,
                 length_includes_head= False,
                 clip_on = False)

    [4]:

    # from matplotlib import pyplot as plt
    # from bci_framework.utils import build_paradigm
    fig = plt.figure(figsize=(10, 4), dpi=90)

    paradigm = (
        {
            'time': (-3, 0),
            'level': (0.5, 1),
            'label': 'Fixation cross',
            'color': 'C0',
        },

        {
            'time': (0, -2, -3),
            'level': (0, 0.5),
            'label': 'Stimulus onset\nasynchronously',
            'color': 'C3',
    #         'rotation': 90,
        },

        {
            'time': (0, 4, 6),
    #         'level': (1, 1.5),
            'label': 'Cue',
            'color': 'C2',
            'rotation': 90,

            'marker': {
                'label': 'Marker streamed',
                'width': 2,
                'level': 1,
            }

        },

    )

    build_paradigm(paradigm)

    [140]:

    from matplotlib import pyplot as plt
    # from bci_framework.utils import build_paradigm
    fig = plt.figure(figsize=(20, 4), dpi=90)

    paradigm = [
        {
            'time': (-1.5, 0),
            'level': (0.5, 1),
            'label': 'Target notice',
            'color': 'C0',
        },

        {
            'time': (0, -1.5, -2.5),
            'level': (0, 0.5),
            'label': 'Break',
            'color': 'C3',
    #         'rotation': 90,
        },

        {
            'time': (0, 0.4*12, 12),
            'label': 'Sequential flash',
            'color': 'C2',
        },

    ]

    build_paradigm(paradigm)

    [195]:

    fig = plt.figure(figsize=(15, 6), dpi=90)

    N = 5

    paradigm_flash = []
    for i in range(N):

    #     T = (i-1)*1 + 1.5
        T = (i-1)*0.8 + 1.1

        stimulus = [
            {
            'time': (-0.3+T, -0.3+T, 0+T),
            'label': 'Inter stimulus',
            'color': 'C3',
            'rotation': 90,
    #         'alpha': 0.2,
            },
            {
            'time': (0+T, 0.5+T),
            'label': 'Non-target',
            'color': 'C4',
            'rotation': 90,
    #         'alpha': 0.2,

            'marker': {
                'label': 'Marker streamed',
                'width': 0.75,
                'level': 1,
            }
            },

        ]

        if i == N//2:

            stimulus[0]['time'] = (-0.3+T, -0.3+T, 0+T)
    #         stimulus[0]['label'] = 'Inter stimulus'
            stimulus[0]['color'] = 'C3'
    #         stimulus[0]['alpha'] = 1

            stimulus[1]['time'] = (0+T, 0.2+T, 0.5+T)
            stimulus[1]['label'] = 'Target'
            stimulus[1]['color'] = 'C2'
    #         stimulus[1]['alpha'] = 1

        paradigm_flash.extend(stimulus)

    build_paradigm(paradigm_flash)

    [192]:

    from matplotlib import pyplot as plt
    # from bci_framework.utils import build_paradigm
    fig = plt.figure(figsize=(20, 6), dpi=90)

    paradigm = [
        {
            'time': (-1.5, 0),
            'level': (0.5, 1),
            'label': 'Target notice',
            'color': 'C0',
        },

        {
            'time': (0, -1.5, -2.5),
            'level': (0, 0.5),
            'label': 'Break',
            'color': 'C3',
    #         'rotation': 90,
        },

    #     {
    #         'time': (0, 0.4*12, 12),
    #         'label': 'Secuencial flash',
    #         'color': 'C2',
    #     },

        {
            'time': (0, 4),
            'level': (0, 0.3),
            'label': 'Sequential flash over targets set',
            'color': 'C2',
        },

    ]

    N = 5

    paradigm_flash = []
    for i in range(N):

        T = (i-1)*0.8 + 1.1

        stimulus = [
            {
            'time': (-0.3+T, -0.3+T, 0+T),
            'level': (0.3, 1),
            'label': 'Inter stimulus',
            'color': 'C3',
            'rotation': 90,
    #         'alpha': 0.2,
            },
            {
            'time': (0+T, 0.5+T),
            'level': (0.3, 1),
            'label': 'Non-target',
            'color': 'C4',
            'rotation': 90,
    #         'alpha': 0.2,

            'marker': {
                'label': 'Marker streamed',
                'width': 0.75,
                'level': 1,
                'min': 0.4,
            }
            },

        ]

        if i == N//2:

            stimulus[0]['time'] = (-0.3+T, -0.3+T, 0+T)
    #         stimulus[0]['label'] = 'Inter stimulus'
            stimulus[0]['color'] = 'C3'
    #         stimulus[0]['alpha'] = 1

            stimulus[1]['time'] = (0+T, 0.1+T, 0.5+T)
            stimulus[1]['label'] = 'Target'
            stimulus[1]['color'] = 'C2'
    #         stimulus[1]['alpha'] = 1

        if i == 0:
            stimulus[0]['marker']={
                'label': 'Marker streamed\n(Sequential start)',
                'width': 1,
                'level': 2,
            }

        paradigm_flash.extend(stimulus)

    paradigm_flash.extend([

    #         {
    #         'time': (0, 0.2),
    #         'level': (1, 2),
    #         'label': 'Marker streamed',
    #         'color': 'C2',
    #         'rotation': 90,
    #         'fontsize': 12,
    #         'hatch': '...',
    #     },

    ])

    build_paradigm(paradigm + paradigm_flash)

    [201]:

    fig = plt.figure(figsize=(20, 8), dpi=90)

    paradigm = (

        {
            'time': (-0.4, -1.5, -2),
            'label': 'Inter trial break',
            'color': 'C3',
    #         'rotation': 90,
        },

        {
            'time': (-0.4, -0.2, 0),
    #         'level': (1, 1.5),
            'label': 'Cue',
            'color': 'C2',
            'rotation': 90,

            'marker': {
                'label': 'Marker streamed\n(cue)',
                'width': 1.3,
                'level': 3,
            }

        },

        {
            'time': (0, 0.1, 0.5),
            'label': 'Memory array',
            'color': 'C0',
            'rotation': 90,
            'marker': {
                'label': 'Marker streamed',
                'width': 1.3,
                'level': 2,
            }
        },

        {
            'time': (0, 0.5, 1.5),
            'label': 'Retention\ninterval',
            'color': 'C5',
            'restart': True,
            'marker': {
                'label': 'Marker streamed',
                'width': 1.3,
                'level': 1,
            }
        },
        {
            'time': (0, 1.5, 2.5),
            'label': 'Test Array',
            'color': 'C1',
            'restart': True,
            'marker': {
                'label': 'Marker streamed',
                'label_end': 'Marker streamed \n(response)',
                'width': 1.3,
                'level': 1,
            }
        },

    )

    build_paradigm(paradigm)

    [ ]:

    [ ]: