From b005b04937da00d3de25a463490c55387920a156 Mon Sep 17 00:00:00 2001 From: nkoch1 Date: Sat, 24 Sep 2022 16:35:13 +0200 Subject: [PATCH] added figure plotting scripts *_letters.py to plot using models named by letter --- Figures/AUC_correlation.pdf | Bin 61647 -> 61046 bytes Figures/AUC_correlation.py | 15 + Figures/AUC_correlation_letters.py | 543 +++++++++++++++ Figures/ramp_firing_letters.py | 322 +++++++++ Figures/rheobase_correlation.pdf | Bin 58828 -> 59113 bytes Figures/rheobase_correlation.py | 57 +- Figures/rheobase_correlation_letters.py | 648 ++++++++++++++++++ Figures/simulation_model_comparison.pdf | Bin 43179 -> 41586 bytes .../simulation_model_comparison_letters.py | 259 +++++++ manuscript.tex | 14 +- 10 files changed, 1837 insertions(+), 21 deletions(-) create mode 100644 Figures/AUC_correlation_letters.py create mode 100644 Figures/ramp_firing_letters.py create mode 100644 Figures/rheobase_correlation_letters.py create mode 100644 Figures/simulation_model_comparison_letters.py diff --git a/Figures/AUC_correlation.pdf b/Figures/AUC_correlation.pdf index 2f3b0b183b8bcb624518dad4268bbc51ab997cd2..78af3e339bf103ed5aa5fb23eb7b7e8e0f24703c 100644 GIT binary patch delta 42759 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 diff --git a/Figures/AUC_correlation.py b/Figures/AUC_correlation.py index ea2f11c..de09aa9 100644 --- a/Figures/AUC_correlation.py +++ b/Figures/AUC_correlation.py @@ -389,6 +389,21 @@ color_dict = {'Cb stellate': '#40A787', # cyan'# 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#873770', # magenta 'STN': '#D03050' # pink } +model_letter = { +'Cb stellate': 'A', +'RS Inhibitory': 'B', +'FS': 'C', +'RS Pyramidal': 'D', +'RS Inhibitory': 'E', +'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'F', +'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'G', +'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'H', +'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'I', +'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'J', +'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'K', +'STN':'L', +} + # plot setup marker_s_leg = 2 diff --git a/Figures/AUC_correlation_letters.py b/Figures/AUC_correlation_letters.py new file mode 100644 index 0000000..cd49d06 --- /dev/null +++ b/Figures/AUC_correlation_letters.py @@ -0,0 +1,543 @@ +# -*- coding: utf-8 -*- +""" +Created on Sat Jul 3 19:52:04 2021 + +@author: nils +""" +import pandas as pd +import numpy as np +import string +import textwrap +import json +import matplotlib +import matplotlib.lines as mlines +from matplotlib import ticker +from matplotlib.ticker import NullFormatter +from Figures.plotstyle import boxplot_style + +def cm2inch(*tupl): + inch = 2.54 + if isinstance(tupl[0], tuple): + return tuple(i/inch for i in tupl[0]) + else: + return tuple(i/inch for i in tupl) +#%% ##################### From https://stackoverflow.com/questions/52878845/swarmplot-with-hue-affecting-marker-beyond-color ## +# to change marker types in seaborn swarmplot + +import seaborn as sns +import matplotlib.pyplot as plt + +############## Begin hack ############## +from matplotlib.axes._axes import Axes +from matplotlib.markers import MarkerStyle +from numpy import ndarray + +def GetColor2Marker(markers): + colorslist = ['#40A787', # cyan'# + '#F0D730', # yellow + '#C02717', # red + '#007030', # dark green + '#AAB71B', # lightgreen + '#008797', # light blue + '#F78017', # orange + '#478010', # green + '#53379B', # purple + '#2060A7', # blue + '#873770', # magenta + '#D03050' # pink + ] + import matplotlib.colors + palette = [matplotlib.colors.to_rgb(c) for c in colorslist] + mkcolors = [(palette[i]) for i in range(len(markers))] + return dict(zip(mkcolors,markers)) + +def fixlegend(ax,markers,markersize=3,**kwargs): + # Fix Legend + legtitle = ax.get_legend().get_title().get_text() + _,l = ax.get_legend_handles_labels() + colorslist = ['#40A787', # cyan'# + '#F0D730', # yellow + '#C02717', # red + '#007030', # dark green + '#AAB71B', # lightgreen + '#008797', # light blue + '#F78017', # orange + '#478010', # green + '#53379B', # purple + '#2060A7', # blue + '#873770', # magenta + '#D03050' # pink + ] + import matplotlib.colors + palette = [matplotlib.colors.to_rgb(c) for c in colorslist] + mkcolors = [(palette[i]) for i in range(len(markers))] + newHandles = [plt.Line2D([0],[0], ls="none", marker=m, color=c, mec="none", markersize=markersize,**kwargs) \ + for m,c in zip(markers, mkcolors)] + ax.legend(newHandles,l) + leg = ax.get_legend() + leg.set_title(legtitle) + +old_scatter = Axes.scatter +def new_scatter(self, *args, **kwargs): + colors = kwargs.get("c", None) + co2mk = kwargs.pop("co2mk",None) + FinalCollection = old_scatter(self, *args, **kwargs) + if co2mk is not None and isinstance(colors, ndarray): + Color2Marker = GetColor2Marker(co2mk) + paths=[] + for col in colors: + mk=Color2Marker[tuple(col)] + marker_obj = MarkerStyle(mk) + paths.append(marker_obj.get_path().transformed(marker_obj.get_transform())) + FinalCollection.set_paths(paths) + return FinalCollection +Axes.scatter = new_scatter +############## End hack. ############## +######################################################################################################################## +#%% add gradient arrows +import matplotlib.pyplot as plt +import matplotlib.transforms +import matplotlib.path +from matplotlib.collections import LineCollection + +def gradientaxis(ax, start, end, cmap, n=100,lw=1): + # Arrow shaft: LineCollection + x = np.linspace(start[0],end[0],n) + y = np.linspace(start[1],end[1],n) + points = np.array([x,y]).T.reshape(-1,1,2) + segments = np.concatenate([points[:-1],points[1:]], axis=1) + lc = LineCollection(segments, cmap=cmap, linewidth=lw,zorder=15) + lc.set_array(np.linspace(0,1,n)) + ax.add_collection(lc) + return ax +#%% +#%% +def boxplot_with_markers(ax,max_width, alteration='shift', msize=3): + hlinewidth = 0.5 + model_names = ['RS pyramidal','RS inhibitory','FS', + 'RS pyramidal +$K_V1.1$','RS inhibitory +$K_V1.1$', + 'FS +$K_V1.1$','Cb stellate','Cb stellate +$K_V1.1$', + 'Cb stellate $\Delta$$K_V1.1$','STN','STN +$K_V1.1$', + 'STN $\Delta$$K_V1.1$'] + + colorslist = ['#007030', # dark green + '#F0D730', # yellow + '#C02717', # red + '#478010', # green + '#AAB71B', # lightgreen + '#F78017', # orange + '#40A787', # cyan'# + '#008797', # light blue + '#2060A7', # blue + '#D03050', # pink + '#53379B', # purple + '#873770', # magenta + ] + + + import matplotlib.colors + colors = [matplotlib.colors.to_rgb(c) for c in colorslist] + clr_dict = {} + for m in range(len(model_names)): + clr_dict[model_names[m]] = colors[m] + print(colors) + print(clr_dict) + Markers = ["o", "o", "o", "^", "^", "^", "D", "D", "D", "s", "s", "s"] + if alteration=='shift': + i = 2 # Kd act + ax.axvspan(i - 0.4, i + 0.4, fill=False, edgecolor = 'k') + df = pd.read_csv('./Figures/Data/AUC_shift_corr.csv') + sns.swarmplot(y="corr", x="$\Delta V_{1/2}$", hue="model", data=df, + palette=clr_dict, linewidth=0, orient='v', ax=ax, size=msize, + order=['Na activation', 'Na inactivation', 'K activation', '$K_V1.1$ activation', + '$K_V1.1$ inactivation', 'A activation', 'A inactivation'], + hue_order=model_names, co2mk=Markers) + lim = ax.get_xlim() + ax.plot([lim[0], lim[1]], [0, 0], ':r',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [1, 1], ':k',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [-1, -1], ':k',linewidth=hlinewidth) + ax.set_title("Shift ($\Delta V_{1/2}$)", y=1.05) + ax.set_xticklabels(['Na \nactivation', 'Na \ninactivation', 'K \nactivation', '$K_V1.1$ \nactivation', + '$K_V1.1$ \ninactivation', 'A \nactivation', 'A \ninactivation']) + elif alteration=='slope': + i = 3 # Kv1.1 act + ax.axvspan(i - 0.4, i + 0.4, fill=False, edgecolor='k') + df = pd.read_csv('./Figures/Data/AUC_scale_corr.csv') + + # Add in points to show each observation + sns.swarmplot(y="corr", x="Slope (k)", hue="model", data=df, + palette=clr_dict, linewidth=0, orient='v', ax=ax, size=msize, + order=['Na activation', 'Na inactivation', 'K activation', '$K_V1.1$ activation', + '$K_V1.1$ inactivation', 'A activation', 'A inactivation'], + hue_order=model_names, co2mk=Markers) + lim = ax.get_xlim() + ax.plot([lim[0], lim[1]], [0, 0], ':r',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [1, 1], ':k',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [-1, -1], ':k',linewidth=hlinewidth) + ax.set_title("Slope (k)", y=1.05) + ax.set_xticklabels(['Na \nactivation', 'Na \ninactivation', 'K \nactivation', '$K_V1.1$ \nactivation', + '$K_V1.1$ \ninactivation', 'A \nactivation', 'A \ninactivation']) + elif alteration=='g': + i = 1 # Kd + ax.axvspan(i - 0.4, i + 0.4, fill=False, edgecolor='k') + df = pd.read_csv('./Figures/Data/AUC_g_corr.csv') + + # Add in points to show each observation + sns.swarmplot(y="corr", x="g", hue="model", data=df, + palette=clr_dict, linewidth=0, orient='v', ax=ax, size=msize, + order=['Na', 'K', '$K_V1.1$', 'A', 'Leak'], + hue_order=model_names, co2mk=Markers) + lim = ax.get_xlim() + # ax.plot([lim[0], lim[1]], [0,0], ':k') + ax.plot([lim[0], lim[1]], [0, 0], ':r',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [1, 1], ':k',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [-1, -1], ':k',linewidth=hlinewidth) + # Tweak the visual presentation + ax.set_title("Conductance (g)", y=1.05) + ax.set_xticklabels(textwrap.fill(x.get_text(), max_width) for x in ax.get_xticklabels()) + else: + print('Please chose "shift", "slope" or "g"') + ax.get_legend().remove() + ax.xaxis.grid(False) + sns.despine(trim=True, bottom=True, ax=ax) + ax.set(xlabel=None, ylabel=r'Kendall $\it{\tau}$') + + +def model_legend(ax, marker_s_leg, pos, ncol): + # colorslist = [ '#40A787', # cyan'# + # '#F0D730', # yellow + # '#C02717', # red + # '#007030', # dark green + # '#AAB71B', # lightgreen + # '#008797', # light blue + # '#F78017', # orange + # '#478010', # green + # '#53379B', # purple + # '#2060A7', # blue + # '#873770', # magenta + # '#D03050' # pink + # ] + colorslist = ['#007030', # dark green + '#F0D730', # yellow + '#C02717', # red + '#478010', # green + '#AAB71B', # lightgreen + '#F78017', # orange + '#40A787', # cyan'# + '#008797', # light blue + '#2060A7', # blue + '#D03050', # pink + '#53379B', # purple + '#873770', # magenta + ] + + import matplotlib.colors + colors = [matplotlib.colors.to_rgb(c) for c in colorslist] + model_pos = {'Cb stellate':0, 'RS Inhibitory':1, 'FS':2, 'RS Pyramidal':3, + 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':4, + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':5, 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':6, + 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':7, 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':8, + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':9, + 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':10, 'STN':11} + Markers = ["o", "o", "o", "^", "^", "^", "D", "D", "D", "s", "s", "s"] + # RS_p = mlines.Line2D([], [], color=colors[model_pos['RS Pyramidal']], marker=Markers[model_pos['RS Pyramidal']], markersize=marker_s_leg, linestyle='None', + # label='Model D') + # RS_i = mlines.Line2D([], [], color=colors[model_pos['RS Inhibitory']], marker=Markers[model_pos['RS Inhibitory']], markersize=marker_s_leg, linestyle='None', + # label='Model B') + # FS = mlines.Line2D([], [], color=colors[model_pos['FS']], marker=Markers[model_pos['FS']], markersize=marker_s_leg, linestyle='None', label='Model C') + # RS_p_Kv = mlines.Line2D([], [], color=colors[model_pos['RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], marker=Markers[model_pos['RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], markersize=marker_s_leg, linestyle='None', + # label='Model H') + # RS_i_Kv = mlines.Line2D([], [], color=colors[model_pos['RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], marker=Markers[model_pos['RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], markersize=marker_s_leg, linestyle='None', + # label='Model E') + # FS_Kv = mlines.Line2D([], [], color=colors[model_pos['Cb stellate']], marker=Markers[model_pos['Cb stellate']], markersize=marker_s_leg, linestyle='None', label='Model G') + # Cb = mlines.Line2D([], [], color=colors[8], marker=Markers[8], markersize=marker_s_leg, linestyle='None', + # label='Model A') + # Cb_pl = mlines.Line2D([], [], color=colors[model_pos['Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], marker=Markers[model_pos['Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], markersize=marker_s_leg, linestyle='None', + # label='Model F') + # Cb_sw = mlines.Line2D([], [], color=colors[model_pos['Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], marker=Markers[model_pos['Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], markersize=marker_s_leg, linestyle='None', + # label='Model J') + # STN = mlines.Line2D([], [], color=colors[model_pos['STN']], marker=Markers[model_pos['STN']], markersize=marker_s_leg, linestyle='None', label='Model L') + # STN_pl = mlines.Line2D([], [], color=colors[model_pos['STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], marker=Markers[model_pos['STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], markersize=marker_s_leg, linestyle='None', + # label='Model I') + # STN_sw = mlines.Line2D([], [], color=colors[model_pos['STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], marker=Markers[model_pos['STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], markersize=marker_s_leg, linestyle='None', + # label='Model K') + + + + RS_p = mlines.Line2D([], [], color='#007030', marker="^", + markersize=marker_s_leg, linestyle='None', + label='Model D') + RS_i = mlines.Line2D([], [], color='#F0D730', marker="o", + markersize=marker_s_leg, linestyle='None', + label='Model B') + FS = mlines.Line2D([], [], color='#C02717', marker="o", markersize=marker_s_leg, + linestyle='None', label='Model C') + RS_p_Kv = mlines.Line2D([], [], color='#478010', + marker="D", + markersize=marker_s_leg, linestyle='None', + label='Model H') + RS_i_Kv = mlines.Line2D([], [], color='#AAB71B', + marker="^", + markersize=marker_s_leg, linestyle='None', + label='Model E') + FS_Kv = mlines.Line2D([], [], color='#F78017', + marker="D", markersize=marker_s_leg, + linestyle='None', label='Model G') + Cb = mlines.Line2D([], [], color='#40A787', marker="o", + markersize=marker_s_leg, linestyle='None', + label='Model A') + Cb_pl = mlines.Line2D([], [], color='#008797', + marker="^", + markersize=marker_s_leg, linestyle='None', + label='Model F') + Cb_sw = mlines.Line2D([], [], color='#2060A7', + marker="s", + markersize=marker_s_leg, linestyle='None', + label='Model J') + STN = mlines.Line2D([], [], color='#D03050', marker="s", markersize=marker_s_leg, + linestyle='None', label='Model L') + STN_pl = mlines.Line2D([], [], color='#53379B', + marker="D", + markersize=marker_s_leg, linestyle='None', + label='Model I') + STN_sw = mlines.Line2D([], [], color='#873770', + marker="s", + markersize=marker_s_leg, linestyle='None', + label='Model K') + # ax.legend(handles=[RS_p, RS_i, FS, RS_p_Kv, RS_i_Kv, FS_Kv, Cb, Cb_pl, Cb_sw, STN, STN_pl, STN_sw], loc='center', + # bbox_to_anchor=pos, ncol=ncol, frameon=False) + ax.legend(handles=[Cb, RS_i, FS, RS_p, RS_i_Kv, Cb_pl, FS_Kv, RS_p_Kv, STN_pl, Cb_sw, STN_sw, STN], loc='center', + bbox_to_anchor=pos, ncol=ncol, frameon=False) + +def plot_AUC_alt(ax, model='FS', color1='red', color2='dodgerblue', alteration='shift'): + ax.spines["right"].set_visible(False) + ax.spines["top"].set_visible(False) + model_names = ['RS Pyramidal','RS Inhibitory','FS', + 'RS Pyramidal +$K_V1.1$','RS Inhibitory +$K_V1.1$', + 'FS +$K_V1.1$','Cb stellate','Cb stellate +$K_V1.1$', + 'Cb stellate $\Delta$$K_V1.1$','STN','STN +$K_V1.1$', + 'STN $\Delta$$K_V1.1$'] + + model_name_dict = {'RS Pyramidal': 'RS Pyramidal', + 'RS Inhibitory': 'RS Inhibitory', + 'FS': 'FS', + 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'RS Pyramidal +$K_V1.1$', + 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'RS Inhibitory +$K_V1.1$', + 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'FS +$K_V1.1$', + 'Cb stellate': 'Cb stellate', + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'Cb stellate +$K_V1.1$', + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'Cb stellate $\Delta$$K_V1.1$', + 'STN': 'STN', + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'STN +$K_V1.1$', + 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'STN $\Delta$$K_V1.1$'} + colorslist = ['#007030', # dark green + '#F0D730', # yellow + '#C02717', # red + '#478010', # green + '#AAB71B', # lightgreen + '#F78017', # orange + '#40A787', # cyan'# + '#008797', # light blue + '#2060A7', # blue + '#D03050', # pink + '#53379B', # purple + '#873770', # magenta + ] + + import matplotlib.colors + colors = [matplotlib.colors.to_rgb(c) for c in colorslist] + clr_dict = {} + for m in range(len(model_names)): + clr_dict[model_names[m]] = colors[m] + if alteration=='shift': + df = pd.read_csv('./Figures/Data/AUC_shift_ex.csv') + df = df.sort_values('alteration') + ax.set_xlabel('$\Delta$$V_{1/2}$') + elif alteration=='slope': + df = pd.read_csv('./Figures/Data/AUC_slope_ex.csv') + ax.set_xscale("log") + ax.set_xticks([0.5, 1, 2]) + ax.xaxis.set_major_formatter(ticker.ScalarFormatter()) + ax.xaxis.set_minor_formatter(NullFormatter()) + ax.set_xlabel('$k$/$k_{WT}$') + elif alteration=='g': + df = pd.read_csv('./Figures/Data/AUC_g_ex.csv') + ax.set_xscale("log") + ax.set_xticks([0.5, 1, 2]) + ax.xaxis.set_major_formatter(ticker.ScalarFormatter()) + ax.xaxis.set_minor_formatter(NullFormatter()) + ax.set_xlabel('$g$/$g_{WT}$') + for mod in model_names: + if mod == model_name_dict[model]: + ax.plot(df['alteration'], df[mod], color=clr_dict[mod], alpha=1, zorder=10, linewidth=2) + else: + ax.plot(df['alteration'], df[mod], color=clr_dict[mod],alpha=0.5, zorder=1, linewidth=1) + + if alteration=='shift': + ax.set_ylabel('Normalized $\Delta$AUC', labelpad=4) + else: + ax.set_ylabel('Normalized $\Delta$AUC', labelpad=0) + x = df['alteration'] + y = df[model_name_dict[model]] + ax.set_xlim(x.min(), x.max()) + ax.set_ylim(df[model_names].min().min(), df[model_names].max().max()) + + # x axis color gradient + cvals = [-2., 2] + colors = ['lightgrey', 'k'] + norm = plt.Normalize(min(cvals), max(cvals)) + tuples = list(zip(map(norm, cvals), colors)) + cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", tuples) + (xstart, xend) = ax.get_xlim() + (ystart, yend) = ax.get_ylim() + print(ystart, yend) + start = (xstart, ystart * 1.0) + end = (xend, ystart * 1.0) + ax = gradientaxis(ax, start, end, cmap, n=200, lw=4) + ax.spines['bottom'].set_visible(False) + return ax + +def plot_fI(ax, model='RS Pyramidal', type='shift', alt='m', color1='red', color2='dodgerblue'): + model_save_name = {'RS Pyramidal': 'RS_pyr_posp', + 'RS Inhibitory': 'RS_inhib_posp', + 'FS': 'FS_posp', + 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'RS_pyr_Kv', + 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'RS_inhib_Kv', + 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'FS_Kv', + 'Cb stellate': 'Cb_stellate', + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'Cb_stellate_Kv', + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'Cb_stellate_Kv_only', + 'STN': 'STN', + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'STN_Kv', + 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'STN_Kv_only'} + cvals = [-2., 2] + colors = [color1, color2] + norm = plt.Normalize(min(cvals), max(cvals)) + tuples = list(zip(map(norm, cvals), colors)) + cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", tuples) + colors = cmap(np.linspace(0, 1, 22)) + df = pd.read_csv('./Figures/Data/Model_fI/{}_fI.csv'.format(model_save_name[model])) + df.drop(['Unnamed: 0'], axis=1) + newdf = df.loc[df.index[(df['alt'] == alt) & (df['type'] == type)], :] + newdf['mag'] = newdf['mag'].astype('float') + newdf = newdf.sort_values('mag').reset_index() + c = 0 + for i in newdf.index: + ax.plot(json.loads(newdf.loc[i, 'I']), json.loads(newdf.loc[i, 'F']), color=colors[c]) + c += 1 + ax.set_ylabel('Frequency [Hz]') + ax.set_xlabel('Current [nA]') + if model == 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': + ax.set_title("Model G", x=0.2, y=1.0) + elif model == 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': + ax.set_title("Model I", x=0.2, y=1.0) + else: + ax.set_title("", x=0.2, y=1.0) + ax.spines["right"].set_visible(False) + ax.spines["top"].set_visible(False) + L = ax.get_ylim() + ax.set_ylim([0, L[1]]) + return ax + + +#%% +boxplot_style() +color_dict = {'Cb stellate': '#40A787', # cyan'# + 'RS Inhibitory': '#F0D730', # yellow + 'FS': '#C02717', # red + 'RS Pyramidal': '#007030', # dark green + 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#AAB71B', # lightgreen + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#008797', # light blue + 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#F78017', # orange + 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#478010', # green + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#53379B', # purple + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#2060A7', # blue + 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#873770', # magenta + 'STN': '#D03050' # pink + } +model_letter = { +'Cb stellate': 'A', +'RS Inhibitory': 'B', +'FS': 'C', +'RS Pyramidal': 'D', +'RS Inhibitory': 'E', +'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'F', +'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'G', +'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'H', +'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'I', +'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'J', +'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':'K', +'STN':'L', +} + + +# plot setup +marker_s_leg = 2 +max_width = 20 +pad_x = 0.85 +pad_y= 0.4 +pad_w = 1.1 +pad_h = 0.7 + +fig = plt.figure() +gs = fig.add_gridspec(3, 7, wspace=1.2, hspace=1.) +ax0 = fig.add_subplot(gs[0,2:7]) +ax0_ex = fig.add_subplot(gs[0,1]) +ax0_fI = fig.add_subplot(gs[0,0]) +ax1 = fig.add_subplot(gs[1,2:7]) +ax1_ex = fig.add_subplot(gs[1,1]) +ax1_fI = fig.add_subplot(gs[1,0]) +ax2 = fig.add_subplot(gs[2,2:7]) +ax2_ex = fig.add_subplot(gs[2,1]) +ax2_fI = fig.add_subplot(gs[2,0]) + +line_width = 1 +# plot fI examples +ax0_fI = plot_fI(ax0_fI, model='FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', type='shift', alt='s', color1='lightgrey', color2='k') +rec = plt.Rectangle((-pad_x, -pad_y), 1 + pad_w, 1 + pad_h, fill=False, lw=line_width,transform=ax0_fI.transAxes, color=color_dict['FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$'], alpha=1, zorder=-1) +rec = ax0_fI.add_patch(rec) +rec.set_clip_on(False) + +ax1_fI = plot_fI(ax1_fI, model='FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', type='slope', alt='u', color1='lightgrey', color2='k') +rec = plt.Rectangle((-pad_x, -pad_y), 1 + pad_w, 1 + pad_h, fill=False, lw=line_width,transform=ax1_fI.transAxes, color=color_dict['FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$'], alpha=1, zorder=-1) +rec = ax1_fI.add_patch(rec) +rec.set_clip_on(False) + +ax2_fI = plot_fI(ax2_fI, model='STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', type='g', alt='Leak', color1='lightgrey', color2='k') +rec = plt.Rectangle((-pad_x, -pad_y), 1 + pad_w, 1 + pad_h, fill=False, lw=line_width,transform=ax2_fI.transAxes, color=color_dict['STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$'], alpha=1, zorder=-1) +rec = ax2_fI.add_patch(rec) +rec.set_clip_on(False) + +# plot boxplots +boxplot_with_markers(ax0,max_width, alteration='shift') +boxplot_with_markers(ax1,max_width, alteration='slope') +boxplot_with_markers(ax2,max_width, alteration='g') + +# plot legend +pos = (0.225, -0.9) +ncol = 6 +model_legend(ax2, marker_s_leg, pos, ncol) + +# plot examples +plot_AUC_alt(ax0_ex,model='FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', color1='lightgrey', color2='k', alteration='shift') +plot_AUC_alt(ax1_ex,model='FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', color1='lightgrey', color2='k',alteration='slope') +plot_AUC_alt(ax2_ex, model='STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', color1='lightgrey', color2='k', alteration='g') + +# label subplots with letters +ax0_fI.text(-0.875, 1.35, string.ascii_uppercase[0], transform=ax0_fI.transAxes, size=10, weight='bold') +ax0_ex.text(-0.8, 1.35, string.ascii_uppercase[1], transform=ax0_ex.transAxes, size=10, weight='bold') +ax0.text(-0.075, 1.35, string.ascii_uppercase[2], transform=ax0.transAxes, size=10, weight='bold') + +ax1_fI.text(-0.875, 1.35, string.ascii_uppercase[3], transform=ax1_fI.transAxes,size=10, weight='bold') +ax1_ex.text(-0.8, 1.35, string.ascii_uppercase[4], transform=ax1_ex.transAxes, size=10, weight='bold') +ax1.text(-0.075, 1.35, string.ascii_uppercase[5], transform=ax1.transAxes, size=10, weight='bold') + +ax2_fI.text(-0.875, 1.35, string.ascii_uppercase[6], transform=ax2_fI.transAxes,size=10, weight='bold') +ax2_ex.text(-0.8, 1.35, string.ascii_uppercase[7], transform=ax2_ex.transAxes, size=10, weight='bold') +ax2.text(-0.075, 1.35, string.ascii_uppercase[8], transform=ax2.transAxes, size=10, weight='bold') + +#save +fig.set_size_inches(cm2inch(20.75,12)) +fig.savefig('./Figures/AUC_correlation.pdf', dpi=fig.dpi) #pdf #eps +# fig.savefig('./Figures/AUC_correlation.png', dpi=fig.dpi) #pdf #eps +plt.show() diff --git a/Figures/ramp_firing_letters.py b/Figures/ramp_firing_letters.py new file mode 100644 index 0000000..9888ec9 --- /dev/null +++ b/Figures/ramp_firing_letters.py @@ -0,0 +1,322 @@ +# # plot ramp protocol and responses of each model to ramp +# import numpy as np +# import pandas as pd +# import matplotlib.pyplot as plt +# import matplotlib.gridspec as gridspec +# from matplotlib.transforms import Bbox +# import string +# +# def cm2inch(*tupl): +# inch = 2.54 +# if isinstance(tupl[0], tuple): +# return tuple(i/inch for i in tupl[0]) +# else: +# return tuple(i/inch for i in tupl) +# +# #### from https://gist.github.com/dmeliza/3251476 ##################################################################### +# from matplotlib.offsetbox import AnchoredOffsetbox +# class AnchoredScaleBar(AnchoredOffsetbox): +# def __init__(self, transform, sizex=0, sizey=0, labelx=None, labely=None, loc=4, +# pad=0.1, borderpad=0.1, sep=2, prop=None, barcolor="black", barwidth=None, +# **kwargs): +# """ +# Draw a horizontal and/or vertical bar with the size in data coordinate +# of the give axes. A label will be drawn underneath (center-aligned). +# - transform : the coordinate frame (typically axes.transData) +# - sizex,sizey : width of x,y bar, in data units. 0 to omit +# - labelx,labely : labels for x,y bars; None to omit +# - loc : position in containing axes +# - pad, borderpad : padding, in fraction of the legend font size (or prop) +# - sep : separation between labels and bars in points. +# - **kwargs : additional arguments passed to base class constructor +# """ +# from matplotlib.patches import Rectangle +# from matplotlib.offsetbox import AuxTransformBox, VPacker, HPacker, TextArea, DrawingArea +# bars = AuxTransformBox(transform) +# if sizex: +# bars.add_artist(Rectangle((0, 0), sizex, 0, ec=barcolor, lw=barwidth, fc="none")) +# if sizey: +# bars.add_artist(Rectangle((0, 0), 0, sizey, ec=barcolor, lw=barwidth, fc="none")) +# +# if sizex and labelx: +# self.xlabel = TextArea(labelx) +# bars = VPacker(children=[bars, self.xlabel], align="center", pad=0, sep=sep) +# if sizey and labely: +# self.ylabel = TextArea(labely) +# bars = HPacker(children=[self.ylabel, bars], align="center", pad=0, sep=sep) +# +# AnchoredOffsetbox.__init__(self, loc, pad=pad, borderpad=borderpad, +# child=bars, prop=prop, frameon=False, **kwargs) +# +# +# def add_scalebar(ax, matchx=True, matchy=True, hidex=True, hidey=True, **kwargs): +# """ Add scalebars to axes +# Adds a set of scale bars to *ax*, matching the size to the ticks of the plot +# and optionally hiding the x and y axes +# - ax : the axis to attach ticks to +# - matchx,matchy : if True, set size of scale bars to spacing between ticks +# if False, size should be set using sizex and sizey params +# - hidex,hidey : if True, hide x-axis and y-axis of parent +# - **kwargs : additional arguments passed to AnchoredScaleBars +# Returns created scalebar object +# """ +# +# def f(axis): +# l = axis.get_majorticklocs() +# return len(l) > 1 and (l[1] - l[0]) +# +# if matchx: +# kwargs['sizex'] = f(ax.xaxis) +# kwargs['labelx'] = str(kwargs['sizex']) +# if matchy: +# kwargs['sizey'] = f(ax.yaxis) +# kwargs['labely'] = str(kwargs['sizey']) +# +# sb = AnchoredScaleBar(ax.transData, **kwargs) +# ax.add_artist(sb) +# +# if hidex: ax.xaxis.set_visible(False) +# if hidey: ax.yaxis.set_visible(False) +# if hidex and hidey: ax.set_frame_on(False) +# +# return sb +# ######################################################################################################################## +# +# +# def plot_ramp_V(ax, model='RS Pyramidal'): # , stop=750 +# model_ramp = pd.read_csv('./Figures/Data/model_ramp.csv') +# ax.plot(model_ramp['t'], model_ramp[model], 'k', linewidth=0.025) +# ax.set_ylabel('V') +# ax.set_xlabel('Time [s]') +# ax.set_ylim(-80, 60) +# ax.axis('off') +# ax.set_title(model) +# +# #% plot setup +# fig = plt.figure(figsize=cm2inch(17.6,17.6)) +# +# gs0 = fig.add_gridspec(3, 2, wspace=0.1) +# gs00 = gs0[:,0].subgridspec(7, 2, wspace=0.6, hspace=1) +# gs01 = gs0[:,1].subgridspec(7, 2, wspace=0.6, hspace=1) +# +# ax1_ramp = fig.add_subplot(gs00[0,0:2]) +# ax2_ramp = fig.add_subplot(gs01[0,0:2]) +# ax3_ramp = fig.add_subplot(gs00[1,0:2]) +# ax4_ramp = fig.add_subplot(gs01[1,0:2]) +# ax5_ramp = fig.add_subplot(gs00[2, 0:2]) +# ax6_ramp = fig.add_subplot(gs01[2, 0:2]) +# ax7_ramp = fig.add_subplot(gs00[3,0:2]) +# ax8_ramp = fig.add_subplot(gs01[3,0:2]) +# ax9_ramp = fig.add_subplot(gs00[4,0:2]) +# ax10_ramp = fig.add_subplot(gs01[4,0:2]) +# ax11_ramp = fig.add_subplot(gs00[5,0:2]) +# ax12_ramp = fig.add_subplot(gs01[5,0:2]) +# +# ramp_axs = [ax1_ramp, ax2_ramp, ax3_ramp, ax4_ramp, ax5_ramp,ax6_ramp, ax7_ramp, ax8_ramp, +# ax9_ramp, ax10_ramp, ax11_ramp, ax12_ramp] +# +# # order of models +# models = ['Cb stellate','RS Inhibitory','FS', 'RS Pyramidal','RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', +# 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', +# 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', +# 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', +# 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN'] +# +# # plot ramps +# for i in range(len(models)): +# plot_ramp_V(ramp_axs[i], model=models[i]) +# +# # add scalebar +# plt.rcParams.update({'font.size': 6}) +# +# add_scalebar(ax11_ramp, matchx=False, matchy=False, hidex=True, hidey=True, sizex=1000, sizey=50, labelx='1 s', +# labely='50 mV', loc=3, pad=-2, borderpad=0, barwidth=1, bbox_to_anchor=Bbox.from_bounds(-0.05, 0.1, 1, 1), +# bbox_transform=ax11_ramp.transAxes) +# # add_scalebar(ax12_ramp, matchx=False, matchy=False, hidex=True, hidey=True, sizex=1000, sizey=25, labelx='1 s', +# # labely='25 mV', loc=3, pad=-2, borderpad=0, barwidth=2, bbox_to_anchor=Bbox.from_bounds(-0.05, 0.1, 1, 1), +# # bbox_transform=ax12_ramp.transAxes) +# +# # add subplot labels +# for i in range(0,len(models)): +# ramp_axs[i].text(-0.05, 1.08, string.ascii_uppercase[i], transform=ramp_axs[i].transAxes, size=10, weight='bold') +# +# fig.savefig('./Figures/ramp_firing.pdf', dpi=3000) +# plt.show() + + + +# plot ramp protocol and responses of each model to ramp +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import matplotlib.gridspec as gridspec +from matplotlib.transforms import Bbox +import string + +def cm2inch(*tupl): + inch = 2.54 + if isinstance(tupl[0], tuple): + return tuple(i/inch for i in tupl[0]) + else: + return tuple(i/inch for i in tupl) + +#### from https://gist.github.com/dmeliza/3251476 ##################################################################### +from matplotlib.offsetbox import AnchoredOffsetbox +class AnchoredScaleBar(AnchoredOffsetbox): + def __init__(self, transform, sizex=0, sizey=0, labelx=None, labely=None, loc=4, + pad=0.1, borderpad=0.1, sep=2, prop=None, barcolor="black", barwidth=None, + **kwargs): + """ + Draw a horizontal and/or vertical bar with the size in data coordinate + of the give axes. A label will be drawn underneath (center-aligned). + - transform : the coordinate frame (typically axes.transData) + - sizex,sizey : width of x,y bar, in data units. 0 to omit + - labelx,labely : labels for x,y bars; None to omit + - loc : position in containing axes + - pad, borderpad : padding, in fraction of the legend font size (or prop) + - sep : separation between labels and bars in points. + - **kwargs : additional arguments passed to base class constructor + """ + from matplotlib.patches import Rectangle + from matplotlib.offsetbox import AuxTransformBox, VPacker, HPacker, TextArea, DrawingArea + bars = AuxTransformBox(transform) + if sizex: + bars.add_artist(Rectangle((0, 0), sizex, 0, ec=barcolor, lw=barwidth, fc="none")) + if sizey: + bars.add_artist(Rectangle((0, 0), 0, sizey, ec=barcolor, lw=barwidth, fc="none")) + + if sizex and labelx: + self.xlabel = TextArea(labelx) + bars = VPacker(children=[bars, self.xlabel], align="center", pad=0, sep=sep) + if sizey and labely: + self.ylabel = TextArea(labely) + bars = HPacker(children=[self.ylabel, bars], align="center", pad=0, sep=sep) + + AnchoredOffsetbox.__init__(self, loc, pad=pad, borderpad=borderpad, + child=bars, prop=prop, frameon=False, **kwargs) + + +def add_scalebar(ax, matchx=True, matchy=True, hidex=True, hidey=True, **kwargs): + """ Add scalebars to axes + Adds a set of scale bars to *ax*, matching the size to the ticks of the plot + and optionally hiding the x and y axes + - ax : the axis to attach ticks to + - matchx,matchy : if True, set size of scale bars to spacing between ticks + if False, size should be set using sizex and sizey params + - hidex,hidey : if True, hide x-axis and y-axis of parent + - **kwargs : additional arguments passed to AnchoredScaleBars + Returns created scalebar object + """ + + def f(axis): + l = axis.get_majorticklocs() + return len(l) > 1 and (l[1] - l[0]) + + if matchx: + kwargs['sizex'] = f(ax.xaxis) + kwargs['labelx'] = str(kwargs['sizex']) + if matchy: + kwargs['sizey'] = f(ax.yaxis) + kwargs['labely'] = str(kwargs['sizey']) + + sb = AnchoredScaleBar(ax.transData, **kwargs) + ax.add_artist(sb) + + if hidex: ax.xaxis.set_visible(False) + if hidey: ax.yaxis.set_visible(False) + if hidex and hidey: ax.set_frame_on(False) + + return sb +######################################################################################################################## + + +def plot_ramp_V(ax, model='RS Pyramidal'): # , stop=750 + model_ramp = pd.read_csv('./Figures/Data/model_ramp.csv') + # ax.plot(model_ramp['t'], model_ramp[model], 'k', linewidth=0.0025) + ax.plot(model_ramp['t'], model_ramp[model], 'k', linewidth=0.1) + ax.set_ylabel('V') + ax.set_xlabel('Time [s]') + ax.set_ylim(-80, 60) + ax.axis('off') + ax.set_title(model, fontsize=8) + +def plot_I_ramp(ax): + dt = 0.01 + I_low = 0 + I_high = 0.001 + initial_period = 1000 + + sec = 4 + ramp_len = int(4 * 1000 * 1 / dt) + stim_time = ramp_len * 2 + I_amp = np.array([0]) + I_amp = np.reshape(I_amp, (1, I_amp.shape[0])) + I_ramp = np.zeros((stim_time, 1)) @ I_amp + I_ramp[:, :] = np.ones((stim_time, 1)) @ I_amp + stim_num_step = I_ramp.shape[1] + start=0 + I_ramp[start:int(start + ramp_len), 0] = np.linspace(0, I_high, ramp_len) + I_ramp[int(start + ramp_len):int(start + ramp_len * 2), 0] = np.linspace(I_high, 0, ramp_len) + + t = np.arange(0, 4000 * 2, dt) + ax.plot(t, I_ramp) + ax.set_ylabel('I') + ax.set_xlabel('Time [s]') + ax.axis('off') + ax.set_title('Ramp Current', fontsize=8, x=0.5, y=-0.5) + return ax + +#% plot setup +fig = plt.figure(figsize=cm2inch(17.6,25)) + +gs0 = fig.add_gridspec(2, 1, wspace=0.) +gs00 = gs0[:].subgridspec(13, 1, wspace=0.7, hspace=1.0) + +ax1_ramp = fig.add_subplot(gs00[0]) +ax2_ramp = fig.add_subplot(gs00[1]) +ax3_ramp = fig.add_subplot(gs00[2]) +ax4_ramp = fig.add_subplot(gs00[3]) +ax5_ramp = fig.add_subplot(gs00[4]) +ax6_ramp = fig.add_subplot(gs00[5]) +ax7_ramp = fig.add_subplot(gs00[6]) +ax8_ramp = fig.add_subplot(gs00[7]) +ax9_ramp = fig.add_subplot(gs00[8]) +ax10_ramp = fig.add_subplot(gs00[9]) +ax11_ramp = fig.add_subplot(gs00[10]) +ax12_ramp = fig.add_subplot(gs00[11]) +ax13_I = fig.add_subplot(gs00[12]) +ramp_axs = [ax1_ramp, ax2_ramp, ax3_ramp, ax4_ramp, ax5_ramp,ax6_ramp, ax7_ramp, ax8_ramp, + ax9_ramp, ax10_ramp, ax11_ramp, ax12_ramp] + +# order of models +models = ['Cb stellate','RS Inhibitory','FS', 'RS Pyramidal','RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN'] + +# plot ramps +for i in range(len(models)): + plot_ramp_V(ramp_axs[i], model=models[i]) + +# add scalebar +plt.rcParams.update({'font.size': 6}) + +add_scalebar(ax12_ramp, matchx=False, matchy=False, hidex=True, hidey=True, sizex=1000, sizey=50, labelx='1 s', + labely='50 mV', loc=3, pad=-2, borderpad=0, barwidth=1, bbox_to_anchor=Bbox.from_bounds(0.01, 0.05, 1, 1), + bbox_transform=ax12_ramp.transAxes) + +ax13_I = plot_I_ramp(ax13_I) +add_scalebar(ax13_I, matchx=False, matchy=False, hidex=True, hidey=True, sizex=1000, sizey=0.0005, labelx='1 s', + labely='0.5 $I_{max}$', loc=3, pad=-2, borderpad=0, barwidth=1, + bbox_to_anchor=Bbox.from_bounds(0.0, -0.01, 1, 1), bbox_transform=ax13_I.transAxes) + +# add subplot labels +for i in range(0,len(models)): + ramp_axs[i].text(-0.01, 1.1, string.ascii_uppercase[i], transform=ramp_axs[i].transAxes, size=10, weight='bold') + +#save +fig.set_size_inches(cm2inch(17.6,22)) +fig.savefig('./Figures/ramp_firing.png', dpi=fig.dpi)#pdf #eps +plt.show() + diff --git a/Figures/rheobase_correlation.pdf b/Figures/rheobase_correlation.pdf index a77443ef3ab23ca4545cb1d714602dd7ca9d14ad..173de7e96f44a3ab4281193d6c9591ac2550e68b 100644 GIT binary patch delta 40147 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

Za_4Y+C@$}#? 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 F_&@l~>a+j= delta 40039 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�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 diff --git a/Figures/rheobase_correlation.py b/Figures/rheobase_correlation.py index f97e172..0f69e6d 100644 --- a/Figures/rheobase_correlation.py +++ b/Figures/rheobase_correlation.py @@ -157,6 +157,8 @@ def boxplot_with_markers(ax,max_width, alteration='shift', msize=2.2): clr_dict = {} for m in range(len(model_names)): clr_dict[model_names[m]] = colors[m] + print(colors) + print(clr_dict) Markers = ["o", "o", "o", "^", "^", "^", "D", "D", "D", "s", "s", "s"] if alteration=='shift': i = 3 # Kv1.1 act @@ -217,27 +219,52 @@ def boxplot_with_markers(ax,max_width, alteration='shift', msize=2.2): def model_legend(ax, marker_s_leg, pos, ncol): - colorslist = [ '#40A787', # cyan'# - '#F0D730', # yellow - '#C02717', # red - '#007030', # dark green - '#AAB71B', # lightgreen - '#008797', # light blue - '#F78017', # orange - '#478010', # green - '#53379B', # purple - '#2060A7', # blue - '#873770', # magenta - '#D03050' # pink - ] - import matplotlib.colors - colors = [matplotlib.colors.to_rgb(c) for c in colorslist] + # colorslist = [ '#40A787', # cyan'# + # '#F0D730', # yellow + # '#C02717', # red + # '#007030', # dark green + # '#AAB71B', # lightgreen + # '#008797', # light blue + # '#F78017', # orange + # '#478010', # green + # '#53379B', # purple + # '#2060A7', # blue + # '#873770', # magenta + # '#D03050' # pink + # ] + # import matplotlib.colors + # colors = [matplotlib.colors.to_rgb(c) for c in colorslist] model_pos = {'Cb stellate':0, 'RS Inhibitory':1, 'FS':2, 'RS Pyramidal':3, 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':4, 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':5, 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':6, 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':7, 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':8, 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':9, 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':10, 'STN':11} + + # model_pos = {'Cb stellate': 0, 'RS Inhibitory': 1, 'FS': 2, 'RS Pyramidal': 3, + # 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 4, + # 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 5, + # 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 6, + # 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 7, + # 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 8, + # 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 9, + # 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 10, 'STN': 11} + colorslist = ['#007030', # dark green + '#F0D730', # yellow + '#C02717', # red + '#478010', # green + '#AAB71B', # lightgreen + '#F78017', # orange + '#40A787', # cyan'# + '#008797', # light blue + '#2060A7', # blue + '#D03050', # pink + '#53379B', # purple + '#873770', # magenta + ] + + import matplotlib.colors + colors = [matplotlib.colors.to_rgb(c) for c in colorslist] Markers = ["o", "o", "o", "^", "^", "^", "D", "D", "D", "s", "s", "s"] RS_p = mlines.Line2D([], [], color=colors[model_pos['RS Pyramidal']], marker=Markers[model_pos['RS Pyramidal']], markersize=marker_s_leg, linestyle='None', label='RS pyramidal') diff --git a/Figures/rheobase_correlation_letters.py b/Figures/rheobase_correlation_letters.py new file mode 100644 index 0000000..cf02cf0 --- /dev/null +++ b/Figures/rheobase_correlation_letters.py @@ -0,0 +1,648 @@ +# -*- coding: utf-8 -*- +""" +Created on Sat Jul 3 19:52:04 2021 + +@author: nils +""" +import pandas as pd +import numpy as np +import string +import textwrap +import json +import matplotlib +import matplotlib.lines as mlines +from matplotlib import ticker +from matplotlib.ticker import NullFormatter +from Figures.plotstyle import boxplot_style + + +def cm2inch(*tupl): + inch = 2.54 + if isinstance(tupl[0], tuple): + return tuple(i/inch for i in tupl[0]) + else: + return tuple(i/inch for i in tupl) +#%% ##################### From https://stackoverflow.com/questions/52878845/swarmplot-with-hue-affecting-marker-beyond-color ## +# to change marker types in seaborn swarmplot + +import seaborn as sns +import matplotlib.pyplot as plt + +############## Begin hack ############## +from matplotlib.axes._axes import Axes +from matplotlib.markers import MarkerStyle +from numpy import ndarray + +def GetColor2Marker(markers): + colorslist = ['#40A787', # cyan'# + '#F0D730', # yellow + '#C02717', # red + '#007030', # dark green + '#AAB71B', # lightgreen + '#008797', # light blue + '#F78017', # orange + '#478010', # green + '#53379B', # purple + '#2060A7', # blue + '#873770', # magenta + '#D03050' # pink + ] + import matplotlib.colors + palette = [matplotlib.colors.to_rgb(c) for c in colorslist] # + mkcolors = [(palette[i]) for i in range(len(markers))] + return dict(zip(mkcolors,markers)) + +def fixlegend(ax,markers,markersize=3,**kwargs): + # Fix Legend + legtitle = ax.get_legend().get_title().get_text() + _,l = ax.get_legend_handles_labels() + colorslist = ['#40A787', # cyan'# + '#F0D730', # yellow + '#C02717', # red + '#007030', # dark green + '#AAB71B', # lightgreen + '#008797', # light blue + '#F78017', # orange + '#478010', # green + '#53379B', # purple + '#2060A7', # blue + '#873770', # magenta + '#D03050' # pink + ] + import matplotlib.colors + palette = [matplotlib.colors.to_rgb(c) for c in colorslist] + mkcolors = [(palette[i]) for i in range(len(markers))] + newHandles = [plt.Line2D([0],[0], ls="none", marker=m, color=c, mec="none", markersize=markersize,**kwargs) \ + for m,c in zip(markers, mkcolors)] + ax.legend(newHandles,l) + leg = ax.get_legend() + leg.set_title(legtitle) + +old_scatter = Axes.scatter +def new_scatter(self, *args, **kwargs): + colors = kwargs.get("c", None) + co2mk = kwargs.pop("co2mk",None) + FinalCollection = old_scatter(self, *args, **kwargs) + if co2mk is not None and isinstance(colors, ndarray): + Color2Marker = GetColor2Marker(co2mk) + paths=[] + for col in colors: + mk=Color2Marker[tuple(col)] + marker_obj = MarkerStyle(mk) + paths.append(marker_obj.get_path().transformed(marker_obj.get_transform())) + FinalCollection.set_paths(paths) + return FinalCollection +Axes.scatter = new_scatter +############## End hack. ############## +######################################################################################################################## +#%% add gradient arrows +import matplotlib.pyplot as plt +import matplotlib.transforms +import matplotlib.path +from matplotlib.collections import LineCollection +def rainbowarrow(ax, start, end, cmap, n=50,lw=3): + # Arrow shaft: LineCollection + x = np.linspace(start[0],end[0],n) + y = np.linspace(start[1],end[1],n) + points = np.array([x,y]).T.reshape(-1,1,2) + segments = np.concatenate([points[:-1],points[1:]], axis=1) + lc = LineCollection(segments, cmap=cmap, linewidth=lw) + lc.set_array(np.linspace(0,1,n)) + ax.add_collection(lc) + # Arrow head: Triangle + tricoords = [(0,-0.02),(0.025,0),(0,0.02),(0,-0.02)] + angle = np.arctan2(end[1]-start[1],end[0]-start[0]) + rot = matplotlib.transforms.Affine2D().rotate(angle) + tricoords2 = rot.transform(tricoords) + tri = matplotlib.path.Path(tricoords2, closed=True) + ax.scatter(end[0],end[1], c=1, s=(4*lw)**2, marker=tri, cmap=cmap,vmin=0) + ax.autoscale_view() + return ax + +def gradientaxis(ax, start, end, cmap, n=100,lw=1): + # Arrow shaft: LineCollection + x = np.linspace(start[0],end[0],n) + y = np.linspace(start[1],end[1],n) + points = np.array([x,y]).T.reshape(-1,1,2) + segments = np.concatenate([points[:-1],points[1:]], axis=1) + lc = LineCollection(segments, cmap=cmap, linewidth=lw,zorder=15) + lc.set_array(np.linspace(0,1,n)) + ax.add_collection(lc) + return ax +#%% +def boxplot_with_markers(ax,max_width, alteration='shift', msize=2.2): + hlinewidth = 0.5 + model_names = ['RS pyramidal','RS inhibitory','FS', + 'RS pyramidal +$K_V1.1$','RS inhibitory +$K_V1.1$', + 'FS +$K_V1.1$','Cb stellate','Cb stellate +$K_V1.1$', + 'Cb stellate $\Delta$$K_V1.1$','STN','STN +$K_V1.1$', + 'STN $\Delta$$K_V1.1$'] + + colorslist = ['#007030', # dark green + '#F0D730', # yellow + '#C02717', # red + '#478010', # green + '#AAB71B', # lightgreen + '#F78017', # orange + '#40A787', # cyan'# + '#008797', # light blue + '#2060A7', # blue + '#D03050', # pink + '#53379B', # purple + '#873770', # magenta + ] + + import matplotlib.colors + colors = [matplotlib.colors.to_rgb(c) for c in colorslist] + clr_dict = {} + for m in range(len(model_names)): + clr_dict[model_names[m]] = colors[m] + Markers = ["o", "o", "o", "^", "^", "^", "D", "D", "D", "s", "s", "s"] + if alteration=='shift': + i = 3 # Kv1.1 act + ax.axvspan(i - 0.4, i + 0.4, fill=False, edgecolor='k') + df = pd.read_csv('./Figures/Data/rheo_shift_corr.csv') + sns.swarmplot(y="corr", x="$\Delta V_{1/2}$", hue="model", data=df, + palette=clr_dict, linewidth=0, orient='v', ax=ax, size=msize, + order=['Na activation', 'Na inactivation', 'K activation', '$K_V1.1$ activation', + '$K_V1.1$ inactivation', 'A activation', 'A inactivation'], + hue_order=model_names, co2mk=Markers) + lim = ax.get_xlim() + ax.plot([lim[0], lim[1]], [0, 0], ':r',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [1, 1], ':k',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [-1, -1], ':k',linewidth=hlinewidth) + ax.set_title("Shift ($\Delta V_{1/2}$)", y=1.05) + ax.set_xticklabels(['Na \nactivation', 'Na \ninactivation', 'K \nactivation', '$K_V1.1$ \nactivation', + '$K_V1.1$ \ninactivation', 'A \nactivation', 'A \ninactivation']) + elif alteration=='slope': + i = 4 # Kv1.1 inact + ax.axvspan(i - 0.4, i + 0.4, fill=False, edgecolor='k') + df = pd.read_csv('./Figures/Data/rheo_scale_corr.csv') + + # Add in points to show each observation + sns.swarmplot(y="corr", x="Slope (k)", hue="model", data=df, + palette=clr_dict, linewidth=0, orient='v', ax=ax, size=msize, + order=['Na activation', 'Na inactivation', 'K activation', '$K_V1.1$ activation', + '$K_V1.1$ inactivation', 'A activation', 'A inactivation'], + hue_order=model_names, co2mk=Markers) + lim = ax.get_xlim() + ax.plot([lim[0], lim[1]], [0, 0], ':r',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [1, 1], ':k',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [-1, -1], ':k',linewidth=hlinewidth) + ax.set_title("Slope (k)", y=1.05) + ax.set_xticklabels(['Na \nactivation', 'Na \ninactivation', 'K \nactivation', '$K_V1.1$ \nactivation', + '$K_V1.1$ \ninactivation', 'A \nactivation', 'A \ninactivation']) + elif alteration=='g': + i = 4 # Leak + ax.axvspan(i - 0.4, i + 0.4, fill=False, edgecolor='k') + df = pd.read_csv('./Figures/Data/rheo_g_corr.csv') + + # Add in points to show each observation + sns.swarmplot(y="corr", x="g", hue="model", data=df, + palette=clr_dict, linewidth=0, orient='v', ax=ax, size=msize, + order=['Na', 'K', '$K_V1.1$', 'A', 'Leak'], + hue_order=model_names, co2mk=Markers) + lim = ax.get_xlim() + ax.plot([lim[0], lim[1]], [0, 0], ':r',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [1, 1], ':k',linewidth=hlinewidth) + ax.plot([lim[0], lim[1]], [-1, -1], ':k',linewidth=hlinewidth) + ax.set_title("Conductance (g)", y=1.05) + ax.set_xticklabels(textwrap.fill(x.get_text(), max_width) for x in ax.get_xticklabels()) + else: + print('Please chose "shift", "slope" or "g"') + ax.get_legend().remove() + ax.xaxis.grid(False) + sns.despine(trim=True, bottom=True, ax=ax) + ax.set(xlabel=None, ylabel=r'Kendall $\it{\tau}$') + + +def model_legend(ax, marker_s_leg, pos, ncol): + colorslist = [ '#40A787', # cyan'# + '#F0D730', # yellow + '#C02717', # red + '#007030', # dark green + '#AAB71B', # lightgreen + '#008797', # light blue + '#F78017', # orange + '#478010', # green + '#53379B', # purple + '#2060A7', # blue + '#873770', # magenta + '#D03050' # pink + ] + model_names = ['RS pyramidal', 'RS inhibitory', 'FS', + 'RS pyramidal +$K_V1.1$', 'RS inhibitory +$K_V1.1$', + 'FS +$K_V1.1$', 'Cb stellate', 'Cb stellate +$K_V1.1$', + 'Cb stellate $\Delta$$K_V1.1$', 'STN', 'STN +$K_V1.1$', + 'STN $\Delta$$K_V1.1$'] + + # colorslist = ['#007030', # dark green + # '#F0D730', # yellow + # '#C02717', # red + # '#478010', # green + # '#AAB71B', # lightgreen + # '#F78017', # orange + # '#40A787', # cyan'# + # '#008797', # light blue + # '#2060A7', # blue + # '#D03050', # pink + # '#53379B', # purple + # '#873770', # magenta + # ] + + import matplotlib.colors + colors = [matplotlib.colors.to_rgb(c) for c in colorslist] + clr_dict = {} + for m in range(len(model_names)): + clr_dict[model_names[m]] = colors[m] + + import matplotlib.colors + colors = [matplotlib.colors.to_rgb(c) for c in colorslist] + # model_pos = {'Cb stellate':0, 'RS Inhibitory':1, 'FS':2, 'RS Pyramidal':3, + # 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':4, + # 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':5, 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':6, + # 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':7, 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':8, + # 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':9, + # 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':10, 'STN':11} + Markers = ["o", "o", "o", "^", "^", "^", "D", "D", "D", "s", "s", "s"] + + model_pos = {'RS Pyramidal':0, 'RS Inhibitory':1, 'FS':2, + 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':3, 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':4, + 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':5, 'Cb stellate':6, 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':7, + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':8, 'STN':9, 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':10, + 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$':11} + + + + RS_p = mlines.Line2D([], [], color='#007030', marker="^", + markersize=marker_s_leg, linestyle='None', + label='Model D') + RS_i = mlines.Line2D([], [], color='#F0D730', marker="o", + markersize=marker_s_leg, linestyle='None', + label='Model B') + FS = mlines.Line2D([], [], color='#C02717', marker="o", markersize=marker_s_leg, + linestyle='None', label='Model C') + RS_p_Kv = mlines.Line2D([], [], color='#478010', + marker="D", + markersize=marker_s_leg, linestyle='None', + label='Model H') + RS_i_Kv = mlines.Line2D([], [], color='#AAB71B', + marker="^", + markersize=marker_s_leg, linestyle='None', + label='Model E') + FS_Kv = mlines.Line2D([], [], color='#F78017', + marker="D", markersize=marker_s_leg, + linestyle='None', label='Model G') + Cb = mlines.Line2D([], [], color='#40A787', marker="o", + markersize=marker_s_leg, linestyle='None', + label='Model A') + Cb_pl = mlines.Line2D([], [], color='#008797', + marker="^", + markersize=marker_s_leg, linestyle='None', + label='Model F') + Cb_sw = mlines.Line2D([], [], color='#2060A7', + marker="s", + markersize=marker_s_leg, linestyle='None', + label='Model J') + STN = mlines.Line2D([], [], color='#D03050', marker="s", markersize=marker_s_leg, + linestyle='None', label='Model L') + STN_pl = mlines.Line2D([], [], color='#53379B', + marker="D", + markersize=marker_s_leg, linestyle='None', + label='Model I') + STN_sw = mlines.Line2D([], [], color='#873770', + marker="s", + markersize=marker_s_leg, linestyle='None', + label='Model K') + # + # RS_p = mlines.Line2D([], [], color=colors[model_pos['RS Pyramidal']], marker=Markers[model_pos['RS Pyramidal']], + # markersize=marker_s_leg, linestyle='None', + # label='Model D') + # RS_i = mlines.Line2D([], [], color=colors[model_pos['RS Inhibitory']], marker=Markers[model_pos['RS Inhibitory']], + # markersize=marker_s_leg, linestyle='None', + # label='Model B') + # FS = mlines.Line2D([], [], color=colors[model_pos['FS']], marker=Markers[model_pos['FS']], markersize=marker_s_leg, + # linestyle='None', label='Model C') + # RS_p_Kv = mlines.Line2D([], [], color=colors[model_pos['RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # marker=Markers[model_pos['RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # markersize=marker_s_leg, linestyle='None', + # label='Model H') + # RS_i_Kv = mlines.Line2D([], [], color=colors[model_pos['RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # marker=Markers[model_pos['RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # markersize=marker_s_leg, linestyle='None', + # label='Model E') + # FS_Kv = mlines.Line2D([], [], color=colors[model_pos['FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # marker=Markers[model_pos['FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], markersize=marker_s_leg, + # linestyle='None', label='Model G') + # Cb = mlines.Line2D([], [], color=colors[model_pos['Cb stellate']], marker=Markers[model_pos['Cb stellate']], + # markersize=marker_s_leg, linestyle='None', + # label='Model A') + # Cb_pl = mlines.Line2D([], [], color=colors[model_pos['Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # marker=Markers[model_pos['Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # markersize=marker_s_leg, linestyle='None', + # label='Model F') + # Cb_sw = mlines.Line2D([], [], color=colors[model_pos['Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # marker=Markers[model_pos['Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # markersize=marker_s_leg, linestyle='None', + # label='Model J') + # STN = mlines.Line2D([], [], color=colors[model_pos['STN']], marker=Markers[model_pos['STN']], markersize=marker_s_leg, + # linestyle='None', label='Model L') + # STN_pl = mlines.Line2D([], [], color=colors[model_pos['STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # marker=Markers[model_pos['STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # markersize=marker_s_leg, linestyle='None', + # label='Model I') + # STN_sw = mlines.Line2D([], [], color=colors[model_pos['STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # marker=Markers[model_pos['STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$']], + # markersize=marker_s_leg, linestyle='None', + # label='Model K') + # ax.legend(handles=[RS_p, RS_i, FS, RS_p_Kv, RS_i_Kv, FS_Kv, Cb, Cb_pl, Cb_sw, STN, STN_pl, STN_sw], loc='center', + # bbox_to_anchor=pos, ncol=ncol, frameon=False) + ax.legend(handles=[Cb, RS_i, FS, RS_p, RS_i_Kv, Cb_pl, FS_Kv, RS_p_Kv, STN_pl, Cb_sw, STN_sw, STN], loc='center', + bbox_to_anchor=pos, ncol=ncol, frameon=False) + +def plot_rheo_alt(ax, model='FS', color1='red', color2='dodgerblue', alteration='shift'): + ax.spines["right"].set_visible(False) + ax.spines["top"].set_visible(False) + model_names = ['RS Pyramidal','RS Inhibitory','FS', + 'RS Pyramidal +$K_V1.1$','RS Inhibitory +$K_V1.1$', + 'FS +$K_V1.1$','Cb stellate','Cb stellate +$K_V1.1$', + 'Cb stellate $\Delta$$K_V1.1$','STN','STN +$K_V1.1$', + 'STN $\Delta$$K_V1.1$'] + + model_name_dict = {'RS Pyramidal': 'RS Pyramidal', + 'RS Inhibitory': 'RS Inhibitory', + 'FS': 'FS', + 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'RS Pyramidal +$K_V1.1$', + 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'RS Inhibitory +$K_V1.1$', + 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'FS +$K_V1.1$', + 'Cb stellate': 'Cb stellate', + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'Cb stellate +$K_V1.1$', + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'Cb stellate $\Delta$$K_V1.1$', + 'STN': 'STN', + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'STN +$K_V1.1$', + 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'STN $\Delta$$K_V1.1$'} + + colorslist = ['#007030', # dark green + '#F0D730', # yellow + '#C02717', # red + '#478010', # green + '#AAB71B', # lightgreen + '#F78017', # orange + '#40A787', # cyan'# + '#008797', # light blue + '#2060A7', # blue + '#D03050', # pink + '#53379B', # purple + '#873770', # magenta + ] + import matplotlib.colors + colors = [matplotlib.colors.to_rgb(c) for c in colorslist] + clr_dict = {} + for m in range(len(model_names)): + clr_dict[model_names[m]] = colors[m] + if alteration=='shift': + df = pd.read_csv('./Figures/Data/rheo_shift_ex.csv') + df = df.sort_values('alteration') + ax.set_xlabel('$\Delta$$V_{1/2}$') + elif alteration=='slope': + df = pd.read_csv('./Figures/Data/rheo_slope_ex.csv') + ax.set_xscale("log") + ax.set_xticks([0.5, 1, 2]) + ax.xaxis.set_major_formatter(ticker.ScalarFormatter()) + ax.xaxis.set_minor_formatter(NullFormatter()) + ax.set_xlabel('$k$/$k_{WT}$') + elif alteration=='g': + df = pd.read_csv('./Figures/Data/rheo_g_ex.csv') + ax.set_xscale("log") + ax.set_xticks([0.5, 1, 2]) + ax.xaxis.set_major_formatter(ticker.ScalarFormatter()) + ax.xaxis.set_minor_formatter(NullFormatter()) + ax.set_xlabel('$g$/$g_{WT}$') + for mod in model_names: + if mod == model_name_dict[model]: + ax.plot(df['alteration'], df[mod], color=clr_dict[mod], alpha=1, zorder=10, linewidth=2) + else: + ax.plot(df['alteration'], df[mod], color=clr_dict[mod], alpha=0.5, zorder=1, linewidth=1) + + ax.set_ylabel('$\Delta$ Rheobase (nA)', labelpad=0) + x = df['alteration'] + y = df[model_name_dict[model]] + ax.set_xlim(x.min(), x.max()) + ax.set_ylim(df[model_names].min().min(), df[model_names].max().max()) + + # x axis color gradient + cvals = [-2., 2] + colors = ['lightgrey', 'k'] + norm = plt.Normalize(min(cvals), max(cvals)) + tuples = list(zip(map(norm, cvals), colors)) + cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", tuples) + (xstart, xend) = ax.get_xlim() + (ystart, yend) = ax.get_ylim() + print(ystart, yend) + start = (xstart, ystart*1.0) + end = (xend, ystart*1.0) + ax = gradientaxis(ax, start, end, cmap, n=200,lw=4) + ax.spines['bottom'].set_visible(False) + # ax.set_ylim(ystart, yend) + + #xlabel tick colors + # my_colors = ['lightgrey', 'grey', 'k'] + # for ticklabel, tickcolor in zip(ax.get_xticklabels(), my_colors): + # ticklabel.set_color(tickcolor) + return ax + +def plot_fI(ax, model='RS Pyramidal', type='shift', alt='m', color1='red', color2='dodgerblue'): + model_save_name = {'RS Pyramidal': 'RS_pyr_posp', + 'RS Inhibitory': 'RS_inhib_posp', + 'FS': 'FS_posp', + 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'RS_pyr_Kv', + 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'RS_inhib_Kv', + 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'FS_Kv', + 'Cb stellate': 'Cb_stellate', + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'Cb_stellate_Kv', + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'Cb_stellate_Kv_only', + 'STN': 'STN', + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'STN_Kv', + 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': 'STN_Kv_only'} + cvals = [-2., 2] + colors = [color1, color2] + norm = plt.Normalize(min(cvals), max(cvals)) + tuples = list(zip(map(norm, cvals), colors)) + cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", tuples) + colors = cmap(np.linspace(0, 1, 22)) + df = pd.read_csv('./Figures/Data/Model_fI/{}_fI.csv'.format(model_save_name[model])) + df.drop(['Unnamed: 0'], axis=1) + newdf = df.loc[df.index[(df['alt'] == alt) & (df['type'] == type)], :] + newdf['mag'] = newdf['mag'].astype('float') + newdf = newdf.sort_values('mag').reset_index() + c = 0 + for i in newdf.index: + ax.plot(json.loads(newdf.loc[i, 'I']), json.loads(newdf.loc[i, 'F']), color=colors[c]) + c += 1 + + # colors2 = [colors[10, :], 'k'] + # norm2 = plt.Normalize(min(cvals), max(cvals)) + # tuples2 = list(zip(map(norm2, cvals), colors2)) + # cmap2 = matplotlib.colors.LinearSegmentedColormap.from_list("", tuples2) + # + # colors3 = [colors[11, :], 'lightgrey'] + # norm3 = plt.Normalize(min(cvals), max(cvals)) + # tuples3 = list(zip(map(norm3, cvals), colors3)) + # cmap3 = matplotlib.colors.LinearSegmentedColormap.from_list("", tuples3) + # + # start = (1.1, json.loads(newdf.loc[10, 'F'])[-1]) + # end = (1.1, json.loads(newdf.loc[20, 'F'])[-1])#-json.loads(newdf.loc[20, 'F'])[-1]*0.1) + # ax = rainbowarrow(ax, start, end, cmap2, n=50, lw=1) + # ax.text(1.15, json.loads(newdf.loc[20, 'F'])[-1], '$+ \Delta V$', fontsize=4, color='k') + # + # start = (1.1, json.loads(newdf.loc[10, 'F'])[-1]) + # end = (1.1, json.loads(newdf.loc[0, 'F'])[-1])#-json.loads(newdf.loc[0, 'F'])[-1]*0.1) + # ax = rainbowarrow(ax, start, end, cmap3, n=50, lw=1) + # ax.text(1.15, json.loads(newdf.loc[0, 'F'])[-1], '$- \Delta V$', fontsize=4, color='lightgrey') + + ax.set_ylabel('Frequency [Hz]') + ax.set_xlabel('Current [nA]') + if model == 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': + ax.set_title("Model G", x=0.2, y=1.0) + elif model == 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': + ax.set_title("Model F", x=0.2, y=1.0) + elif model == 'Cb stellate': + ax.set_title("Model A", x=0.2, y=1.0) + else: + ax.set_title("", x=0.2, y=1.0) + # plot_rheo_alt(ax0_ex, model='FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', color1='lightgrey', color2='k', + # alteration='shift') + # plot_rheo_alt(ax1_ex, model='Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', color1='lightgrey', color2='k', + # alteration='slope') + # plot_rheo_alt(ax2_ex, model='Cb stellate', color1='lightgrey', color2='k', alteration='g') + + # ax.set_title(model, x=0.2, y=1.025) + ax.spines["right"].set_visible(False) + ax.spines["top"].set_visible(False) + L = ax.get_ylim() + ax.set_ylim([0, L[1]]) + return ax + + +#%% +boxplot_style() +color_dict = {'Cb stellate': '#40A787', # cyan'# + 'RS Inhibitory': '#F0D730', # yellow + 'FS': '#C02717', # red + 'RS Pyramidal': '#007030', # dark green + 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#AAB71B', # lightgreen + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#008797', # light blue + 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#F78017', # orange + 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#478010', # green + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#53379B', # purple + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#2060A7', # blue + 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': '#873770', # magenta + 'STN': '#D03050' # pink + } + +# plot setup +marker_s_leg = 2 +max_width = 20 +pad_x = 0.85 +pad_y= 0.4 +pad_w = 1.1 +pad_h = 0.7 + +fig = plt.figure() +gs = fig.add_gridspec(3, 7, wspace=1.2, hspace=1.) +ax0 = fig.add_subplot(gs[0,2:7]) +ax0_ex = fig.add_subplot(gs[0,1]) +ax0_fI = fig.add_subplot(gs[0,0]) +ax1 = fig.add_subplot(gs[1,2:7]) +ax1_ex = fig.add_subplot(gs[1,1]) +ax1_fI = fig.add_subplot(gs[1,0]) +ax2 = fig.add_subplot(gs[2,2:7]) +ax2_ex = fig.add_subplot(gs[2,1]) +ax2_fI = fig.add_subplot(gs[2,0]) + +line_width = 1 +# plot fI curves +ax0_fI = plot_fI(ax0_fI, model='FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', type='shift', alt='s', color1='lightgrey', color2='k') +rec = plt.Rectangle((-pad_x, -pad_y), 1 + pad_w, 1 + pad_h, fill=False, lw=line_width,transform=ax0_fI.transAxes, color=color_dict['FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$'], alpha=1, zorder=-1) +rec = ax0_fI.add_patch(rec) +rec.set_clip_on(False) + +ax1_fI = plot_fI(ax1_fI, model='Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', type='slope', alt='u', color1='lightgrey', color2='k') +rec = plt.Rectangle((-pad_x, -pad_y), 1 + pad_w, 1 + pad_h, fill=False, lw=line_width,transform=ax1_fI.transAxes, color=color_dict['Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$'], alpha=1, zorder=-1) +rec = ax1_fI.add_patch(rec) +rec.set_clip_on(False) + +ax2_fI = plot_fI(ax2_fI, model='Cb stellate', type='g', alt='Leak', color1='lightgrey', color2='k') +rec = plt.Rectangle((-pad_x, -pad_y), 1 + pad_w, 1 + pad_h, fill=False, lw=line_width,transform=ax2_fI.transAxes, color=color_dict['Cb stellate'], alpha=1, zorder=-1) +rec = ax2_fI.add_patch(rec) +rec.set_clip_on(False) + + +# plot boxplots +boxplot_with_markers(ax0,max_width, alteration='shift') +boxplot_with_markers(ax1,max_width, alteration='slope') +boxplot_with_markers(ax2,max_width, alteration='g') + +# plot legend +pos = (0.225, -0.9) +ncol = 6 +model_legend(ax2, marker_s_leg, pos, ncol) + +# plot rheo across model for example alteration +plot_rheo_alt(ax0_ex,model='FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', color1='lightgrey', color2='k', alteration='shift') +plot_rheo_alt(ax1_ex,model='Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', color1='lightgrey', color2='k',alteration='slope') +plot_rheo_alt(ax2_ex, model='Cb stellate', color1='lightgrey', color2='k', alteration='g') + +# label subplots with letters +ax0_fI.text(-0.875, 1.35, string.ascii_uppercase[0], transform=ax0_fI.transAxes, size=10, weight='bold') +ax0_ex.text(-0.8, 1.35, string.ascii_uppercase[1], transform=ax0_ex.transAxes, size=10, weight='bold') +ax0.text(-0.075, 1.35, string.ascii_uppercase[2], transform=ax0.transAxes, size=10, weight='bold') + +ax1_fI.text(-0.875, 1.35, string.ascii_uppercase[3], transform=ax1_fI.transAxes,size=10, weight='bold') +ax1_ex.text(-0.8, 1.35, string.ascii_uppercase[4], transform=ax1_ex.transAxes, size=10, weight='bold') +ax1.text(-0.075, 1.35, string.ascii_uppercase[5], transform=ax1.transAxes, size=10, weight='bold') + +ax2_fI.text(-0.875, 1.35, string.ascii_uppercase[6], transform=ax2_fI.transAxes,size=10, weight='bold') +ax2_ex.text(-0.8, 1.35, string.ascii_uppercase[7], transform=ax2_ex.transAxes, size=10, weight='bold') +ax2.text(-0.075, 1.35, string.ascii_uppercase[8], transform=ax2.transAxes, size=10, weight='bold') + +# save +fig.set_size_inches(cm2inch(20.75,12)) +fig.savefig('./Figures/rheobase_correlation.pdf', dpi=fig.dpi) +# fig.savefig('./Figures/rheobase_correlation.png', dpi=fig.dpi) #bbox_inches='tight', dpi=fig.dpi # eps # pdf +plt.show() + + +#%% +# fig, axs = plt.subplots(1,2) +# axs[0] = plot_fI(axs[0] , model='FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', type='shift', alt='s', color1='lightgrey', color2='k') +# plt.show() +#%% +# +# +# cvals = [-2., 2] +# colors = ['lightgrey', 'k'] +# +# norm = plt.Normalize(min(cvals), max(cvals)) +# tuples = list(zip(map(norm, cvals), colors)) +# cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", tuples) +# colors = cmap(np.linspace(0, 1, 22)) +# +# colors2 = [colors[10,:], 'k'] +# norm2 = plt.Normalize(min(cvals), max(cvals)) +# tuples2 = list(zip(map(norm2, cvals), colors2)) +# cmap2 = matplotlib.colors.LinearSegmentedColormap.from_list("", tuples2) +# +# colors3 = [colors[11,:], 'lightgrey'] +# norm3 = plt.Normalize(min(cvals), max(cvals)) +# tuples3 = list(zip(map(norm3, cvals), colors3)) +# cmap3 = matplotlib.colors.LinearSegmentedColormap.from_list("", tuples3) +# +# fig, axs = plt.subplots(1,2) +# start = (0,0) +# end = (1,1) +# axs[0] = rainbowarrow(axs[0], start, end, cmap2, n=50,lw=3) +# start = (0,0) +# end = (-1,-1) +# axs[0] = rainbowarrow(axs[0], start, end, cmap3, n=50,lw=3) +# plt.show() diff --git a/Figures/simulation_model_comparison.pdf b/Figures/simulation_model_comparison.pdf index 051120debfda928d0f97d6bdf42b0fb9b2d2116c..9e037eba71caf3449fe460eaed977baaa53ea9bd 100644 GIT binary patch delta 21111 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 diff --git a/Figures/simulation_model_comparison_letters.py b/Figures/simulation_model_comparison_letters.py new file mode 100644 index 0000000..21d0434 --- /dev/null +++ b/Figures/simulation_model_comparison_letters.py @@ -0,0 +1,259 @@ +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd +import os +import string +from Figures.plotstyle import sim_style +import seaborn as sns +import scipy.stats as stats +import matplotlib.lines as mlines + +def cm2inch(*tupl): + inch = 2.54 + if isinstance(tupl[0], tuple): + return tuple(i/inch for i in tupl[0]) + else: + return tuple(i/inch for i in tupl) + +def Kendall_tau(df): + tau = df.corr(method='kendall') + p = pd.DataFrame(columns=df.columns, index=df.columns) + for col in range((df.columns).shape[0]): + for col2 in range((df.columns).shape[0]): + if col != col2: + _, p.loc[df.columns[col], df.columns[col2]] = stats.kendalltau( + df[df.columns[col]], df[df.columns[col2]], nan_policy='omit') + return tau, p + +def correlation_plot(ax, df='AUC', title='', cbar=False): + # cbar_ax = fig.add_axes([0.685, 0.44, .15, .01]) + cbar_ax = fig.add_axes([0.685, 0.48, .15, .01]) + cbar_ax.spines['left'].set_visible(False) + cbar_ax.spines['bottom'].set_visible(False) + cbar_ax.spines['right'].set_visible(False) + cbar_ax.spines['top'].set_visible(False) + cbar_ax.set_xticks([]) + cbar_ax.set_yticks([]) + if df == 'AUC': + df = pd.read_csv(os.path.join('./Figures/Data/sim_mut_AUC.csv'), index_col='Unnamed: 0') + elif df == 'rheo': + df = pd.read_csv(os.path.join('./Figures/Data/sim_mut_rheo.csv'), index_col='Unnamed: 0') + + # array for names + cmap = sns.diverging_palette(220, 10, as_cmap=True) + models = ['RS_pyramidal', 'RS_inhib', 'FS', 'Cb_stellate', 'Cb_stellate_Kv', 'Cb_stellate_Kv_only', 'STN', + 'STN_Kv', 'STN_Kv_only'] + model_names = ['RS pyramidal', 'RS inhibitory', 'FS', 'Cb stellate', + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN', + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$'] + # model_letter_names = ['Model H', 'Model E', 'Model G', 'Model A', 'Model F', 'Model J', 'Model L', 'Model I', 'Model K'] + model_letter_names = ['H', 'E', 'G', 'A', 'F', 'J', 'L', 'I', 'K'] + col_dict = {} + for m in range(len(models)): + col_dict[model_names[m]] = model_letter_names[m] + df.rename(columns=col_dict, inplace=True) + df = df[model_letter_names] + + # calculate correlation matrix + tau, p = Kendall_tau(df) + # tau = tau.drop(columns='STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', index='RS pyramidal') + + # mask to hide upper triangle of matrix + mask = np.zeros_like(tau, dtype=bool) + mask[np.triu_indices_from(mask)] = True + np.fill_diagonal(mask, False) + + # models and renaming of tau + models = ['RS pyramidal', 'RS inhibitory', 'FS', 'Cb stellate', + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN', + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$'] + model_names = ['RS pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'RS inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'Cb stellate', 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN', + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$'] + # model_letter_names = ['Model H', 'Model E', 'Model G', 'Model A', 'Model F', 'Model J', 'Model L', 'Model I', 'Model K'] + model_letter_names = ['H', 'E', 'G', 'A', 'F', 'J', 'L', 'I', 'K'] + col_dict = {} + for m in range(len(models)): + col_dict[model_names[m]] = model_letter_names[m] + tau.rename(columns=col_dict, index=col_dict, inplace=True) + tau = tau[model_letter_names] + + # plotting with or without colorbar + if cbar==False: + res = sns.heatmap(tau, annot=False, mask=mask, center=0, vmax=1, vmin=-1, linewidths=.5, square=True, ax=ax, + cbar=False, cmap=cmap, cbar_ax=cbar_ax, cbar_kws={"shrink": .52}) + else: + res = sns.heatmap(tau, annot=False, mask=mask, center=0, vmax=1, vmin=-1, linewidths=.5, square=True, ax=ax, + cbar=True, cmap=cmap, cbar_ax=cbar_ax, + cbar_kws={"orientation": "horizontal", + "ticks": [-1,-0.5, 0, 0.5, 1]} ) + cbar_ax.set_title(r'Kendall $\tau$', y=1.02, loc='center', fontsize=6) + cbar_ax.tick_params(length=3) + for tick in cbar_ax.xaxis.get_major_ticks(): + tick.label.set_fontsize(6) + ax.set_title(title, fontsize=8) + ax.set_xlabel("Model") + ax.set_ylabel("Model") + +def mutation_plot(ax, model='RS_pyramidal'): + models = ['RS_pyramidal', 'RS_inhib', 'FS', 'Cb_stellate', 'Cb_stellate_Kv', 'Cb_stellate_Kv_only', 'STN', + 'STN_Kv', 'STN_Kv_only'] + model_names = ['RS pyramidal', 'RS inhibitory', 'FS', + 'Cb stellate', 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN', 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$'] + model_display_names = ['RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'Cb stellate', + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN', + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$', 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$'] + model_letter_names = ['Model H', + 'Model E', + 'Model G', 'Model A', + 'Model F', + 'Model J', 'Model L', + 'Model I', + 'Model K'] + col_dict = {} + for m in range(len(models)): + col_dict[models[m]] = model_display_names[m] + + ax_dict = {} + ax_dict['RS_pyramidal'] = (0, 0) + ax_dict['RS_inhib'] = (0, 1) + ax_dict['FS'] = (1, 0) + ax_dict['Cb_stellate'] = (2, 0) + ax_dict['Cb_stellate_Kv'] = (2, 1) + ax_dict['Cb_stellate_Kv_only'] = (3, 0) + ax_dict['STN'] = (3, 1) + ax_dict['STN_Kv'] = (4, 0) + ax_dict['STN_Kv_only'] = (4, 1) + + ylim_dict = {} + ylim_dict['RS_pyramidal'] = (-0.1, 0.3) + ylim_dict['RS_inhib'] = (-0.6, 0.6) + ylim_dict['FS'] = (-0.06, 0.08) + ylim_dict['Cb_stellate'] = (-0.1, 0.4) + ylim_dict['Cb_stellate_Kv'] = (-0.1, 0.5) + ylim_dict['Cb_stellate_Kv_only'] = (-1, 0.8) + ylim_dict['STN'] = (-0.01, 0.015) + ylim_dict['STN_Kv'] = (-0.4, 0.6) + ylim_dict['STN_Kv_only'] = (-0.03, 0.3) + Marker_dict = {'Cb stellate': 'o', 'RS Inhibitory': 'o', 'FS': 'o', 'RS Pyramidal': "^", + 'RS Inhibitory +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': "^", + 'Cb stellate +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': "^", + 'FS +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': "D", + 'RS Pyramidal +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': "D", + 'STN +$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': "D", + 'Cb stellate $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': "s", + 'STN $\Delta$$\mathrm{K}_{\mathrm{V}}\mathrm{1.1}$': "s", 'STN': "s"} + + AUC = pd.read_csv(os.path.join('./Figures/Data/sim_mut_AUC.csv'), index_col='Unnamed: 0') + rheo = pd.read_csv(os.path.join('./Figures/Data/sim_mut_rheo.csv'), index_col='Unnamed: 0') + + mod = models.index(model) + mut_names = AUC.index + ax.plot(rheo.loc[mut_names, model_names[mod]]*1000, AUC.loc[mut_names, model_names[mod]]*100, linestyle='', + markeredgecolor='grey', markerfacecolor='grey', marker=Marker_dict[model_display_names[mod]], + markersize=2) + + ax.plot(rheo.loc['wt', model_names[mod]], AUC.loc['wt', model_names[mod]]*100, 'sk') + + mut_col = sns.color_palette("pastel") + ax.plot(rheo.loc['V174F', model_names[mod]]*1000, AUC.loc['V174F', model_names[mod]]*100, linestyle='', + markeredgecolor=mut_col[0], markerfacecolor=mut_col[0], marker=Marker_dict[model_display_names[mod]],markersize=4) + ax.plot(rheo.loc['F414C', model_names[mod]]*1000, AUC.loc['F414C', model_names[mod]]*100, linestyle='', + markeredgecolor=mut_col[1], markerfacecolor=mut_col[1], marker=Marker_dict[model_display_names[mod]],markersize=4) + ax.plot(rheo.loc['E283K', model_names[mod]]*1000, AUC.loc['E283K', model_names[mod]]*100, linestyle='', + markeredgecolor=mut_col[2], markerfacecolor=mut_col[2], marker=Marker_dict[model_display_names[mod]],markersize=4) + ax.plot(rheo.loc['V404I', model_names[mod]]*1000, AUC.loc['V404I', model_names[mod]]*100, linestyle='', + markeredgecolor=mut_col[3], markerfacecolor=mut_col[5], marker=Marker_dict[model_display_names[mod]],markersize=4) + ax.set_title(model_letter_names[mod], pad=14) + ax.set_xlabel('$\Delta$Rheobase [pA]') + ax.set_ylabel('Normalized $\Delta$AUC (%)') + ax.spines['right'].set_visible(False) + ax.spines['top'].set_visible(False) + # ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0),useMathText=True) + + xmin, xmax = ax.get_xlim() + ymin, ymax = ax.get_ylim() + ax.hlines(0, xmin, xmax, colors='lightgrey', linestyles='--') + ax.vlines(0, ymin,ymax, colors='lightgrey', linestyles='--') + return ax + +def mutation_legend(ax, marker_s_leg, pos, ncol): + colors = sns.color_palette("pastel") + + Markers = ["o", "o", "o", "o"] + V174F = mlines.Line2D([], [], color=colors[0], marker=Markers[0], markersize=marker_s_leg, linestyle='None', + label='V174F') + F414C = mlines.Line2D([], [], color=colors[1], marker=Markers[1], markersize=marker_s_leg, linestyle='None', + label='F414C') + E283K = mlines.Line2D([], [], color=colors[2], marker=Markers[2], markersize=marker_s_leg, linestyle='None', label='E283K') + V404I = mlines.Line2D([], [], color=colors[5], marker=Markers[3], markersize=marker_s_leg, linestyle='None', + label='V404I') + WT = mlines.Line2D([], [], color='k', marker='s', markersize=marker_s_leg+2, linestyle='None', label='Wild type') + + ax.legend(handles=[WT, V174F, F414C, E283K, V404I], loc='center', bbox_to_anchor=pos, ncol=ncol, frameon=False) + + + +sim_style() +# plot setup +fig = plt.figure() +gs0 = fig.add_gridspec(1, 6, wspace=-0.2) +gsl = gs0[0:3].subgridspec(3, 3, wspace=0.9, hspace=0.8) +gsr = gs0[4:6].subgridspec(7, 1, wspace=0.6, hspace=0.8) + +ax00 = fig.add_subplot(gsl[0,0]) +ax01 = fig.add_subplot(gsl[0,1]) +ax02 = fig.add_subplot(gsl[0,2]) +ax10 = fig.add_subplot(gsl[1,0]) +ax11 = fig.add_subplot(gsl[1,1]) +ax12 = fig.add_subplot(gsl[1,2]) +ax20 = fig.add_subplot(gsl[2,0]) +ax21 = fig.add_subplot(gsl[2,1]) +ax22 = fig.add_subplot(gsl[2,2]) + +axr0 = fig.add_subplot(gsr[0:3,0]) +axr1 = fig.add_subplot(gsr[4:,0]) + +# plot mutations in each model +ax00 = mutation_plot(ax00, model='RS_pyramidal') +ax01 = mutation_plot(ax01, model='RS_inhib') +ax02 = mutation_plot(ax02, model='FS') +ax10 = mutation_plot(ax10, model='Cb_stellate') +ax11 = mutation_plot(ax11, model='Cb_stellate_Kv') +ax12 = mutation_plot(ax12, model='Cb_stellate_Kv_only') +ax20 = mutation_plot(ax20, model='STN') +ax21 = mutation_plot(ax21, model='STN_Kv') +ax22 = mutation_plot(ax22, model='STN_Kv_only') + +marker_s_leg = 4 +pos = (0.425, -0.7) +ncol = 5 +mutation_legend(ax21, marker_s_leg, pos, ncol) + +# plot correlation matrices +correlation_plot(axr1,df = 'AUC', title='Normalized $\Delta$AUC', cbar=False) +correlation_plot(axr0,df = 'rheo', title='$\Delta$Rheobase', cbar=True) + +# add subplot labels +axs = [ax00, ax01,ax02, ax10, ax11, ax12, ax20, ax21, ax22] +j=0 +for i in range(0,9): + # axs[i].text(-0.48, 1.175, string.ascii_uppercase[i], transform=axs[i].transAxes, size=10, weight='bold') + axs[i].text(-0.625, 1.25, string.ascii_uppercase[i], transform=axs[i].transAxes, size=10, weight='bold') + j +=1 +axr0.text(-0.77, 1.1, string.ascii_uppercase[j], transform=axr0.transAxes, size=10, weight='bold') +axr1.text(-0.77, 1.1, string.ascii_uppercase[j+1], transform=axr1.transAxes, size=10, weight='bold') + +# save +fig.set_size_inches(cm2inch(22.2,15)) +fig.savefig('./Figures/simulation_model_comparison.pdf', dpi=fig.dpi) #eps +# fig.savefig('./Figures/simulation_model_comparison.png', dpi=fig.dpi) #eps +plt.show() + diff --git a/manuscript.tex b/manuscript.tex index 9f584fd..886e83b 100644 --- a/manuscript.tex +++ b/manuscript.tex @@ -190,8 +190,7 @@ However, the effect of a given channelopathy on the firing behavior of different For instance, altering relative amplitudes of ionic currents can dramatically influence the firing behavior and dynamics of neurons \citep{rutecki_neuronal_1992, pospischil_minimal_2008,Kispersky2012, golowasch_failure_2002, barreiro_-current_2012, Noebels2017, Layer2021}, however other properties of ionic currents impact neuronal firing as well. Cell-type specific effects one firing can occur for instance increases inhibitory interneuron but not pyramidal neuron firing with R1648H mutation in \textit{SCN1A} \citep{Hedrich14874}. In extreme cases, a mutation can have opposite effects on different neuron types. For example, the R1627H \textit{SCN8A} mutation is associated which increased firing in interneurons, but decreases pyramidal neuron excitability \citep{makinson_scn1a_2016}. -\textcolor{red}{Despite this evidence of cell-type specific effects of ion channel mutations on firing, the dependence of firing outcomes of ion channel mutations is generally not known. Cell-type specificity is likely vital for successful precision medicine treatment approaches. For example, Dravet syndrome was identified as the consquence of LOF mutations in \textit{SCN1A} \citep{Claes2001,Fujiwara2003,Ohmori2002}, however limited succes in treatment of Dravet syndrome persisted \citep{Claes2001,Oguni2001}. Once it became evident that only inhibitory interneurons and not pyramidal neurons had altered excitability as a result of LOF \textit{SCN1A} mutations alternative approaches, based on this understanding such as gene therapy, began to show promise \citep{Colasante2020, Yu2006}. Due to the high clinical relevance of understanding cell-type dependent effects of channelopathies, we use computationaly modelling approaches to assess the impacts of altered ionic current properties on firing behavior, bridging the gap between changes in the biophysical properties induced by mutations, firing and clinical symptoms. Conductance-based neuronal models enable insight into the effects of ion channel mutations with specific effects of the resulting ionic current as well as enabling \textit{in silico} assessment of the relative effects of changes in biophysical properties of ionic currents on neuronal firing. Furthermore, modelling approaches enable predictions of the effects of specific mutation and drug induced biophysical property changes \citep{Layer2021,Liu2019,johannesen_genotype-phenotype_2021, lauxmann_therapeutic_2021}. -} +Despite this evidence of cell-type specific effects of ion channel mutations on firing, the dependence of firing outcomes of ion channel mutations is generally not known. Cell-type specificity is likely vital for successful precision medicine treatment approaches. For example, Dravet syndrome was identified as the consquence of LOF mutations in \textit{SCN1A} \citep{Claes2001,Fujiwara2003,Ohmori2002}, however limited succes in treatment of Dravet syndrome persisted \citep{Claes2001,Oguni2001}. Once it became evident that only inhibitory interneurons and not pyramidal neurons had altered excitability as a result of LOF \textit{SCN1A} mutations alternative approaches, based on this understanding such as gene therapy, began to show promise \citep{Colasante2020, Yu2006}. Due to the high clinical relevance of understanding cell-type dependent effects of channelopathies, we use computationaly modelling approaches to assess the impacts of altered ionic current properties on firing behavior, bridging the gap between changes in the biophysical properties induced by mutations, firing and clinical symptoms. Conductance-based neuronal models enable insight into the effects of ion channel mutations with specific effects of the resulting ionic current as well as enabling \textit{in silico} assessment of the relative effects of changes in biophysical properties of ionic currents on neuronal firing. Furthermore, modelling approaches enable predictions of the effects of specific mutation and drug induced biophysical property changes \citep{Layer2021,Liu2019,johannesen_genotype-phenotype_2021, lauxmann_therapeutic_2021}. %Computational modelling approaches can be used to assess the impacts of altered ionic current properties on firing behavior, bridging the gap between changes in the biophysical properties induced by mutations, firing and clinical symptoms. Conductance-based neuronal models enable insight into the effects of ion channel mutations with specific effects of the resulting ionic current as well as enabling \textit{in silico} assessment of the relative effects of changes in biophysical properties of ionic currents on neuronal firing. Furthermore, modelling approaches enable predictions of the effects of specific mutation and drug induced biophysical property changes \citep{Layer2021,Liu2019,johannesen_genotype-phenotype_2021, lauxmann_therapeutic_2021}. @@ -311,7 +310,8 @@ Qualitative differences can be found, for example, when increasing the maximal c \centering \includegraphics[width=\linewidth]{Figures/AUC_correlation.pdf} \linespread{1.}\selectfont - \caption[]{Effects of altered channel kinetics on AUC in various neuron models. The fI curves corresponding to shifts in FS \(+\)\Kv model delayed rectifier K half activation \(V_{1/2}\) (A), changes \Kv activation slope factor \(k\) in the FS \(+\)\Kv model (D), and changes in maximal conductance of delayed rectifier K current in the STN \(+\)\Kv model (G) are shown. The fI curves from the smallest (grey) to the largest (black) alterations are seen for (A,D, and G) in accordance to the greyscale of the x-axis in B, E, and H. The \ndAUC of fI curves is plotted against delayed rectifier K half activation potential (\(\Delta V_{1/2}\); D), \Kv activation slope factor \(k\) (k/\(\textrm{k}_{WT}\); E) and maximal conductance \(g\) of the delayed rectifier K current (g/\(\textrm{g}_{WT}\); H) for all models (thin lines) with relationships from the fI curve examples (A, D, G respectively) highlighted by thick lines with colors corresponding to the box highlighting each set of fI curves. The Kendall rank correlation (Kendall \(\tau\)) coefficients between shifts in half maximal potential \(V_{1/2}\) and \ndAUC (C), slope factor k and \ndAUC (F) as well as maximal current conductances and \ndAUC (I) for each model and current property is computed. The relationships between \(\Delta V_{1/2}\), k/\(\textrm{k}_{WT}\), and g/\(\textrm{g}_{WT}\) and \ndAUC for the Kendall rank correlations highlighted in the black boxes are depicted in (B), (E) and (H) respectively. } +% \caption[]{Effects of altered channel kinetics on AUC in various neuron models. The fI curves corresponding to shifts in FS \(+\)\Kv model delayed rectifier K half activation \(V_{1/2}\) (A), changes \Kv activation slope factor \(k\) in the FS \(+\)\Kv model (D), and changes in maximal conductance of delayed rectifier K current in the STN \(+\)\Kv model (G) are shown. The fI curves from the smallest (grey) to the largest (black) alterations are seen for (A,D, and G) in accordance to the greyscale of the x-axis in B, E, and H. The \ndAUC of fI curves is plotted against delayed rectifier K half activation potential (\(\Delta V_{1/2}\); D), \Kv activation slope factor \(k\) (k/\(\textrm{k}_{WT}\); E) and maximal conductance \(g\) of the delayed rectifier K current (g/\(\textrm{g}_{WT}\); H) for all models (thin lines) with relationships from the fI curve examples (A, D, G respectively) highlighted by thick lines with colors corresponding to the box highlighting each set of fI curves. The Kendall rank correlation (Kendall \(\tau\)) coefficients between shifts in half maximal potential \(V_{1/2}\) and \ndAUC (C), slope factor k and \ndAUC (F) as well as maximal current conductances and \ndAUC (I) for each model and current property is computed. The relationships between \(\Delta V_{1/2}\), k/\(\textrm{k}_{WT}\), and g/\(\textrm{g}_{WT}\) and \ndAUC for the Kendall rank correlations highlighted in the black boxes are depicted in (B), (E) and (H) respectively. } + \caption[]{Effects of altered channel kinetics on AUC in various neuron models. The fI curves corresponding to shifts in model G delayed rectifier K half activation \(V_{1/2}\) (A), changes \Kv activation slope factor \(k\) in model G (D), and changes in maximal conductance of delayed rectifier K current in the model I (G) are shown. The fI curves from the smallest (grey) to the largest (black) alterations are seen for (A,D, and G) in accordance to the greyscale of the x-axis in B, E, and H. The \ndAUC of fI curves is plotted against delayed rectifier K half activation potential (\(\Delta V_{1/2}\); D), \Kv activation slope factor \(k\) (k/\(\textrm{k}_{WT}\); E) and maximal conductance \(g\) of the delayed rectifier K current (g/\(\textrm{g}_{WT}\); H) for all models (thin lines) with relationships from the fI curve examples (A, D, G respectively) highlighted by thick lines with colors corresponding to the box highlighting each set of fI curves. The Kendall rank correlation (Kendall \(\tau\)) coefficients between shifts in half maximal potential \(V_{1/2}\) and \ndAUC (C), slope factor k and \ndAUC (F) as well as maximal current conductances and \ndAUC (I) for each model and current property is computed. The relationships between \(\Delta V_{1/2}\), k/\(\textrm{k}_{WT}\), and g/\(\textrm{g}_{WT}\) and \ndAUC for the Kendall rank correlations highlighted in the black boxes are depicted in (B), (E) and (H) respectively. } \label{fig:AUC_correlation} \end{figure} @@ -321,14 +321,15 @@ Changes in gating half activation potential \(V_{1/2}\) and slope factor \(k\) a %Although changes in half maximal potential \(V_{1/2}\) and slope factor \(k\) generally correlated with rheobase similarly across model there were some exceptions. Changing the slope factor of Na-current inactivation, \Kv-current inactivation, and A-current activation affected the rheobase both with positive and negative correlations in different models \textcolor{red}{\noteuh{Würde diese hier noch mal benennen, damit es klar wird. }}\notenk{Ich mache das ungern, weil ich für jedes (Na-current inactivation, \Kv-current inactivation, and A-current activation) 2 Liste habe (+ und - rheobase Aenderungen} (\Cref{fig:rheobase_correlation}~F). Departures from monotonic relationships also occurred in some models as a result of K-current activation \(V_{1/2}\) and slope factor \(k\), \Kv-current inactivation slope factor \(k\), and A-current activation slope factor \(k\) in some models \textcolor{red}{\noteuh{Auch hier die unterschiedlcihen betroffenen cell type models benennen, einfach in Klammer dahinter.}}\notenk{Hier mache ich das auch ungern, für ähnlichen Gründen}. Thus, identical changes in current gating properties such as the half maximal potential \(V_{1/2}\) or slope factor \(k\) can have differing effects on firing depending on the model in which they occur. -Although changes in half maximal potential \(V_{1/2}\) and slope factor \(k\) generally correlated with rheobase similarly across model there were some exceptions. Rheobase was affected with both with positive and negative correlations in different models as a result of changing slope factor of \textcolor{red}{Na-current inactivation (positive: models A-H and J; negative: models I, K and L), \Kv-current inactivation (positive: models I and K; negative: models E-G, J, H), and A-current activation (positive: models A,F and L; negative: model I)} (\Cref{fig:rheobase_correlation}~F). Departures from monotonic relationships also occurred in some models as a result of \textcolor{red}{K-current activation \(V_{1/2}\) (e.g. model J) and slope factor \(k\) (models F and G), \Kv-current inactivation slope factor \(k\) (model K), and A-current activation slope factor \(k\) (model L) }. Thus, identical changes in current gating properties such as the half maximal potential \(V_{1/2}\) or slope factor \(k\) can have differing effects on firing depending on the model in which they occur. +Although changes in half maximal potential \(V_{1/2}\) and slope factor \(k\) generally correlated with rheobase similarly across model there were some exceptions. Rheobase was affected with both with positive and negative correlations in different models as a result of changing slope factor of Na-current inactivation (positive: models A-H and J; negative: models I, K and L), \Kv-current inactivation (positive: models I and K; negative: models E-G, J, H), and A-current activation (positive: models A,F and L; negative: model I; \Cref{fig:rheobase_correlation}~F). Departures from monotonic relationships also occurred in some models as a result of K-current activation \(V_{1/2}\) (e.g. model J) and slope factor \(k\) (models F and G), \Kv-current inactivation slope factor \(k\) (model K), and A-current activation slope factor \(k\) (model L). Thus, identical changes in current gating properties such as the half maximal potential \(V_{1/2}\) or slope factor \(k\) can have differing effects on firing depending on the model in which they occur. \begin{figure}[tp] \centering \includegraphics[width=\linewidth]{Figures/rheobase_correlation.pdf} \linespread{1.}\selectfont - \caption[]{Effects of altered channel kinetics on rheobase. The fI curves corresponding to shifts in FS \(+\)\Kv model \Kv activation \(V_{1/2}\) (A), changes \Kv inactivation slope factor \(k\) in the Cb stellate \(+\)\Kv model (D), and changes in maximal conductance of the leak current in the Cb stellate model (G) are shown. The fI curves from the smallest (grey) to the largest (black) alterations are seen for (A,D, and G) in accordance to the greyscale of the x-axis in B, E, and H. The \drheo of fI curves is plotted against \Kv half activation potential (\(\Delta V_{1/2}\); B), \Kv inactivation slope factor \(k\) (k/\(\textrm{k}_{WT}\); E) and maximal conductance \(g\) of the leak current (g/\(\textrm{g}_{WT}\); H) for all models (thin lines) with relationships from the fI curve examples (A, D, G respectively) highlighted by thick lines with colors corresponding to the box highlighting each set of fI curves. The Kendall rank correlation (Kendall \(\tau\)) coefficients between shifts in half maximal potential \(V_{1/2}\) and \drheo (C), slope factor k and \drheo (F) as well as maximal current conductances and \drheo (I) for each model and current property is computed. The relationships between \(\Delta V_{1/2}\), k/\(\textrm{k}_{WT}\), and g/\(\textrm{g}_{WT}\) and \drheo for the Kendall rank correlations highlighted in the black boxes are depicted in (B), (E) and (H) respectively.} +% \caption[]{Effects of altered channel kinetics on rheobase. The fI curves corresponding to shifts in FS \(+\)\Kv model \Kv activation \(V_{1/2}\) (A), changes \Kv inactivation slope factor \(k\) in the Cb stellate \(+\)\Kv model (D), and changes in maximal conductance of the leak current in the Cb stellate model (G) are shown. The fI curves from the smallest (grey) to the largest (black) alterations are seen for (A,D, and G) in accordance to the greyscale of the x-axis in B, E, and H. The \drheo of fI curves is plotted against \Kv half activation potential (\(\Delta V_{1/2}\); B), \Kv inactivation slope factor \(k\) (k/\(\textrm{k}_{WT}\); E) and maximal conductance \(g\) of the leak current (g/\(\textrm{g}_{WT}\); H) for all models (thin lines) with relationships from the fI curve examples (A, D, G respectively) highlighted by thick lines with colors corresponding to the box highlighting each set of fI curves. The Kendall rank correlation (Kendall \(\tau\)) coefficients between shifts in half maximal potential \(V_{1/2}\) and \drheo (C), slope factor k and \drheo (F) as well as maximal current conductances and \drheo (I) for each model and current property is computed. The relationships between \(\Delta V_{1/2}\), k/\(\textrm{k}_{WT}\), and g/\(\textrm{g}_{WT}\) and \drheo for the Kendall rank correlations highlighted in the black boxes are depicted in (B), (E) and (H) respectively.} + \caption[]{Effects of altered channel kinetics on rheobase. The fI curves corresponding to shifts in model G \Kv activation \(V_{1/2}\) (A), changes \Kv inactivation slope factor \(k\) in model F (D), and changes in maximal conductance of the leak current in model A (G) are shown. The fI curves from the smallest (grey) to the largest (black) alterations are seen for (A,D, and G) in accordance to the greyscale of the x-axis in B, E, and H. The \drheo of fI curves is plotted against \Kv half activation potential (\(\Delta V_{1/2}\); B), \Kv inactivation slope factor \(k\) (k/\(\textrm{k}_{WT}\); E) and maximal conductance \(g\) of the leak current (g/\(\textrm{g}_{WT}\); H) for all models (thin lines) with relationships from the fI curve examples (A, D, G respectively) highlighted by thick lines with colors corresponding to the box highlighting each set of fI curves. The Kendall rank correlation (Kendall \(\tau\)) coefficients between shifts in half maximal potential \(V_{1/2}\) and \drheo (C), slope factor k and \drheo (F) as well as maximal current conductances and \drheo (I) for each model and current property is computed. The relationships between \(\Delta V_{1/2}\), k/\(\textrm{k}_{WT}\), and g/\(\textrm{g}_{WT}\) and \drheo for the Kendall rank correlations highlighted in the black boxes are depicted in (B), (E) and (H) respectively.} \label{fig:rheobase_correlation} \end{figure} @@ -339,7 +340,8 @@ Mutations in \textit{KCNA1} are associated with episodic ataxia type~1 (EA1) and \centering \includegraphics[width=\linewidth]{Figures/simulation_model_comparison.pdf} \linespread{1.}\selectfont - \caption[]{Effects of episodic ataxia type~1 associated \textit{KCNA1} mutations on firing. Effects of \textit{KCNA1} mutations on AUC (percent change in normalized \(\Delta\)AUC) and rheobase (\(\Delta\)Rheobase) compared to wild type for RS pyramidal +\Kv (A), RS inhibitory +\Kv (B), FS +\Kv (C), Cb stellate (D), Cb stellate +\Kv (E), Cb stellate \(\Delta\)\Kv (F), STN (G), STN +\Kv (H) and STN \(\Delta\)\Kv (I) models. All \textit{KCNA1} Mutations are marked in grey with the V174F, F414C, E283K, and V404I \textit{KCNA1} mutations highlighted in color for each model. Pairwise Kendall rank correlation coefficients (Kendall \(\tau\)) between the effects of \textit{KCNA1} mutations on rheobase and on AUC are shown in J and K respectively. Marker shape is indicative of model/firing type, and grey dashed lines denote the quadrants of firing characterization (see \Cref{fig:firing_characterization}).} +% \caption[]{Effects of episodic ataxia type~1 associated \textit{KCNA1} mutations on firing. Effects of \textit{KCNA1} mutations on AUC (percent change in normalized \(\Delta\)AUC) and rheobase (\(\Delta\)Rheobase) compared to wild type for RS pyramidal +\Kv (A), RS inhibitory +\Kv (B), FS +\Kv (C), Cb stellate (D), Cb stellate +\Kv (E), Cb stellate \(\Delta\)\Kv (F), STN (G), STN +\Kv (H) and STN \(\Delta\)\Kv (I) models. All \textit{KCNA1} Mutations are marked in grey with the V174F, F414C, E283K, and V404I \textit{KCNA1} mutations highlighted in color for each model. Pairwise Kendall rank correlation coefficients (Kendall \(\tau\)) between the effects of \textit{KCNA1} mutations on rheobase and on AUC are shown in J and K respectively. Marker shape is indicative of model/firing type, and grey dashed lines denote the quadrants of firing characterization (see \Cref{fig:firing_characterization}).} + \caption[]{Effects of episodic ataxia type~1 associated \textit{KCNA1} mutations on firing. Effects of \textit{KCNA1} mutations on AUC (percent change in normalized \(\Delta\)AUC) and rheobase (\(\Delta\)Rheobase) compared to wild type for model H (A), model E (B), model G (C), model A (D), model F (E), model J (F), model L (G), model I (H) and model K (I). All \textit{KCNA1} Mutations are marked in grey with the V174F, F414C, E283K, and V404I \textit{KCNA1} mutations highlighted in color for each model. Pairwise Kendall rank correlation coefficients (Kendall \(\tau\)) between the effects of \textit{KCNA1} mutations on rheobase and on AUC are shown in J and K respectively. Marker shape is indicative of model/firing type, and grey dashed lines denote the quadrants of firing characterization (see \Cref{fig:firing_characterization}).} \label{fig:simulation_model_comparision} \end{figure}