{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 9_ctx_3region_DEGs_expression_in_cc" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/mnt/Data16Tc/home/haichao/anaconda3/envs/SpaCon_test/lib/python3.8/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] } ], "source": [ "import pandas as pd\n", "import scanpy as sc\n", "from scipy.spatial import cKDTree\n", "from tqdm import tqdm\n", "import matplotlib.pyplot as plt\n", "\n", "import warnings\n", "import seaborn as sns\n", "import matplotlib as mpl\n", "mpl.rcParams['pdf.fonttype'] = 42\n", "mpl.rcParams['ps.fonttype'] = 42\n", "\n", "warnings.filterwarnings('ignore')" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### gene exp data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
totalRNAbrain_section_labelxyzn_genes_by_countstotal_countsregion
100008170567769574864159172860058606533175Zhuang-ABCA-3.00119.06388333.42334654.106801100175MOB
100019036144713180485707288452329906643373Zhuang-ABCA-3.00144.29063763.87274853.902462189373NDB
10002377904544842423531242460024745973277Zhuang-ABCA-3.00163.8605257.99801354.043841126277RSPd2/3
100027648052649525810014127621472143070435Zhuang-ABCA-3.001113.48048041.05667454.349928165435arb
10002987514452407226595493189549406709660Zhuang-ABCA-3.00111.57267637.92155454.3703363960MOB
...........................
99961718914838042706216314325649765172627Zhuang-ABCA-3.001113.19910023.66137454.096322157627CENT3
9996242280180655885872867452807576494157Zhuang-ABCA-3.00186.89656618.32693854.027272100157SCop
99992139250151830921499356408957256397Zhuang-ABCA-3.00121.08287831.63507854.0909056797ORBm1
99995909784199304193294645747252265238154Zhuang-ABCA-3.001111.60547822.41797454.07081993154CENT3
99996568769251334694329666788053033728200Zhuang-ABCA-3.001112.94575631.43398554.09340595200CENT3
\n", "

83602 rows × 8 columns

\n", "
" ], "text/plain": [ " totalRNA brain_section_label \\\n", "100008170567769574864159172860058606533 175 Zhuang-ABCA-3.001 \n", "100019036144713180485707288452329906643 373 Zhuang-ABCA-3.001 \n", "10002377904544842423531242460024745973 277 Zhuang-ABCA-3.001 \n", "100027648052649525810014127621472143070 435 Zhuang-ABCA-3.001 \n", "100029875144524072265954931895494067096 60 Zhuang-ABCA-3.001 \n", "... ... ... \n", "99961718914838042706216314325649765172 627 Zhuang-ABCA-3.001 \n", "9996242280180655885872867452807576494 157 Zhuang-ABCA-3.001 \n", "999921392501518309214993564089572563 97 Zhuang-ABCA-3.001 \n", "99995909784199304193294645747252265238 154 Zhuang-ABCA-3.001 \n", "99996568769251334694329666788053033728 200 Zhuang-ABCA-3.001 \n", "\n", " x y z \\\n", "100008170567769574864159172860058606533 19.063883 33.423346 54.106801 \n", "100019036144713180485707288452329906643 44.290637 63.872748 53.902462 \n", "10002377904544842423531242460024745973 63.860525 7.998013 54.043841 \n", "100027648052649525810014127621472143070 113.480480 41.056674 54.349928 \n", "100029875144524072265954931895494067096 11.572676 37.921554 54.370336 \n", "... ... ... ... \n", "99961718914838042706216314325649765172 113.199100 23.661374 54.096322 \n", "9996242280180655885872867452807576494 86.896566 18.326938 54.027272 \n", "999921392501518309214993564089572563 21.082878 31.635078 54.090905 \n", "99995909784199304193294645747252265238 111.605478 22.417974 54.070819 \n", "99996568769251334694329666788053033728 112.945756 31.433985 54.093405 \n", "\n", " n_genes_by_counts total_counts \\\n", "100008170567769574864159172860058606533 100 175 \n", "100019036144713180485707288452329906643 189 373 \n", "10002377904544842423531242460024745973 126 277 \n", "100027648052649525810014127621472143070 165 435 \n", "100029875144524072265954931895494067096 39 60 \n", "... ... ... \n", "99961718914838042706216314325649765172 157 627 \n", "9996242280180655885872867452807576494 100 157 \n", "999921392501518309214993564089572563 67 97 \n", "99995909784199304193294645747252265238 93 154 \n", "99996568769251334694329666788053033728 95 200 \n", "\n", " region \n", "100008170567769574864159172860058606533 MOB \n", "100019036144713180485707288452329906643 NDB \n", "10002377904544842423531242460024745973 RSPd2/3 \n", "100027648052649525810014127621472143070 arb \n", "100029875144524072265954931895494067096 MOB \n", "... ... \n", "99961718914838042706216314325649765172 CENT3 \n", "9996242280180655885872867452807576494 SCop \n", "999921392501518309214993564089572563 ORBm1 \n", "99995909784199304193294645747252265238 CENT3 \n", "99996568769251334694329666788053033728 CENT3 \n", "\n", "[83602 rows x 8 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "adata_in = sc.read_h5ad('/mnt/Data16Tc/home/haichao/code/SpaCon/Data/N_20231213_zxw/mouse_3/adata_processed.h5ad')\n", "allen_region = pd.read_csv('/mnt/Data16Tc/home/haichao/code/SpaCon/Data/N_20231213_zxw/mouse_3/allen_region.csv')\n", "adata_in.obs['region'] = allen_region['region'].values\n", "meta = pd.read_csv('/mnt/Data16Tc/home/haichao/code/SpaCon/Data/N_20231213_zxw/mouse_3/cell_metadata_with_cluster_annotation.csv')\n", "meta = meta.set_index('cell_label')\n", "meta = meta.loc[adata_in.obs.index.to_list()]\n", "adata_in.obs['cell_type'] = meta['class'].to_list()\n", "\n", "adata_out = sc.read_h5ad('/mnt/Data18Td/Data/haichao/merfish_raw_data_zxw3/out_cell_adata/adata_out_cell_distance_q0.3/after_qc/Zhuang-ABCA-3.001.h5ad')\n", "adata_out.obs['region'] = adata_in.obs.loc[adata_out.obs_names]['region'].values\n", "\n", "adata_in = adata_in[adata_in.obs['cell_type'].str.contains('Glut')]\n", "adata_out.obs" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "gene_com = list(set(adata_in.var_names) & set(adata_out.var_names))\n", "adata_in = adata_in[:, gene_com]\n", "adata_out = adata_out[:, gene_com]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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c1we4panY1Uqbnk61txxb928obOYtevW03nM3HHL0+eJ57jsxi1LOJAaERERERERkUyYdBMRERERERHJpFhJd07zCiIiIiIiIiLKS610AYiIiIiIiIjKKibdRERERERERDJh0k1EREREREQkEybdRERERERERDJh0k1EREREREQkEybdRERERERERDJh0k1EREREREQkEybdRERERERERDJh0k1EREREREQkEybdRERERERERDJh0k1EREREREQkEybdRERERERERDJh0k1EREREREQkEybdRERERERERDJh0k1EREREREQkEybdRERERERERDJh0k1EREREREQkEybdRERERERERDJh0k1EREREREQkEybdRERERERERDJh0k1ERERERESl0g8//AA3NzesW7cOABAcHIz69eujTp06mDdvnsKly6avdAGIiIiIiIiIisrPzw+zZ89Gjx498Omnn+LevXtYsWIFPD09kZmZiWXLlqF69eoYN26couVk0k1EREREREQlRnp6OtLT07WWGRkZwcjISGvZ2rVr8d1332HYsGE4f/48WrduDX9/f3h4eAAAqlevjm+//bZsJd0+Pj5IS0uTcpdEOrNixQqli0BEREREVO4tXrwYCxYs0Fo2b948zJ8/X2vZnTt30L59ewBAs2bNoKenhzZt2mjWd+rUCdOnT5e9vP9F0qQ7LS2NiQsRERERERG9Nh8fH0ydOlVr2cu13ABgamqK1NRUzfuqVavC3Nxca5sXL17IU8giYPNyIiIiIiIiKjHya0qeHwcHB1y8eBH169cHANy9e1drfUxMDGrVqiVHEYuESTcRERERERGVOkuXLoWZmVmB62NjY/Hhhx/qsET5Y9JNREREREREpc7bb7/9yvUTJ07UUUlejfN0ExERERERUan1xx9/ICIiIs/yiIgInDlzRoESaWPSTURERERERKXWpEmT8vTnBoC///4bkyZNUqBE2ph0ExERERERUakVHR2N5s2b51nerFkzREdHK1AibUy6iYiIiIiIqNQyMjLC/fv38yyPi4uDvr7yw5gx6SYiIiIiIqJSq3v37vDx8UFSUpJmWWJiImbNmoVu3bopWLJsyqf9RERERERERK/J19cXHTt2RM2aNdGsWTMAwIULF2BlZYUNGzYoXDom3URERERERFSKVa9eHRcvXsTGjRsRGRkJExMTuLu7w8XFBQYGBkoXj0k3ERERERERlV6LFy+GlZUVxo0bp7U8MDAQDx48gLe3t0Ily8Y+3URERERERFRqrV27Fg4ODnmWN2zYEP7+/gqUSBuTbiIiIiIiIiq14uPjYWNjk2d51apVERcXp0CJtDHpJiIiIiIiolLLzs4O4eHheZaHh4fD1tZWgRJpY59uIiIiIiIiKrXGjh2LKVOm4Pnz5+jSpQsAIDQ0FF5eXpg2bZrCpWPSTURERERERKXYjBkz8M8//2DixInIyMgAABgbG8Pb2xs+Pj4Kl45JNxEREREREZViKpUKS5cuxZw5c3DlyhWYmJjA3t4eRkZGShcNAJNuIiIiIiIiKgPMzc3RqlUrpYuRBwdSIyIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimaiEEEKqnXl6emLFihVS7Y6IiIiIiIioVGNNNxEREREREZFM9JUuAFFJc+fGVZ3FqlnvLQDArZs3dBYTAGrXrVdu4ubEvH3jms5iAkCtem8CUOZYHy36UGcxAeCN2WsBAGm/fKfTuMa9x2XH3a67FlbG73sCUO7a+fPmTZ3GrVO3LgAg9voVncX8n319AModa3mIW56OVam4PNayH1eJ7/fydo7LEtZ0ExEREREREcmESTcRERERERGRTJh0ExEREREREcmESTcRERERERERACEEYmNjkZaWJtk+mXQTERERERERITvprlevHu7evSvZPpl0ExEREREREQFQq9Wwt7fHP//8I90+JdsTERERERERUSm3ZMkSzJgxA5cvX5Zkf5ynm4iIiIiIiOhfI0eOxNOnT9G0aVMYGhrCxMREa/2jR4+KtD8m3URERERERET/8vPzk3R/TLqJiIiIiIiI/uXm5ibp/tinm4iIiIiIiCiXmzdvYvbs2XBxcUFCQgIAYP/+/YiKiiryvph0ExEREREREf3r6NGjaNy4MSIiIrBjxw6kpKQAACIjIzFv3rwi749JNxEREREREdG/Zs6ciUWLFuHQoUMwNDTULO/SpQtOnTpV5P0x6SYiIiIiIiL616VLl/Dee+/lWV6tWjU8fPiwyPtj0k1ERERERET0r4oVKyIuLi7P8vPnz6N69epF3h+TbiIiIiIiIqJ/DR06FN7e3oiPj4dKpUJWVhbCw8Mxffp0jBw5ssj7Y9JNRERERERE9K8vvvgCDg4OsLOzQ0pKCho0aICOHTuiXbt2mD17dpH3x3m6iYiIiIiIiP5laGiI77//HnPnzsWlS5eQkpKCZs2awd7e/rX2x5puIiIiIiIion8tXLgQT58+hZ2dHXr37o3BgwfD3t4ez549w8KFC4u8PybdRERERERERP9asGCBZm7u3J4+fYoFCxYUeX9MuomIiIiIiIj+JYSASqXKszwyMhJvvPFGkffHPt1ERERERERU7lWqVAkqlQoqlQpvvvmmVuKdmZmJlJQUjB8/vsj7ZdJNRERERERE5Z6fnx+EEBg9ejQWLFgAS0tLzTpDQ0PUqlULbdu2LfJ+mXQTERERERFRuefm5gYAqF27Nt5++23o60uTLrNPNxEREREREZU5V65cQZ06dYr8dxUqVMCVK1c073fv3o0BAwZg1qxZyMjIKPL+mHQTERERERFRiZGeno7k5GStV3p6epH3k5GRgTt37hT57z788ENcu3YNAPDnn39iyJAhMDU1xdatW+Hl5VXk/ZXp5uU+Pj5IS0tTuhhUSqxYsULpIhARERERlXuLFy/OMzXXvHnzMH/+fK1lU6dOfeV+Hjx48Frxr127BkdHRwDA1q1b0alTJ2zatAnh4eEYOnQo/Pz8irS/Mp10p6WlMZEiIiIiIiIqRXx8fPIk1EZGRnm2+/rrr+Ho6AgLC4t895PfXNuFIYRAVlYWAODw4cPo27cvAMDOzg4PHz4s8v7KdNJNREREREREpYuRkVG+SfbL6tWrB09PTwwfPjzf9RcuXECLFi2KHL9ly5ZYtGgRnJ2dcfToUXz77bcAgFu3bsHKyqrI+2OfbiIiIiIiIip1WrZsibNnzxa4XqVSQQhR5P36+fnh3Llz+Oijj/Dpp5+iXr16AIBt27ahXbt2Rd4fa7qJiIiIiIio1Fm2bNkrB1hr2rSpppl4UTRp0gSXLl3Ks/yrr76Cnp5ekffHpJuIiIiIiIhKHWtra53GMzY2fq2/Y9JNREREREREpdYff/yBrKwsODk5aS2PiIiAnp4eWrZsWaT9qdVqqFSqAtdnZmYWaX9MuomIiIiIiKjUmjRpEry8vPIk3X///TeWLl2KiIiIIu1v586dWu+fP3+O8+fPY/369XmmMisMJt1ERERERERUakVHR6N58+Z5ljdr1gzR0dFF3l///v3zLBs0aBAaNmyI4OBgeHh4FGl/HL2ciIiIiIiISi0jIyPcv38/z/K4uDjo60tXz9ymTRuEhoYW+e+YdBMREREREVGp1b17d/j4+CApKUmzLDExEbNmzUK3bt0kifHs2TOsXLkS1atXL/Lfsnk5ERERERERlVq+vr7o2LEjatasiWbNmgEALly4ACsrK2zYsKHI+6tUqZLWQGpCCDx58gSmpqb46aefirw/Jt1ERERERERUalWvXh0XL17Exo0bERkZCRMTE7i7u8PFxQUGBgZF3t+KFSu0km61Wo2qVavCyckJlSpVKvL+mHQTERERERFRqbV48WJYWVlh3LhxWssDAwPx4MEDeHt7F2l/o0aNkrB0TLqJiIiIiIioFFu7di02bdqUZ3nDhg0xdOjQQiXdFy9eLHS8Jk2aFKl8TLqJiIiIiIio1IqPj4eNjU2e5VWrVkVcXFyh9uHo6AiVSgUhxCu3U6lUyMzMLFL5mHQTERERERFRqWVnZ4fw8HDUrl1ba3l4eDhsbW0LtY9bt27JUTQATLqJiIiIiIioFBs7diymTJmC58+fo0uXLgCA0NBQeHl5Ydq0aYXaR82aNTX/n9NHfPTo0VrbvG4fcSbdREREREREVGrNmDED//zzDyZOnIiMjAwAgLGxMby9veHj41Pk/UnRRzw3Jt1ERERERERUaqlUKixduhRz5szBlStXYGJiAnt7exgZGb3W/qToI54bk24iIiIiIiIq9czNzdGqVati70eKPuK5MekmIiIiIiIi+pcUfcRzY9JNRERERERE9C+p+4gz6SYiIiIiIiL6l9R9xJl0ExEREREREb1Eqj7iagnKQkRERERERET5UAkhhFQ78/T0xIoVK6TaXbGVtPIQERERERFR+SJp83JjY2N4enpKuctiSUhIULoIREREREREVI5JWtNd0rCmm17Hnzdv6ixWnbp1dR6zvMXlseou7p0bV3Uat2a9twAAt29c01nMWvXeBAA8WTVDZzEBoMLHXwEAkpdP0Wlci6l+AIB/Fo7TWczKc78DACT4jNRZTACotvhHAMDT9Qt1GtfUbS4AIG2Lr85iGg+enh3z56U6iwkAxi7eisZNiQjRWUxzp3cBAE/Dt+ssJgCYvv0+ACD1xA6dxTRrNxAAkLb3W53FBADjvhOy44b+qNu4XbPvTWm/BuguZg+P7JgH1+ksJgAYd3fPjqvDYwX+/3jLEvbpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIimTDpJiIiIiIiIpIJk24iIiIiIiIqlSIjI7Fo0SKsWbMGDx8+1FqXnJyM0aNHK1Sy/8ekm4iIiIiIiEqdgwcPonXr1ti8eTOWLl0KBwcHHDlyRLP+2bNnWL9+vYIlzMakm4iIiIiIiEqM9PR0JCcna73S09PzbDd//nxMnz4dly9fxu3bt+Hl5YV+/frhwIEDCpS6YPpKF0BOxsbG8PT0VLoYVEqsWLFC6SIQEREREZV7ixcvxoIFC7SWzZs3D/Pnz9daFhUVhQ0bNgAAVCoVvLy8UKNGDQwaNAibN29Gq1atdFXkVyrTSffixYuVLgIREREREREVgY+PD6ZOnaq1zMjIKM92RkZGSExM1Fo2bNgwqNVqDBkyBMuWLZOzmIVWppNuIiIiIiIiKl2MjIzyTbJf5ujoiCNHjqBFixZay4cOHQohBNzc3OQqYpEw6SYiIiIiIqJSZ8KECQgLC8t3nYuLC4QQ+P7773VcqryYdBMREREREVGp89577+G9994rcP2wYcMwbNgwHZYofxy9nIiIiIiIiEqtP/74AxEREXmWR0RE4MyZMwqUSBuTbiIiIiIiIiq1Jk2ahLt37+ZZ/vfff2PSpEkKlEgbk24iIiIiIiIqtaKjo9G8efM8y5s1a4bo6GgFSqSNSTcRERERERGVWkZGRrh//36e5XFxcdDXV34YMybdREREREREVGp1794dPj4+SEpK0ixLTEzErFmz0K1bNwVLlk35tJ+IiIiIiIjoNfn6+qJjx46oWbMmmjVrBgC4cOECrKyssGHDBoVLx6SbiIiIiIiISrHq1avj4sWL2LhxIyIjI2FiYgJ3d3e4uLjAwMBA6eIx6SYiIiIiIqLSa/HixbCyssK4ceO0lgcGBuLBgwfw9vZWqGTZ2KebiIiIiIiISq21a9fCwcEhz/KGDRvC399fgRJpY9JNREREREREpVZ8fDxsbGzyLK9atSri4uIUKJE2Jt1ERERERERUatnZ2SE8PDzP8vDwcNja2ipQIm3s001ERERERESl1tixYzFlyhQ8f/4cXbp0AQCEhobCy8sL06ZNU7h0TLqJiIiIiIioFJsxYwb++ecfTJw4ERkZGQAAY2NjeHt7w8fHR+HSMekmIiIiIiKiUkylUmHp0qWYM2cOrly5AhMTE9jb28PIyEjpogFg0k1ERERERERlgLm5OVq1aqV0MfLgQGpEREREREREMmHSTURERERERCQTJt1EREREREREMmHSTURERERERCQTJt1EREREREREMmHSTURERERERCQTlRBCKF0IIiIiIiIiorKINd1ExZSeno758+cjPT2dcctQzPIWtzwdq1JxeayMW9pjlre45elYlYpbno5Vqbjl6VhLMtZ0ExVTcnIyLC0tkZSUBAsLC8YtIzHLW9zydKxKxeWxMm5pj1ne4panY1Uqbnk6VqXilqdjLclY001EREREREQkEybdRERERERERDJh0k1EREREREQkEybdRMVkZGSEefPmwcjIiHHLUMzyFrc8HatScXmsjFvaY5a3uOXpWJWKW56OVam45elYSzIOpEZEREREREQkE9Z0ExEREREREcmESTcRERERERGRTJh0ExEREREREcmESTcRERERERGRTJh0ExERERFRmfTixQv8+OOPuH//vtJFoXKMo5cTEVGZ99NPP+G9996DmZmZ0kUhGSQkJCAhIQFZWVlay5s0aaJQiUgqZ86cwZUrVwAA9evXR8uWLRUukTz++usv7NmzB7GxscjIyNBat3z5coVKVXaYmpriypUrqFmzptJFKbPS0tJgbGysdDFKLCbdRBK7ePEiWrZsmedLU05ZWVn45Zdf0LdvX8n3ffv2bRw6dAgZGRno1KkTGjVqJHmMgty7dw/Hjx/P98f0J598IlmcgQMHFnrbHTt2SBKzUqVKUKlUhdr20aNHksTMzx9//IEjR47ke46l+qHXrFmzQh/ruXPnJIn5sqpVq+LZs2fo168fhg8fjh49ekBPT0+WWCWBUj/gdf1w4+zZs3Bzc8OVK1eQ83NGpVJBCAGVSoXMzEzJYpWUa1ZX98Xc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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ctx2cc_conn_cluster_mean = pd.read_csv('./ctx_cc_conn_filtered.csv', index_col=0)\n", "sns.clustermap(ctx2cc_conn_cluster_mean, cmap='coolwarm', center=0, figsize=(10, 3), linewidths=0.05, linecolor='white')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "View of AnnData object with n_obs × n_vars = 67823 × 1111\n", " obs: 'brain_section_label', 'x', 'y', 'z', 'x_ccf', 'y_ccf', 'z_ccf', 'region', 'cell_type'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "adata_ctx = adata_in[adata_in.obs['region'].str.startswith(tuple(ctx2cc_conn_cluster_mean.columns))]\n", "adata_ctx" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "\n", "ctx1 = ['FRP', 'ORBl', 'ORBvl', 'ORBm', 'PL', 'ILA']\n", "ctx2 = ['SSp-m', 'ACAd', 'ACAv']\n", "ctx3=['RSPv','RSPd', 'VISpm', 'VISa', 'VISam', 'SSp-bfd', 'VISpor', 'VISli', 'TEa', 'VISpl', 'VISl', 'AUDv', 'VISal', 'AUDpo', 'AUDp', 'AUDd']\n", "adata_ctx.obs['cc_ctx'] = None\n", "adata_ctx.obs.loc[adata_ctx.obs['region'].str.startswith(tuple(ctx1)), 'cc_ctx'] = 'ctx1'\n", "adata_ctx.obs.loc[adata_ctx.obs['region'].str.startswith(tuple(ctx2)), 'cc_ctx'] = 'ctx2'\n", "adata_ctx.obs.loc[adata_ctx.obs['region'].str.startswith(tuple(ctx3)), 'cc_ctx'] = 'ctx3'\n", "adata_ctx = adata_ctx[adata_ctx.obs['cc_ctx'].notna()]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "adata_cc = adata_out[adata_out.obs['region'].str.startswith('cc')]\n", "tmp = adata_cc.copy()\n", "idx = []\n", "cc_cluster_by_conn = pd.read_csv('./cc_cluster_by_conn.csv', index_col=0)\n", "coordinate = cc_cluster_by_conn[['x', 'y']].values\n", "kdtree = cKDTree(coordinate)\n", "for coord in tqdm(adata_cc.obs[['x', 'y']].values):\n", " _, nearest_index = kdtree.query(coord)\n", " idx.append(nearest_index)\n", "plt.figure(figsize=(9,5))\n", "### match the cc cluster\n", "adata_cc.obs['NT_index'] = idx\n", "adata_cc.obs['cc'] = cc_cluster_by_conn.loc[adata_cc.obs['NT_index']]['c'].values\n", "adata_cc = adata_cc[adata_cc.obs['cc'].notna()]\n", "adata_cc.obs['cc'] = 'cc'+((adata_cc.obs['cc']).astype(int)+1).astype(str)\n", "#### plot\n", "categories = adata_cc.obs['cc'].unique()\n", "# plt.scatter(adata_out.obs['x'], adata_out.obs['y'], s=1, c='#d3d3d3')\n", "plt.scatter(tmp.obs['x'], tmp.obs['y'], s=20, c='#8f8f8f')\n", "# plt.scatter(tmp.obs['x'], tmp.obs['y'], s=20, c='#d3d3d3')\n", "\n", "cm = ['#ff7f0e', '#2ca02c', '#2377b4']\n", "# cm = ['#6597b9', '#6bad6b', '#e9a161']\n", "i=0\n", "for category in categories:\n", " subset = adata_cc[adata_cc.obs['cc'] == category]\n", " plt.scatter(subset.obs['x'], subset.obs['y'], label=category, s=20, c=cm[i])\n", " # print(f'cc_{int(category)}')\n", " i=i+1\n", "plt.legend()\n", "plt.gca().invert_yaxis()\n", "# plt.savefig('cc_area.png', dpi=600)\n", "# plt.savefig('./cc/cc1_cc2_cc3.pdf', format='pdf')" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### DEG" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "sc.pp.normalize_total(adata_ctx, target_sum=1e4)\n", "sc.pp.log1p(adata_ctx)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "sc.pp.normalize_total(adata_cc, target_sum=1e4)\n", "sc.pp.log1p(adata_cc)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "sc.tl.rank_genes_groups(adata_ctx, groupby=\"cc_ctx\", reference=\"rest\", n_genes=adata_ctx.shape[1], method='wilcoxon')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
genescorelogfoldchangespvalspvals_adj
region
ctx3Nr2f210.9980082.2517403.906658e-282.346106e-27
ctx3Tshz242.7894131.9084880.000000e+000.000000e+00
ctx3Met15.6541501.5512933.112418e-552.659920e-54
ctx3Ctxn35.8297731.4974175.550263e-091.995580e-08
ctx3C1ql24.9706681.4101476.672248e-072.193156e-06
ctx2Scn4b33.8716551.2649141.742216e-2516.452006e-249
ctx2Bmpr1b13.5900111.1683214.590144e-428.792501e-41
ctx2Adgrl257.8149801.1569040.000000e+000.000000e+00
ctx2Blnk15.6975171.0492821.572777e-555.139282e-54
ctx2Plekha213.3594101.0180791.043885e-401.840883e-39
ctx1Crym70.2819983.1237530.000000e+000.000000e+00
ctx1Col6a149.0392302.7265120.000000e+000.000000e+00
ctx1Col12a145.2706572.5068890.000000e+000.000000e+00
ctx1Tnfrsf815.6379802.1919094.012542e-553.277893e-54
ctx1Prss1257.6395072.1056500.000000e+000.000000e+00
\n", "
" ], "text/plain": [ " gene score logfoldchanges pvals pvals_adj\n", "region \n", "ctx3 Nr2f2 10.998008 2.251740 3.906658e-28 2.346106e-27\n", "ctx3 Tshz2 42.789413 1.908488 0.000000e+00 0.000000e+00\n", "ctx3 Met 15.654150 1.551293 3.112418e-55 2.659920e-54\n", "ctx3 Ctxn3 5.829773 1.497417 5.550263e-09 1.995580e-08\n", "ctx3 C1ql2 4.970668 1.410147 6.672248e-07 2.193156e-06\n", "ctx2 Scn4b 33.871655 1.264914 1.742216e-251 6.452006e-249\n", "ctx2 Bmpr1b 13.590011 1.168321 4.590144e-42 8.792501e-41\n", "ctx2 Adgrl2 57.814980 1.156904 0.000000e+00 0.000000e+00\n", "ctx2 Blnk 15.697517 1.049282 1.572777e-55 5.139282e-54\n", "ctx2 Plekha2 13.359410 1.018079 1.043885e-40 1.840883e-39\n", "ctx1 Crym 70.281998 3.123753 0.000000e+00 0.000000e+00\n", "ctx1 Col6a1 49.039230 2.726512 0.000000e+00 0.000000e+00\n", "ctx1 Col12a1 45.270657 2.506889 0.000000e+00 0.000000e+00\n", "ctx1 Tnfrsf8 15.637980 2.191909 4.012542e-55 3.277893e-54\n", "ctx1 Prss12 57.639507 2.105650 0.000000e+00 0.000000e+00" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regions = adata_ctx.obs['cc_ctx'].unique()\n", "top_genes_df = pd.DataFrame(columns=['region', 'gene', 'score', 'logfoldchanges', 'pvals', 'pvals_adj'])\n", "for region in regions:\n", " markers_df = sc.get.rank_genes_groups_df(adata_ctx, group=region)\n", " markers_df = markers_df.sort_values(by='logfoldchanges', ascending=False)\n", " top_genes = markers_df.head(5)\n", " top_genes['region'] = region\n", " top_genes = top_genes[['region', 'names', 'scores', 'logfoldchanges', 'pvals', 'pvals_adj']]\n", " top_genes.columns = ['region', 'gene', 'score', 'logfoldchanges', 'pvals', 'pvals_adj']\n", " top_genes_df = pd.concat([top_genes_df, top_genes], ignore_index=True)\n", "top_genes_df = top_genes_df.set_index('region')\n", "top_genes_df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(16, 4))\n", "# top_genes_df_filt = top_genes_df[top_genes_df['logfoldchanges'] > 1]\n", "cc = ['ctx1', 'ctx2', 'ctx3']\n", "for i, cc_area in enumerate(cc):\n", " gene_data = adata_cc[:, top_genes_df.loc[cc_area]['gene']].X.A.mean(axis=1)\n", " group_data = adata_cc.obs['cc']\n", " df = pd.DataFrame({\n", " 'Expression': gene_data,\n", " 'subregion': group_data\n", " })\n", " ax = axes[i]\n", " sns.barplot(x='subregion', y='Expression', data=df, ax = ax, palette=['#3a923a', '#3274a1', '#e1812c'], order=['cc3', 'cc1', 'cc2'])" ] } ], "metadata": { "kernelspec": { "display_name": "SpaCon_clone", "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.8.18" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }