{"action":"created","comment":{"url":"https://api.github.com/repos/mne-tools/mne-python/pulls/comments/76568510","id":76568510,"diff_hunk":"@@ -1198,3 +1199,398 @@ def plot_evoked_joint(evoked, times=\"peaks\", title='', picks=None,\n     # show and return it\n     plt_show(show)\n     return fig\n+\n+\n+def _ci(arr, ci):\n+    \"\"\"Calculate the `ci`% parametric confidence interval for `arr`.\n+    Aux function for plot_compare_evokeds.\"\"\"\n+    from scipy import stats\n+    mean, sigma = arr.mean(0), stats.sem(arr, 0)\n+    # This is highly convoluted to support 17th century Scipy\n+    # XXX Fix when Scipy 0.12 support is dropped!\n+    # then it becomes just:\n+    # return stats.t.interval(ci, loc=mean, scale=sigma, df=arr.shape[0])\n+    return np.asarray([stats.t.interval(ci, arr.shape[0],\n+                       loc=mean_, scale=sigma_)\n+                       for mean_, sigma_ in zip(mean, sigma)]).T\n+\n+\n+def _setup_styles(conditions, style_dict, style, default):\n+    \"\"\"Aux function for plot_compare_evokeds to set linestyles and colors\"\"\"\n+    condition_warning = \"Condition {0} could not be mapped to a \" + style\n+    style_warning = \". Using the default of {0}\".format(default)\n+    for condition in conditions:\n+        if condition not in style_dict:\n+            if \"/\" not in condition:\n+                warn(condition_warning.format(condition) + style_warning)\n+                style_dict[condition] = default\n+            for style_ in style_dict:\n+                if style_ in condition.split(\"/\"):\n+                    style_dict[condition] = style_dict[style_]\n+                    break\n+    return style_dict\n+\n+\n+def plot_compare_evokeds(evokeds, picks='gfp', colors=None, linestyles=['-'],\n+                         styles=None, vlines=[0.], ci=0.95,\n+                         truncate_yaxis=True, ymin=None, ymax=None,\n+                         invert_y=False, ax=None, title=None, show=True):\n+    \"\"\"Plot evoked time courses for one or multiple channels and conditions\n+\n+    This function is useful for comparing ER[P/F]s at a specific location. It\n+    plots Evoked data or, if supplied with a list/dict of lists of evoked\n+    instances, grand averages plus confidence intervals.\n+\n+    Parameters\n+    ----------\n+    evokeds : instance of mne.Evoked | list | dict\n+        If a single evoked instance, it is plotted as a time series.\n+        If a dict whose values are Evoked objects, the contents are plotted as\n+        single time series each and the keys are used as condition labels.\n+        If a list of Evokeds, the contents are plotted with indices as labels.\n+        If a [dict/list] of lists, the unweighted mean is plotted as a time\n+        series and the parametric confidence interval is plotted as a shaded\n+        area. All instances must have the same shape - channel numbers, time\n+        points etc.\n+    picks : int | list of int | str\n+        If int or list of int, the indices of the sensors to average and plot.\n+        Must all be of the same channel type.\n+        If the selected channels are gradiometers, the corresponding pairs\n+        will be selected.\n+        If str, must be 'gfp', and the global field power for all data channels\n+        is plotted.\n+    colors : list | dict | None\n+        If a list, will be sequentially used for line colors.\n+        If a dict, can map evoked keys or HED-like tags to conditions. For\n+        example, if `evokeds` is a dict with the keys \"Aud/L\", \"Aud/R\",\n+        \"Vis/L\", \"Vis/R\", `colors` can be dict(Aud='r', Vis='b') to map both\n+        Aud/L and Aud/R to the color red.\n+        If None (default), a sequence of 10 desaturated colors is used.\n+    linestyles : list | dict\n+        If a list, will be sequentially used for evoked plot linestyles.\n+        If a dict, can map the `evoked` keys or HED-like tags to conditions.\n+        For example, if evokeds is a dict with the keys \"Aud/L\", \"Aud/R\",\n+        \"Vis/L\", \"Vis/R\", `linestyles` can be dict(L='--', R='-') to map both\n+        Aud/L and Vis/L to dashed lines.\n+    styles : dict | None\n+        If a dict, keys must map to evoked keys or conditions, and values must\n+        be a dict of legal inputs to `matplotlib.pyplot.plot`. These\n+        parameters will be passed to the line plot call of the corresponding\n+        condition, overriding defaults.\n+        E.g., if evokeds is a dict with the keys \"Aud/L\", \"Aud/R\",\n+        \"Vis/L\", \"Vis/R\", `styles` can be `{\"Aud/L\":{\"linewidth\":1}}` to set\n+        the linewidth for \"Aud/L\" to 1. Note that HED ('/'-separated) tags are\n+        not supported for now.\n+    vlines : list\n+        A list of integers corresponding to the positions, in seconds,\n+        at which to plot dashed vertical lines.\n+    ci : float | None\n+        If not None and `evokeds` is a [list/dict] of lists, a confidence\n+        interval is drawn around the individual time series. This value\n+        determines the CI width. E.g., if this value is .95 (the default),\n+        the 95% parametric confidence interval is drawn.\n+        If None, no shaded confidence band is plotted.\n+    truncate_yaxis : bool\n+        If True, the left y axis is truncated to half the max value and\n+        rounded to .25 to reduce visual clutter.\n+    invert_y : bool\n+        Controls wheter negative values are plotted up (as is sometimes done\n+        for ERPs out of tradition). Defaults to False.\n+    ax : None | `matplotlib.pyplot.axes` instance\n+        What axes to plot to. If None, a new axes is created.\n+    ymin, ymax : float | None\n+        If not `None`, can be used to manually scale the y axis.\n+    title : None | str\n+        If str, will be plotted as figure title. If None, the channel\n+        names will be shown.\n+    show : bool\n+        If True, show the figure.\n+\n+    Returns\n+    -------\n+    fig : Figure\n+        The figure in which the plot is drawn.\n+    \"\"\"\n+    import matplotlib.pyplot as plt\n+    from ..evoked import Evoked\n+\n+    # set up labels and instances\n+    if isinstance(evokeds, Evoked):\n+        conditions = ['Evoked']  # empty title\n+        evokeds = dict(Evoked=evokeds)\n+    else:\n+        if isinstance(evokeds, dict):\n+            conditions = sorted(list(evokeds.keys()))\n+        else:\n+            evokeds = dict((str(ii + 1), evoked)\n+                           for ii, evoked in enumerate(evokeds))\n+            conditions = sorted(list(evokeds.keys()))\n+\n+    # get and set a few limits and variables (times, channels, units)\n+    example = (evokeds[conditions[0]]\n+               if isinstance(evokeds[conditions[0]], Evoked)\n+               else evokeds[conditions[0]][0])\n+    if not isinstance(example, Evoked):\n+            raise ValueError(\"evokeds must be an `mne.Evoked` \"\n+                             \"or of a collection of `mne.Evoked`s\")\n+    times = example.times\n+    tmin, tmax = times[0], times[-1]\n+\n+    # deal with picks: infer indices and names\n+    if picks == 'gfp':\n+        if ymin is None:\n+            ymin = 0\n+        gfp_picks = pick_types(example.info, eeg=True, meg=True, seeg=True,\n+                               ecog=True)\n+        ch_types = list(set([channel_type(example.info, pick)\n+                             for pick in gfp_picks]))\n+        if len(ch_types) > 1:\n+            raise ValueError(\"Can't plot GFP with multiple channel types.\")\n+        ch_type = ch_types[0]\n+        ch_names = ['Global Field Power']\n+    else:\n+        if isinstance(picks, int):\n+            picks = [picks]\n+        elif isinstance(picks[0], int):\n+            pass\n+        else:\n+            raise ValueError(\"`picks` must be int, a list of int, \"\n+                             \"or `gfp`, not \" + str(type(picks)))\n+        ch_names = [example.ch_names[pick] for pick in picks]\n+        ch_type = channel_type(example.info, picks[0])\n+        ch_types = list(set(channel_type(example.info, pick_)\n+                        for pick_ in picks))\n+        if len(ch_types) > 1:\n+            raise ValueError(\"More than 1 channel type selected by `picks`.\")\n+\n+    scaling = _handle_default(\"scalings\")[ch_type]\n+\n+    if ch_type == 'grad' and picks is not 'gfp':  # deal with grad pairs\n+        from ..channels.layout import _merge_grad_data, _pair_grad_sensors\n+        picked_chans = []\n+        pairpicks = _pair_grad_sensors(example.info, topomap_coords=False)\n+        for ii in np.arange(0, len(pairpicks), 2):\n+            first, second = pairpicks[ii], pairpicks[ii + 1]\n+            if first in picks or second in picks:\n+                picked_chans.append(first)\n+                picked_chans.append(second)\n+        picks = list(sorted(set(picked_chans)))\n+        ch_names = [example.ch_names[pick] for pick in picks]\n+        if ymin is None:  # 'grad' is plotted as all-positive\n+            ymin = 0\n+\n+    # deal with dict/list of lists, and calculate the CI\n+    if not isinstance(ci, np.float):\n+        msg = '`ci` must be float, got {0} instead.'\n+        raise TypeError(msg.format(type(ci)))\n+\n+    if not all([isinstance(evoked_, Evoked) for evoked_ in evokeds.values()]):\n+        from ..evoked import combine_evoked\n+        if ci is not None and picks is not 'gfp':\n+            # calculate the CI\n+            sem_array = {}\n+            for condition in conditions:\n+                # this will fail if evokeds do not have the same structure\n+                # (e.g. channel count)\n+                if ch_type == 'grad' and picks is not 'gfp':\n+                    data = np.asarray([\n+                        _merge_grad_data(\n+                            evoked_.data[picks, :]).mean(0)\n+                        for evoked_ in evokeds[condition]])\n+                else:\n+                    data = np.asarray([evoked_.data[picks, :].mean(0)\n+                                       for evoked_ in evokeds[condition]])\n+                sem_array[condition] = _ci(data, ci)\n+\n+        # get the grand mean\n+        evokeds = dict((cond, combine_evoked(evokeds[cond], weights='equal'))\n+                       for cond in conditions)\n+\n+        if picks == 'gfp':\n+            warn(\"Confidence Interval not drawn when plotting GFP.\")\n+    else:\n+        ci = False\n+    # we not have dicts for data ('evokeds' - grand averaged Evoked's)\n+    # and the CI ('sem_array') with cond name labels\n+\n+    # let's plot!\n+    if ax is None:\n+        fig, ax = plt.subplots(1, 1)\n+        fig.set_size_inches(8, 6)\n+    else:\n+        fig = ax.figure\n+\n+    # style the individual condition time series\n+    # first, check if input is valid\n+    tags = set([tag for cond in conditions for tag in cond.split(\"/\")])\n+    msg = (\"Can't map between conditions and the provided {0}. Make sure \"\n+           \"you have provided keys in the format of '/'-separated tags, \"\n+           \"and that these correspond to '/'-separated tags for the condition \"\n+           \"names (e.g., conditions like 'Visual/Right', and styles like \"\n+           \"`colors=dict(Visual='red'))`. The offending tag was '{1}'.\")\n+    for name_, item in zip((\"colors\", \"linestyles\"),\n+                           (colors, linestyles)):\n+        if isinstance(item, dict):\n+            for key in item:\n+                for tag in key.split(\"/\"):\n+                    if tag not in tags:\n+                        raise ValueError(msg.format(name_, tag))\n+    if isinstance(styles, dict):\n+        for style_ in styles:\n+            if style_ not in conditions:\n+                raise ValueError(\"Could not map between `styles` and \"\n+                                 \"conditions. Condition \" + style_ +\n+                                 \" was not found in the supplied data.\")\n+\n+    # second, color\n+    # check: is color a list?\n+    if (colors is not None and not isinstance(colors, string_types) and\n+            not isinstance(colors, dict) and len(colors) > 1):\n+        colors = dict((condition, color) for condition, color\n+                      in zip(conditions, colors))\n+\n+    if not isinstance(colors, dict):  # default colors\n+        colors_ = ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00',\n+                   '#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e']","path":"mne/viz/evoked.py","position":264,"original_position":264,"commit_id":"36b393bf103c25839453fc1e358db038604158ae","original_commit_id":"36b393bf103c25839453fc1e358db038604158ae","user":{"login":"jona-sassenhagen","id":4321826,"avatar_url":"https://avatars.githubusercontent.com/u/4321826?v=3","gravatar_id":"","url":"https://api.github.com/users/jona-sassenhagen","html_url":"https://github.com/jona-sassenhagen","followers_url":"https://api.github.com/users/jona-sassenhagen/followers","following_url":"https://api.github.com/users/jona-sassenhagen/following{/other_user}","gists_url":"https://api.github.com/users/jona-sassenhagen/gists{/gist_id}","starred_url":"https://api.github.com/users/jona-sassenhagen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jona-sassenhagen/subscriptions","organizations_url":"https://api.github.com/users/jona-sassenhagen/orgs","repos_url":"https://api.github.com/users/jona-sassenhagen/repos","events_url":"https://api.github.com/users/jona-sassenhagen/events{/privacy}","received_events_url":"https://api.github.com/users/jona-sassenhagen/received_events","type":"User","site_admin":false},"body":"I think I got them from ColorBrewer or Seaborn.","created_at":"2016-08-29T08:11:50Z","updated_at":"2016-08-29T08:11:50Z","html_url":"https://github.com/mne-tools/mne-python/pull/3413#discussion_r76568510","pull_request_url":"https://api.github.com/repos/mne-tools/mne-python/pulls/3413","_links":{"self":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/comments/76568510"},"html":{"href":"https://github.com/mne-tools/mne-python/pull/3413#discussion_r76568510"},"pull_request":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/3413"}}},"pull_request":{"url":"https://api.github.com/repos/mne-tools/mne-python/pulls/3413","id":76886824,"html_url":"https://github.com/mne-tools/mne-python/pull/3413","diff_url":"https://github.com/mne-tools/mne-python/pull/3413.diff","patch_url":"https://github.com/mne-tools/mne-python/pull/3413.patch","issue_url":"https://api.github.com/repos/mne-tools/mne-python/issues/3413","number":3413,"state":"open","locked":false,"title":"plot_compare_evoked","user":{"login":"jona-sassenhagen","id":4321826,"avatar_url":"https://avatars.githubusercontent.com/u/4321826?v=3","gravatar_id":"","url":"https://api.github.com/users/jona-sassenhagen","html_url":"https://github.com/jona-sassenhagen","followers_url":"https://api.github.com/users/jona-sassenhagen/followers","following_url":"https://api.github.com/users/jona-sassenhagen/following{/other_user}","gists_url":"https://api.github.com/users/jona-sassenhagen/gists{/gist_id}","starred_url":"https://api.github.com/users/jona-sassenhagen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jona-sassenhagen/subscriptions","organizations_url":"https://api.github.com/users/jona-sassenhagen/orgs","repos_url":"https://api.github.com/users/jona-sassenhagen/repos","events_url":"https://api.github.com/users/jona-sassenhagen/events{/privacy}","received_events_url":"https://api.github.com/users/jona-sassenhagen/received_events","type":"User","site_admin":false},"body":"Not ready for merge yet. Comments welcome.\r\n\r\nDoes stuff like this:\r\n\r\n```\r\ncolors = {\"control\":'Crimson', 'violation':'CornFlowerBlue'}\r\nplot_compare_evokeds(hard, picks='Cz', colors=colors);\r\n```\r\n\r\n![unknown-157](https://cloud.githubusercontent.com/assets/4321826/16716784/e10593aa-4706-11e6-93bf-086245006d6c.png)\r\n\r\n\r\nMissing:\r\n\r\n- [x] tests\r\n- [x] more tests\r\n- [x] more input checks\r\n- [x] cleanup","created_at":"2016-07-10T23:32:17Z","updated_at":"2016-08-29T08:11:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dda2b1b402e531100ff6cf44e7ff913120de1e6d","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/mne-tools/mne-python/pulls/3413/commits","review_comments_url":"https://api.github.com/repos/mne-tools/mne-python/pulls/3413/comments","review_comment_url":"https://api.github.com/repos/mne-tools/mne-python/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mne-tools/mne-python/issues/3413/comments","statuses_url":"https://api.github.com/repos/mne-tools/mne-python/statuses/36b393bf103c25839453fc1e358db038604158ae","head":{"label":"jona-sassenhagen:patch-24","ref":"patch-24","sha":"36b393bf103c25839453fc1e358db038604158ae","user":{"login":"jona-sassenhagen","id":4321826,"avatar_url":"https://avatars.githubusercontent.com/u/4321826?v=3","gravatar_id":"","url":"https://api.github.com/users/jona-sassenhagen","html_url":"https://github.com/jona-sassenhagen","followers_url":"https://api.github.com/users/jona-sassenhagen/followers","following_url":"https://api.github.com/users/jona-sassenhagen/following{/other_user}","gists_url":"https://api.github.com/users/jona-sassenhagen/gists{/gist_id}","starred_url":"https://api.github.com/users/jona-sassenhagen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jona-sassenhagen/subscriptions","organizations_url":"https://api.github.com/users/jona-sassenhagen/orgs","repos_url":"https://api.github.com/users/jona-sassenhagen/repos","events_url":"https://api.github.com/users/jona-sassenhagen/events{/privacy}","received_events_url":"https://api.github.com/users/jona-sassenhagen/received_events","type":"User","site_admin":false},"repo":{"id":26366770,"name":"mne-python","full_name":"jona-sassenhagen/mne-python","owner":{"login":"jona-sassenhagen","id":4321826,"avatar_url":"https://avatars.githubusercontent.com/u/4321826?v=3","gravatar_id":"","url":"https://api.github.com/users/jona-sassenhagen","html_url":"https://github.com/jona-sassenhagen","followers_url":"https://api.github.com/users/jona-sassenhagen/followers","following_url":"https://api.github.com/users/jona-sassenhagen/following{/other_user}","gists_url":"https://api.github.com/users/jona-sassenhagen/gists{/gist_id}","starred_url":"https://api.github.com/users/jona-sassenhagen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jona-sassenhagen/subscriptions","organizations_url":"https://api.github.com/users/jona-sassenhagen/orgs","repos_url":"https://api.github.com/users/jona-sassenhagen/repos","events_url":"https://api.github.com/users/jona-sassenhagen/events{/privacy}","received_events_url":"https://api.github.com/users/jona-sassenhagen/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jona-sassenhagen/mne-python","description":"MNE : Magnetoencephalography (MEG) and Electroencephalography (EEG) in Python","fork":true,"url":"https://api.github.com/repos/jona-sassenhagen/mne-python","forks_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/forks","keys_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/teams","hooks_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/hooks","issue_events_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/issues/events{/number}","events_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/events","assignees_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/assignees{/user}","branches_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/branches{/branch}","tags_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/tags","blobs_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/statuses/{sha}","languages_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/languages","stargazers_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/stargazers","contributors_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/contributors","subscribers_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/subscribers","subscription_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/subscription","commits_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/contents/{+path}","compare_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/merges","archive_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/downloads","issues_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/issues{/number}","pulls_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/pulls{/number}","milestones_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/milestones{/number}","notifications_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/labels{/name}","releases_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/releases{/id}","deployments_url":"https://api.github.com/repos/jona-sassenhagen/mne-python/deployments","created_at":"2014-11-08T16:37:16Z","updated_at":"2015-03-21T16:54:38Z","pushed_at":"2016-08-29T00:37:46Z","git_url":"git://github.com/jona-sassenhagen/mne-python.git","ssh_url":"git@github.com:jona-sassenhagen/mne-python.git","clone_url":"https://github.com/jona-sassenhagen/mne-python.git","svn_url":"https://github.com/jona-sassenhagen/mne-python","homepage":"http://martinos.org/mne/","size":89188,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"mne-tools:master","ref":"master","sha":"71b15a704b94f2054cff9bd04c553cc862040405","user":{"login":"mne-tools","id":583875,"avatar_url":"https://avatars.githubusercontent.com/u/583875?v=3","gravatar_id":"","url":"https://api.github.com/users/mne-tools","html_url":"https://github.com/mne-tools","followers_url":"https://api.github.com/users/mne-tools/followers","following_url":"https://api.github.com/users/mne-tools/following{/other_user}","gists_url":"https://api.github.com/users/mne-tools/gists{/gist_id}","starred_url":"https://api.github.com/users/mne-tools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mne-tools/subscriptions","organizations_url":"https://api.github.com/users/mne-tools/orgs","repos_url":"https://api.github.com/users/mne-tools/repos","events_url":"https://api.github.com/users/mne-tools/events{/privacy}","received_events_url":"https://api.github.com/users/mne-tools/received_events","type":"Organization","site_admin":false},"repo":{"id":1301584,"name":"mne-python","full_name":"mne-tools/mne-python","owner":{"login":"mne-tools","id":583875,"avatar_url":"https://avatars.githubusercontent.com/u/583875?v=3","gravatar_id":"","url":"https://api.github.com/users/mne-tools","html_url":"https://github.com/mne-tools","followers_url":"https://api.github.com/users/mne-tools/followers","following_url":"https://api.github.com/users/mne-tools/following{/other_user}","gists_url":"https://api.github.com/users/mne-tools/gists{/gist_id}","starred_url":"https://api.github.com/users/mne-tools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mne-tools/subscriptions","organizations_url":"https://api.github.com/users/mne-tools/orgs","repos_url":"https://api.github.com/users/mne-tools/repos","events_url":"https://api.github.com/users/mne-tools/events{/privacy}","received_events_url":"https://api.github.com/users/mne-tools/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mne-tools/mne-python","description":"MNE : Magnetoencephalography (MEG) and Electroencephalography (EEG) in Python","fork":false,"url":"https://api.github.com/repos/mne-tools/mne-python","forks_url":"https://api.github.com/repos/mne-tools/mne-python/forks","keys_url":"https://api.github.com/repos/mne-tools/mne-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mne-tools/mne-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mne-tools/mne-python/teams","hooks_url":"https://api.github.com/repos/mne-tools/mne-python/hooks","issue_events_url":"https://api.github.com/repos/mne-tools/mne-python/issues/events{/number}","events_url":"https://api.github.com/repos/mne-tools/mne-python/events","assignees_url":"https://api.github.com/repos/mne-tools/mne-python/assignees{/user}","branches_url":"https://api.github.com/repos/mne-tools/mne-python/branches{/branch}","tags_url":"https://api.github.com/repos/mne-tools/mne-python/tags","blobs_url":"https://api.github.com/repos/mne-tools/mne-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mne-tools/mne-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mne-tools/mne-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/mne-tools/mne-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mne-tools/mne-python/statuses/{sha}","languages_url":"https://api.github.com/repos/mne-tools/mne-python/languages","stargazers_url":"https://api.github.com/repos/mne-tools/mne-python/stargazers","contributors_url":"https://api.github.com/repos/mne-tools/mne-python/contributors","subscribers_url":"https://api.github.com/repos/mne-tools/mne-python/subscribers","subscription_url":"https://api.github.com/repos/mne-tools/mne-python/subscription","commits_url":"https://api.github.com/repos/mne-tools/mne-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/mne-tools/mne-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/mne-tools/mne-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/mne-tools/mne-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/mne-tools/mne-python/contents/{+path}","compare_url":"https://api.github.com/repos/mne-tools/mne-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mne-tools/mne-python/merges","archive_url":"https://api.github.com/repos/mne-tools/mne-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mne-tools/mne-python/downloads","issues_url":"https://api.github.com/repos/mne-tools/mne-python/issues{/number}","pulls_url":"https://api.github.com/repos/mne-tools/mne-python/pulls{/number}","milestones_url":"https://api.github.com/repos/mne-tools/mne-python/milestones{/number}","notifications_url":"https://api.github.com/repos/mne-tools/mne-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mne-tools/mne-python/labels{/name}","releases_url":"https://api.github.com/repos/mne-tools/mne-python/releases{/id}","deployments_url":"https://api.github.com/repos/mne-tools/mne-python/deployments","created_at":"2011-01-28T03:31:13Z","updated_at":"2016-08-23T16:25:07Z","pushed_at":"2016-08-29T00:37:47Z","git_url":"git://github.com/mne-tools/mne-python.git","ssh_url":"git@github.com:mne-tools/mne-python.git","clone_url":"https://github.com/mne-tools/mne-python.git","svn_url":"https://github.com/mne-tools/mne-python","homepage":"http://martinos.org/mne/","size":181064,"stargazers_count":224,"watchers_count":224,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":214,"mirror_url":null,"open_issues_count":197,"forks":214,"open_issues":197,"watchers":224,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/3413"},"html":{"href":"https://github.com/mne-tools/mne-python/pull/3413"},"issue":{"href":"https://api.github.com/repos/mne-tools/mne-python/issues/3413"},"comments":{"href":"https://api.github.com/repos/mne-tools/mne-python/issues/3413/comments"},"review_comments":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/3413/comments"},"review_comment":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mne-tools/mne-python/pulls/3413/commits"},"statuses":{"href":"https://api.github.com/repos/mne-tools/mne-python/statuses/36b393bf103c25839453fc1e358db038604158ae"}}}}
{"actor":{"display_login":"jona-sassenhagen"}}