Skip to content

Instantly share code, notes, and snippets.

@jyegerlehner
Last active December 16, 2019 09:36
Show Gist options
  • Save jyegerlehner/d4c7a696a79485e7fab6d98ced5cf633 to your computer and use it in GitHub Desktop.
Save jyegerlehner/d4c7a696a79485e7fab6d98ced5cf633 to your computer and use it in GitHub Desktop.
gen313L_yeast
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"pts = {'WT_pBLI1_H': [22.0646,\t39.1553, 31.6732, 49.1083, 37.7069, 29.9245, 21.6889, \n",
" 33.3961, 37.9544, 41.9204, 35.9552, 37.4276],\n",
" \n",
" 'koUBC8_pBLI1_H': [38.0616, 49.3502, 51.2494, 50.9025, 50.6737,\n",
" 50.4798, 43.0945, 56.8453, 66.7108, 59.0353,\n",
" 56.8301, 53.6592],\n",
" 'WT_pEMPTY_H': [37.2967, 42.08, 47.7552, 47.27, 40.7508, 37.9183],\n",
" 'koUBC8_pEMPTY_H': [19.7468, 35.1384, 44.0436, 44.9225, 41.9766, 39.183]}\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Throw out WT_pBLI1_H: 21.6889\n",
"# Throw out koUBC8_pEMPTY_H: 19.7468\n",
"pts_no_outliers = {'WT_pBLI1_H': [22.0646,\t39.1553, 31.6732, 49.1083, 37.7069, 29.9245,\n",
" 33.3961, 37.9544, 41.9204, 35.9552, 37.4276],\n",
" \n",
" 'koUBC8_pBLI1_H': [38.0616, 49.3502, 51.2494, 50.9025, 50.6737,\n",
" 50.4798, 43.0945, 56.8453, 66.7108, 59.0353,\n",
" 56.8301, 53.6592],\n",
" 'WT_pEMPTY_H': [37.2967, 42.08, 47.7552, 47.27, 40.7508, 37.9183],\n",
" 'koUBC8_pEMPTY_H': [35.1384, 44.0436, 44.9225, 41.9766, 39.183]}"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"means:{'WT_pEMPTY_H': 42.17850000000001, 'WT_pBLI1_H': 36.02604545454545, 'koUBC8_pEMPTY_H': 41.05282, 'koUBC8_pBLI1_H': 52.24103333333333}\n",
"std errs:{'WT_pEMPTY_H': 1.6754125525109071, 'WT_pBLI1_H': 1.9962959993246516, 'koUBC8_pEMPTY_H': 1.5905866662084152, 'koUBC8_pBLI1_H': 2.043302086232443}\n",
" mean_density strain strain_mean strain_labels\n",
"0 37.2967 WT_pEMPTY_H 42.178500 $WT \\ \\ pEMPTY_{H}$\n",
"1 42.0800 WT_pEMPTY_H 42.178500 $WT \\ \\ pEMPTY_{H}$\n",
"2 47.7552 WT_pEMPTY_H 42.178500 $WT \\ \\ pEMPTY_{H}$\n",
"3 47.2700 WT_pEMPTY_H 42.178500 $WT \\ \\ pEMPTY_{H}$\n",
"4 40.7508 WT_pEMPTY_H 42.178500 $WT \\ \\ pEMPTY_{H}$\n",
"5 37.9183 WT_pEMPTY_H 42.178500 $WT \\ \\ pEMPTY_{H}$\n",
"6 22.0646 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"7 39.1553 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"8 31.6732 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"9 49.1083 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"10 37.7069 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"11 29.9245 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"12 33.3961 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"13 37.9544 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"14 41.9204 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"15 35.9552 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"16 37.4276 WT_pBLI1_H 36.026045 $WT \\ \\ pBLI1_{H}$\n",
"17 35.1384 koUBC8_pEMPTY_H 41.052820 $koUBC8 \\ \\ pEMPTY_{H}$\n",
"18 44.0436 koUBC8_pEMPTY_H 41.052820 $koUBC8 \\ \\ pEMPTY_{H}$\n",
"19 44.9225 koUBC8_pEMPTY_H 41.052820 $koUBC8 \\ \\ pEMPTY_{H}$\n",
"20 41.9766 koUBC8_pEMPTY_H 41.052820 $koUBC8 \\ \\ pEMPTY_{H}$\n",
"21 39.1830 koUBC8_pEMPTY_H 41.052820 $koUBC8 \\ \\ pEMPTY_{H}$\n",
"22 38.0616 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"23 49.3502 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"24 51.2494 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"25 50.9025 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"26 50.6737 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"27 50.4798 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"28 43.0945 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"29 56.8453 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"30 66.7108 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"31 59.0353 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"32 56.8301 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n",
"33 53.6592 koUBC8_pBLI1_H 52.241033 $koUBC8 \\ \\ pBLI1_{H}$\n"
]
}
],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"frame_dict = dict()\n",
"frame_dict['mean_density'] = []\n",
"frame_dict['strain'] = []\n",
"frame_dict['strain_mean'] = []\n",
"frame_dict['strain_labels'] = []\n",
"strain_ordering = ['WT_pEMPTY_H', 'WT_pBLI1_H', 'koUBC8_pEMPTY_H', 'koUBC8_pBLI1_H']\n",
"strain_labels = {'WT_pEMPTY_H': '$WT \\ \\ pEMPTY_{H}$', \n",
" 'WT_pBLI1_H': '$WT \\ \\ pBLI1_{H}$',\n",
" 'koUBC8_pEMPTY_H': '$koUBC8 \\ \\ pEMPTY_{H}$',\n",
" 'koUBC8_pBLI1_H': '$koUBC8 \\ \\ pBLI1_{H}$'}\n",
"means = dict()\n",
"std_errs = dict()\n",
"std_devs = dict()\n",
"for strain in strain_ordering:\n",
" these_points = pts_no_outliers[strain]\n",
" means[strain] = np.mean(these_points)\n",
" std_errs[strain] = np.std(these_points)/(np.sqrt(len(these_points)))\n",
" std_devs[strain] = np.std(these_points)\n",
"print('means:{}'.format(means))\n",
"print('std errs:{}'.format(std_errs))\n",
"\n",
"for strain in strain_ordering:\n",
" for mean_density in pts_no_outliers[strain]:\n",
" frame_dict['strain'].append(strain)\n",
" frame_dict['mean_density'].append(mean_density)\n",
" frame_dict['strain_mean'].append(means[strain])\n",
" frame_dict['strain_labels'].append(strain_labels[strain])\n",
" \n",
" \n",
"a=pd.DataFrame(frame_dict)\n",
"print(a)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Function for drawing the statistical significance\n",
"def label_diff(i,j,text,X,Y,ax):\n",
" x = (X[i]+X[j])/2.0\n",
" y = 1.5*max(Y[i], Y[j])\n",
" dx = abs(X[i]-X[j])\n",
"\n",
" props = {'connectionstyle':'bar','arrowstyle':'-',\\\n",
" 'shrinkA':10,'shrinkB':10,'linewidth':2}\n",
" ax.annotate(text, xy=(X[i],y+12), zorder=10)\n",
" ax.annotate('', xy=(X[i],y), xytext=(X[j],y), arrowprops=props)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def barplot_annotate_brackets(num1, num2, data, center, height, yerr=None, dh=.05, barh=.05, fs=None, maxasterix=None):\n",
" \"\"\" \n",
" Annotate barplot with p-values.\n",
"\n",
" :param num1: number of left bar to put bracket over\n",
" :param num2: number of right bar to put bracket over\n",
" :param data: string to write or number for generating asterixes\n",
" :param center: centers of all bars (like plt.bar() input)\n",
" :param height: heights of all bars (like plt.bar() input)\n",
" :param yerr: yerrs of all bars (like plt.bar() input)\n",
" :param dh: height offset over bar / bar + yerr in axes coordinates (0 to 1)\n",
" :param barh: bar height in axes coordinates (0 to 1)\n",
" :param fs: font size\n",
" :param maxasterix: maximum number of asterixes to write (for very small p-values)\n",
" \"\"\"\n",
"\n",
" if type(data) is str:\n",
" text = data\n",
" else:\n",
" # * is p < 0.05\n",
" # ** is p < 0.005\n",
" # *** is p < 0.0005\n",
" # etc.\n",
" text = ''\n",
" p = .05\n",
"\n",
" while data < p:\n",
" text += '*'\n",
" p /= 10.\n",
"\n",
" if maxasterix and len(text) == maxasterix:\n",
" break\n",
"\n",
" if len(text) == 0:\n",
" text = 'n. s.'\n",
"\n",
" lx, ly = center[num1], height[num1]\n",
" rx, ry = center[num2], height[num2]\n",
"\n",
" if yerr:\n",
" ly += yerr[num1]\n",
" ry += yerr[num2]\n",
"\n",
" ax_y0, ax_y1 = plt.gca().get_ylim()\n",
" dh *= (ax_y1 - ax_y0)\n",
" barh *= (ax_y1 - ax_y0)\n",
"\n",
" y = max(ly, ry) + dh\n",
"\n",
" barx = [lx, lx, rx, rx]\n",
" bary = [y, y+barh, y+barh, y]\n",
" mid = ((lx+rx)/2, y+barh)\n",
"\n",
" plt.plot(barx, bary, c='black')\n",
"\n",
" kwargs = dict(ha='center', va='bottom')\n",
" if fs is not None:\n",
" kwargs['fontsize'] = fs\n",
"\n",
" plt.text(*mid, text, **kwargs)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"means:{'WT_pEMPTY_H': 42.17850000000001, 'WT_pBLI1_H': 36.02604545454545, 'koUBC8_pEMPTY_H': 41.05282, 'koUBC8_pBLI1_H': 52.24103333333333}, strain_ordering:['WT_pEMPTY_H', 'WT_pBLI1_H', 'koUBC8_pEMPTY_H', 'koUBC8_pBLI1_H']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jim/anaconda3/lib/python3.6/site-packages/matplotlib/figure.py:2267: UserWarning: This figure includes Axes that are not compatible with tight_layout, so results might be incorrect.\n",
" warnings.warn(\"This figure includes Axes that are not compatible \"\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 252x324 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Plot using bar-chart\n",
"sns.set(style=\"white\", rc={'axes.facecolor':'white', 'figure.facecolor':'white', \n",
" 'figure.frameon':False, 'axes.edgecolor':'white', 'figure.figsize':(3.5,4.5)})\n",
"sns.despine()\n",
"menMeans = []\n",
"print('means:{}, strain_ordering:{}'.format(means, strain_ordering))\n",
"for strain in strain_ordering:\n",
" menMeans.append(means[strain])\n",
"ind = np.arange(4) # the x locations for the groups\n",
"\n",
"from matplotlib import rcParams\n",
"rcParams.update({'figure.autolayout': True})\n",
"\n",
"ax2 = sns.swarmplot(x='strain', y=\"mean_density\", #hue=\"strain\", \n",
" #edgecolor='gray', linewidth=0.5,\n",
" palette=['0.5', '0.5', '0.5', '0.5'], marker=\"o\",\n",
" data=frame_dict, dodge=False)\n",
"ax1 = sns.barplot(x='strain_labels', y=\"mean_density\", hue=\"strain\", #y=\"strain_mean\"\n",
" data=frame_dict, dodge=False, \n",
" ci=None, \n",
" palette=['.8', '.8', '.8', '.8']) #saturation=1.75)\n",
"ax1.grid(False)\n",
"ax2.grid(False)\n",
"\n",
"x_err_center = [0,1,2,3]\n",
"y_err_center = [means[strain_ordering[i]] for i in x_err_center]\n",
"y_errs = [std_devs[strain_ordering[i]] for i in x_err_center]\n",
"plt.errorbar(x_err_center, y_err_center, yerr=y_errs, fmt='none', ecolor='b', \n",
" elinewidth=1.0, capsize=6.0, capthick=1.0, zorder=10 )\n",
"\n",
"# Draw significance labels\n",
"heights=[50.0, 50.0, 57.0, 64.0]\n",
"barplot_annotate_brackets(0, 1, '$n.s.$', ind, heights, yerr=None, dh=.05, barh=.05, fs=None, maxasterix=None)\n",
"barplot_annotate_brackets(0, 2, '$n.s.$', ind, heights, yerr=None, dh=.05, barh=.05, fs=None, maxasterix=None)\n",
"barplot_annotate_brackets(0, 3, '$* \\ p=0.008$', ind, heights, yerr=None, dh=.05, barh=.05, fs=None, maxasterix=None)\n",
"#ax1.get_legend().remove()\n",
"ax1.get_legend().set_visible(False)\n",
"ax1.set_ylabel('$Flourescence \\ (Arbitrary \\ Units)$', fontsize=12)\n",
"ax1.tick_params(axis='both', which='major', labelsize=12)\n",
"#ax1.set(ylabel='$Flourescence \\ (Arbitrary \\ Units)$')\n",
"\n",
"#plt.legend(loc='right')\n",
"plt.xticks(rotation=90)\n",
"plt.tight_layout()\n",
"\n",
"\n",
"plt.savefig('bar.png', dpi=300)\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ind:[0 1 2 3], menMeans:[42.17850000000001, 36.02604545454545, 41.05282, 52.24103333333333]\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jim/anaconda3/lib/python3.6/site-packages/matplotlib/figure.py:2267: UserWarning: This figure includes Axes that are not compatible with tight_layout, so results might be incorrect.\n",
" warnings.warn(\"This figure includes Axes that are not compatible \"\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 252x324 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot using box-plot plus swarm plot\n",
"sns.set(style=\"whitegrid\", palette=\"muted\")\n",
"\n",
"menMeans = []\n",
"for strain in strain_ordering:\n",
" menMeans.append(means[strain])\n",
"ind = np.arange(4) # the x locations for the groups\n",
"\n",
"# Draw a categorical scatterplot to show each observation\n",
"ax1 = sns.boxplot(x='strain', y=\"mean_density\", hue=\"strain\", #y=\"strain_mean\"\n",
" data=frame_dict, dodge=False, color='g',\n",
" palette=['.7', '.7', '.7', '.7']) #saturation=1.75)\n",
"ax2 = sns.swarmplot(x='strain', y=\"mean_density\", hue=\"strain\", \n",
" color='gray', #color=\".25\",\n",
" palette=['0.1', '0.1', '0.1', '0.1'],\n",
" data=frame_dict, dodge=False)\n",
"\n",
"print('ind:{}, menMeans:{}'.format(ind,menMeans))\n",
"#label_diff(0,2,'n.s.', ind, menMeans,ax=ax1)\n",
"heights=[60.0, 60.0, 70.0, 80.0]\n",
"barplot_annotate_brackets(0, 1, 'n.s.', ind, heights, yerr=None, dh=.05, barh=.05, fs=None, maxasterix=None)\n",
"barplot_annotate_brackets(0, 2, 'n.s.', ind, heights, yerr=None, dh=.05, barh=.05, fs=None, maxasterix=None)\n",
"barplot_annotate_brackets(0, 3, '$p=0.008$', ind, heights, yerr=None, dh=.05, barh=.05, fs=None, maxasterix=None)\n",
"#ax1.get_legend().remove()\n",
"ax1.get_legend().set_visible(False)\n",
"\n",
"#plt.legend(loc='right')\n",
"plt.xticks(rotation=-20)\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# Compute the deltas"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"# 'WT_pEMPTY_H', 'WT_pBLI1_H', 'koUBC8_pEMPTY_H', 'koUBC8_pBLI1_H'\n",
"delta_koUbc8_pEMPTY = means['koUBC8_pEMPTY_H'] - means['WT_pEMPTY_H']\n",
"delta_wt_pBLI1 = means['WT_pBLI1_H'] - means['WT_pEMPTY_H']\n",
"delta_koUbc8_pBLI1 = means['koUBC8_pBLI1_H'] - means['WT_pEMPTY_H']\n",
"summed_delta = delta_koUbc8_pEMPTY + delta_wt_pBLI1"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"variances:\n",
"{'WT_pEMPTY': 1.835322496, 'WT_pBLI1_H': 2.093732908, 'koUBC8_pEMPTY_H': 1.778329955, 'koUBC8_pBLI1_H': 2.134159425}\n",
"t:-5.574403838666234, diff:-17.34066787878789\n"
]
}
],
"source": [
"# Standard errors (standard deviations of the mean)\n",
"# Computed in the class yeast spreadsheet\n",
"# WT_pEMPTY_H WT_pBLI1_H koUBC8_pEMPTY_H koUBC8_pBLI1_H\n",
"# 1.835322496 2.093732908 1.778329955 2.134159425\n",
"variances = {'WT_pEMPTY':1.835322496, \n",
" 'WT_pBLI1_H': 2.093732908,\n",
" 'koUBC8_pEMPTY_H': 1.778329955,\n",
" 'koUBC8_pBLI1_H': 2.134159425 }\n",
"\n",
"# Variance of a random var that is the sum of two other random variables\n",
"# is the sum of those variables' variances\n",
"var_koUbc8_pEMPTY_delta = variances['koUBC8_pEMPTY_H'] + variances['WT_pEMPTY']\n",
"var_wt_pBLI1_delta = variances['WT_pBLI1_H'] + variances['WT_pEMPTY']\n",
"var_koUbc8_pBLI1_delta = variances['koUBC8_pBLI1_H'] + variances['WT_pEMPTY']\n",
"\n",
"summed_deltas_var = var_koUbc8_pEMPTY_delta + var_wt_pBLI1_delta\n",
"\n",
"diff = summed_delta - delta_koUbc8_pBLI1\n",
"# Compute the t-statistic\n",
"t = diff / np.sqrt(summed_deltas_var + variances['koUBC8_pBLI1_H'])\n",
"\n",
"print('variances:\\n{}'.format(variances))\n",
"print('t:{}, diff:{}'.format(t, diff))\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"p from z-test:2.4837895589549043e-08\n",
"dof:32\n",
"p from t-test:3.7339342713327284e-06\n"
]
}
],
"source": [
"import scipy.stats as sps\n",
"\n",
"# Get p value.\n",
"# Use the normal distribution instead of student's t-distribution. \n",
"# t-distrib approaches normal distribution as DOF-> inf. \n",
"# We are at n>30.\n",
"if t < 0:\n",
" # Double-tailed since H_Null is 'means are equal'.\n",
" p = 2.0*sps.norm.cdf(t)\n",
"else:\n",
" p = 2.0*(1.0 - sps.norm.cdf(t))\n",
" \n",
"print('p from z-test:{}'.format(p))\n",
"\n",
"# Compute the p-value again, this time using t-distribution.\n",
"# degrees of freedom: all points used - constraints from 2 means.\n",
"pt_ctr = 0\n",
"for key in pts_no_outliers:\n",
" pt_ctr += len(pts_no_outliers[key])\n",
" \n",
"dof = pt_ctr - 2 \n",
"print('dof:{}'.format(dof))\n",
"p = 2.0*(1.0 - sps.t.cdf(abs(t), dof))\n",
"print('p from t-test:{}'.format(p))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"# strain_ordering = ['WT_pEMPTY_H', 'WT_pBLI1_H', 'koUBC8_pEMPTY_H', 'koUBC8_pBLI1_H']\n",
"# strain_labels = {'WT_pEMPTY_H': '$WT \\ \\ pEMPTY_{H}$', \n",
"# 'WT_pBLI1_H': '$WT \\ \\ pBLI1_{H}$',\n",
"# 'koUBC8_pEMPTY_H': '$koUBC8 \\ \\ pEMPTY_{H}$',\n",
"# 'koUBC8_pBLI1_H': '$koUBC8 \\ \\ pBLI1_{H}$'}\n",
"\n",
"# means = dict()\n",
"# for strain in strain_ordering:\n",
"# means[strain] = np.mean(pts_no_outliers[strain])\n",
"# print(means)\n",
"\n",
"delta_frame_dict = {'delta': [delta_wt_pBLI1, delta_koUbc8_pEMPTY,\n",
" summed_delta, delta_koUbc8_pBLI1 ], \n",
" 'strain': [strain_labels['WT_pBLI1_H'], \n",
" strain_labels['koUBC8_pEMPTY_H'], \n",
" 'WT $pBLI1_{H}$ + \\n koUBC8 $pEMPTY_{H}$', \n",
" strain_labels['koUBC8_pBLI1_H']],\n",
" 'var': [var_wt_pBLI1_delta, var_koUbc8_pEMPTY_delta,\n",
" summed_deltas_var, var_koUbc8_pBLI1_delta]}\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jim/anaconda3/lib/python3.6/site-packages/matplotlib/figure.py:2267: UserWarning: This figure includes Axes that are not compatible with tight_layout, so results might be incorrect.\n",
" warnings.warn(\"This figure includes Axes that are not compatible \"\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 252x324 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot using bar-chart\n",
"#sns.set(style=\"whitegrid\")\n",
"sns.set(style=\"white\", rc={'axes.facecolor':'white', 'figure.facecolor':'white', \n",
" 'figure.frameon':False, 'axes.edgecolor':'white', 'figure.figsize':(3.5,4.5)})\n",
"\n",
"conf_ints = [np.sqrt(var_wt_pBLI1_delta), \n",
" np.sqrt(var_koUbc8_pEMPTY_delta),\n",
" np.sqrt(summed_deltas_var), \n",
" np.sqrt(var_koUbc8_pBLI1_delta)]\n",
"\n",
"# Draw a categorical scatterplot to show each observation\n",
"ax1 = sns.barplot(x='strain', y=\"delta\", hue=\"strain\", \n",
" data=delta_frame_dict, dodge=False, \n",
"# color='g',\n",
"# yerr=conf_ints, \n",
"# errcolor='blue', errwidth=1.0, capsize=5.0,\n",
" palette=['.7', '.7', '.7', '.7']) #saturation=1.75)\n",
"# ax2 = sns.swarmplot(x='strain', y=\"mean_density\", hue=\"strain\", \n",
"# color='gray', #color=\".25\",\n",
"# palette=['0.1', '0.1', '0.1', '0.1'],\n",
"# data=frame_dict, dodge=False)\n",
"ax1.grid(False)\n",
"x_err_center = [0,1,2,3]\n",
"y_err_center = delta_frame_dict['delta']\n",
"y_errs = [np.sqrt(delta_frame_dict['var'][i]) for i in x_err_center]\n",
"plt.errorbar(x_err_center, y_err_center, yerr=y_errs, fmt='none', ecolor='b', \n",
" elinewidth=1.0, capsize=6.0, capthick=1.0, zorder=10)\n",
"\n",
"\n",
"#label_diff(0,2,'n.s.', ind, menMeans,ax=ax1)\n",
"heights=[15, 15, 15, 15]\n",
"barplot_annotate_brackets(2, 3, '$* \\ p= 4 * 10^{-6}$', ind, heights, yerr=None, dh=.05, barh=.05, fs=None, maxasterix=None)\n",
"#ax1.get_legend().remove()\n",
"ax1.get_legend().set_visible(False)\n",
"ax1.set_ylabel('$\\Delta \\ Flourescence \\ (a.u.) \\ above \\ WT$', fontsize=12)\n",
"#ax1.set_ylabel('$Flourescence \\ (Arbitrary \\ Units)$', fontsize=14)\n",
"ax1.tick_params(axis='both', which='major', labelsize=12)\n",
"#plt.legend(loc='right')\n",
"plt.xticks(rotation=90)\n",
"plt.savefig('deltas.png', dpi=300)\n",
"plt.show()\n",
"# fig = plt.figure()\n",
"# fig.savefig('deltas.png')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment