{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Pixel-based clustering\n", "\n", "In this tutorial we will focus on pixel-based clustering. This tutorial assumes, that you have already registered and\n", "pre-processed your data." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import seaborn as sns\n", "from skimage.transform import downscale_local_mean\n", "\n", "import spatiomic as so" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# read the example data\n", "img_data = so.data.read().read_tiff(\"./data/example.tif\")\n", "img_data = (downscale_local_mean(img_data, (4, 4, 1)) + 1 > 0).astype(float) * 255" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take a look at the data:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots(1, 3)\n", "\n", "for i in range(3):\n", " ax[i].imshow(img_data[:, :, i], cmap=\"gray\")\n", " ax[i].set_title(\"Channel {}\".format(i))\n", " ax[i].axis(\"off\")\n", "\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SOM training" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we create our self-organizing map. The node count should scale with the size of your dataset and the complexity of your data. It is advisable to use the `euclidean`, `cosine` or `correlation` (Pearson correlation) distance metric for biological data." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING: CuPy could not be imported\n", "WARNING: CuPy could not be imported\n", "WARNING: CuPy could not be imported\n" ] } ], "source": [ "som = so.dimension.som(\n", " node_count=(30, 30),\n", " dimension_count=img_data.shape[-1],\n", " distance_metric=\"euclidean\",\n", " use_gpu=False,\n", " seed=42,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we train our SOM on the data. Depending on the size of the data and the node count, this may take a while. To speed training up, consider training on a random subsample of your data. This can be achieved via `pp.data.subsample(data, method=\"fraction\", fraction=0.1)` or `pp.data.subsample(data, method=\"count\", count=10^9)`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "img_data_subsample = so.data.subsample().fit_transform(img_data, method=\"fraction\", fraction=0.5, seed=42)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 53%|█████▎ | 53/100 [00:00<00:00, 134.43it/s]/Users/au734063/Documents/code/spatiomic/.venv/lib/python3.12/site-packages/xpysom/xpysom.py:413: RuntimeWarning: divide by zero encountered in divide\n", " self._numerator_gpu / self._denominator_gpu,\n", "/Users/au734063/Documents/code/spatiomic/.venv/lib/python3.12/site-packages/xpysom/xpysom.py:413: RuntimeWarning: invalid value encountered in divide\n", " self._numerator_gpu / self._denominator_gpu,\n", "100%|██████████| 100/100 [00:00<00:00, 117.93it/s]\n" ] } ], "source": [ "som.fit(img_data_subsample, iteration_count=100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Graph clustering" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After our self-organising map finishes training, we can use its nodes that now represent the topography of our dataset to create a kNN graph. Finally, we perform Leiden graph clustering." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "knn_graph = so.neighbor.knn_graph().create(som, neighbor_count=100, distance_metric=\"euclidean\", use_gpu=False)\n", "clusters, modularity = so.cluster.leiden().predict(\n", " knn_graph, resolution=0.5, seed=42, use_gpu=False, iteration_count=10\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting & evaluation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have identified clusters for each SOM node, we can use our SOM class to assign the cluster label of the closest SOM node to each pixel in the original data." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "labelled_data = som.label(img_data, clusters, save_path=\"./data/example_labelled.npy\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the `plot` submodule to visualize the data:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/vg/vt1jjh256dn1g4sd6pknwxbs_qmnws/T/ipykernel_71212/2329922638.py:1: UserWarning: The glasbey color palette is part of colorcet and distributed under the Creative Commons Attribution 4.0 International Public License (CC-BY).\n", " colormap = so.plot.colormap(color_count=np.array(clusters).max() + 1, flavor=\"glasbey\")\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "colormap = so.plot.colormap(color_count=np.array(clusters).max() + 1, flavor=\"glasbey\")\n", "\n", "fig = so.plot.cluster_image(\n", " labelled_data,\n", " colormap=colormap,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also plot the locations of individual clusters:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdIAAAHBCAYAAADdIjoDAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJhZJREFUeJzt3QtwlNX5x/EHihokMUGrRNQRqMGxU9sACtRS8YKV2lFrraOtaGu13gatQitqdVSc3my9VOlF6qU62gtqUUcrgnilXmbSgtBrqAUHNUZRg8lKgMj+5zm6+S+QNdmc97x73nO+nxlHTTbvvtnNu7/3POd5zzsgn8/nBQAA9MvA/v0YAABQBCkAABYIUgAALBCkAABYIEgBALBAkAIAYIEgBQDAAkEKAIAFghRI2Jo1ayTrQvgdgLQQpAjaKaecIrfeeqvVNl544QUZM2ZMnx571113yQ9+8IN+Pc/bb78t++67r7zyyislH/Poo4/KtGnT5MADD5QJEybIaaedJn/7298S/X3/+c9/yvHHH2+1DSAmBCmQoHfeeUdcrbr5i1/8Qq655hqZPn26PPfcc/LUU0/JIYccIt/61rfkxRdfTOx52tvbZdOmTYltDwgdQYpovP7662YEp6O5Qw89VC655BJ57733zPfWr18vP/zhD+Xzn/+8GelpWL322ms9bufuu++WY445Rg444ADz2CuvvNKE55///Ge5+eab5ZlnnpEjjzyy+znPO+88mThxohx22GHyy1/+Ut5//33zvc2bN8v1119vvvfZz35Wfv/735fc95aWFpkzZ47cdNNN5vGDBg2Sqqoq+cY3viHf/OY35b///e82P7P16HTBggVmH5QG5eWXX26e96CDDpLTTz9dVq9eLa2trfLtb3/bvC46CtcS74YNG+QnP/mJCW197KxZs2TdunXdo/UpU6aY10tfj0ceeUSef/55OfbYY2XcuHEydepUmTt3rtX7BviOIEU0rr32Wtlzzz3NaO5Pf/qT/OMf/5D58+eb711xxRWyfPlyuffee+XJJ5+UnXfeWc4666xtRmZLly6VG264wWyrqalJ7rjjDrMNDY+jjjrK/IyGsZZgNTDPPvtsGTZsmNnmnXfeaYJGy7/qj3/8ozz44IMmQBctWiT/+te/Su77kiVLzL5/8pOf3OZ7F1xwQdml2Pvvv19WrFhhnldHtrvttpsJdd3X3/zmN7Ljjjua33WvvfaSn/70p2bEe88998jChQulq6tLLr300u5tadjqCcWzzz5rTlA0aPWE5a9//at5rX7961/Lv//977L2D8iSQZXeASAtO+ywg5lP1DD73Oc+Z8Jk4MCBZsSlo8nf/va3JkjU97//fRMOGjbF9ttvP3nggQdk+PDhZk5Ty6A1NTVmJLe1v//977Jq1SoTQNttt50JQg1WHZXqSPLhhx+Wr33tazJy5Ejz+O9973sm2Hqiz7XLLrsk+lq8+uqrct9995mRps7r6muxNR1p6/7ryHbXXXc1X7v44otl0qRJZp8KvvzlL8v222/fvW0d/erJyPjx480JR0/bBkJBkCIal112mZln1CC76KKLTOnxqquuMkGoI08NugINAw0OLal+/OMf7/66BoKWKjUo6urqzAhRS7T6z9Y0qDZu3GjKp8XBNGDAAPPfb775ptTX13d/b4899ii577ov+vievPvuu6bMWwiyvtDStJazdTSt8676u+trcvjhh2/xOA3Lzs5OM9Iu7Hfh9Sk0RQ0ePNi8hgW333673HjjjWbUqvv2xS9+0ZSRq6ur+7x/QJYQpIiGlhd1PnHmzJlmBKlzojq/qeVZDSENhkKwaXi88cYbW4So0lGrjlK1dFtbW2u+pqOznujoVsNWS8kFOreoo1il5dTieVh9vlJ0BK0nAvrc+++//xbf05OBjo4OMz9bTEO/uDTd1tbW/d86H6pzmieeeKL52d/97nemRKzl2GJDhw41r80f/vAHaWhoMF/T0u7LL78se++9t3l8ccDqiYNu+0c/+pF5fn3NZ8yYYcJV54qBEFFviZCGiH7gxUbn6jQ8tZFGA0JHVRp0+oGvpcmf/exn5rUpNB5p0I0dO3aLbegIS8u02uyjYasjXB0pFgJLQ0eDSX3605825dif//znpnysQaZhVbg85itf+YqZL21ubjbPqfOupWgon3nmmebnNZh1/lWf51e/+pU89thjcs4552zzMyNGjDDf023r7zVv3rzu7z3++OPyne98x3x9yJAhZkSpI0b9vfR30N9Hfz99bY477jgzT6qjU/270XnPU0891QRqTzQ4tSFLR+n6Guo29HWOUazHWmwIUo9ow8oZZ5xh5ua0s/Skk06SJ554ovv7Ojc1e/Zsq+dYu3at6aQsfNjb0u1ceOGFZn+1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eeYZefbZZ+Xkk082X1u0aFFiz9PZ2SnvvfdeYtu74IILZOedd5Ynn3xSHnnkEWlra5Mrrrgise0DScvqsVa8/w8//HDi20X/EaQeWL9+vVx99dXmDPiII46Q7bffXrbbbjs5+uijZebMmbJq1aptfmbrM+YVK1bIvvvu2/3/119/vUyaNMmcceuHxIsvvmi+fuyxx5p/H3744fLCCy/I+++/L3PnzpUpU6aYx55zzjlmlKleeeUV2X///eXKK6+UAw44QG6//fZt9ru6ulrOO+88GTx4sNTW1poPp6amJmevFRDjsVawZs0auemmm+SEE05I/LVB/xGkHli6dKls2rRJDjnkkG2+d8opp8iZZ55Z1vaee+45ue+++8yZq/73+PHjzYeHeuCBB8y/Fy9ebA7mO++8U+bPny+33nqrPP300zJy5Eg599xzJZ/Pm8fp/I6GpG5n64NXv37LLbfIrrvu2v21xx57TPbbb79+vQ6Aa1k91lRXV5cJew324mMOlUeQeuDtt982ozk9M06CbkfnKefNmycrV640I8Z77723x8fqY84++2zZe++9ZYcddpAZM2aYs3I96y7QM2vdpo4+P8rNN99sSmM6Twr4KMvH2o033igNDQ1mJA2/EKQe0LNLnVvUM+Wt5XI5U44qh5aGrr32WlNO0jPbQw89VO65554eH/vaa691l5P0n4kTJ8rmzZvl1Vdf7X7Mbrvt9pHPp2fSl1xyidx9993mrHufffYpa3+BtGT1WNPtP/roo3LppZeWtX9Ix6CUngcfYcyYMVJVVWVKQNrlV0znVPTrDz300BZfHzhw4BYfBvrhUNDS0iJ77LGH3HHHHabhYcGCBWaUqAfugAEDttjOsGHDzMFZXOp66aWXZM8995Q333yz133X59VymO6PlrgoOcFnWT3WdJ/eeOMNmTx5svn/DRs2mBDWQKYnofIYkXpAGx4uuugic7a6cOFCc9DqQalntrfddpucf/752/zMiBEjZMmSJfLOO++Y0pIeyAXLly83rfF6kOqHxtChQ81zDBkyxPxbFVryjz/+eJkzZ445K9YDU0eVxx133BYfFqXo47VUpaUyHYkSovBdVo81nXfV+V0NTf1HT161wYkQ9QMjUk9oWWinnXYyB/Nll11mDrTRo0ebA69wFlpMr3vTg/jII480P6fXxGkrv9Kv6XzNaaed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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = so.plot.cluster_location(labelled_data)\n", "fig.set_size_inches(5, 5)\n", "fig.tight_layout(pad=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can further evaluate how distributed the clusters are by calculating Moran's I." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Calculating spatial autocorrelation for each channel/cluster: 100%|██████████| 4/4 [00:00<00:00, 22.80it/s]\n" ] } ], "source": [ "df_morans_i = so.spatial.autocorrelation().predict(labelled_data, method=\"moran\", permutation_count=500)" ] }, { "cell_type": "code", "execution_count": 12, "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", "
clustermorans_imorans_i_expectedp_valuez_score
000.810741-0.0002780.00199695.179651
110.841830-0.0002780.001996102.301234
220.846760-0.0002780.00199696.882256
340.846887-0.0002780.001996102.385384
\n", "
" ], "text/plain": [ " cluster morans_i morans_i_expected p_value z_score\n", "0 0 0.810741 -0.000278 0.001996 95.179651\n", "1 1 0.841830 -0.000278 0.001996 102.301234\n", "2 2 0.846760 -0.000278 0.001996 96.882256\n", "3 4 0.846887 -0.000278 0.001996 102.385384" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_morans_i" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To evaluate the correlation of the clusters with the channels in the original image, we can use the bivariate version of Moran's I." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/au734063/Documents/code/spatiomic/.venv/lib/python3.12/site-packages/spatiomic/spatial/_bivariate_correlation.py:126: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", " df_clusters = pd.concat([df_clusters, df_correlation], ignore_index=True)\n" ] } ], "source": [ "df_bv_morans_i = so.spatial.bivariate_correlation().predict(\n", " data=labelled_data,\n", " channel_image=img_data,\n", " method=\"moran\",\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An easy way to look at this data is by using the heatmap functionality from `seaborn`." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(dpi=100, figsize=(2.5, 2.5))\n", "sns.heatmap(\n", " df_bv_morans_i.pivot(index=\"cluster\", columns=\"channel\", values=\"morans_i\"),\n", " cmap=\"coolwarm\",\n", " vmin=-1,\n", " vmax=1,\n", " annot=True,\n", " fmt=\".2f\",\n", " square=True,\n", " ax=ax,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Statistics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also get the counts for each cluster in our image." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "df_cluster_abundances = so.tool.count_clusters(\n", " file_paths=[\"./data/example_labelled.npy\"],\n", " cluster_count=labelled_data.max() + 1,\n", ")" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAroAAAGbCAYAAAAr5TMXAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIb9JREFUeJzt3QmQnGWZB/B3JjOZJECQUEs4IqeYxQgoigHCCiqgq5yCGjdqaRAEFEQgRI6g3BBO0VUEAwksIIUROdxVQRAJWhQI4lWAxRVCCGASEpEcM5neet6qTiUhmSvTc7zz+1V1zfQx/b39Tk/Pv59+vverq1QqlQQAAIWp7+0BAABALQi6AAAUSdAFAKBIgi4AAEUSdAEAKJKgCwBAkQRdAACKJOgCAFCkht4eAPSWBQsWpFmzZqVRo0alpqam3h4OANABy5YtS3PmzEl77713GjFiRJu3FXQZsCLkTpo0qbeHAQB0wSWXXJIOPvjgNm8j6DJgRSW3+oeyww479PZwAIAOeOaZZ3Khqvp/vC2CLgNWtV0hQu6YMWN6ezgAQCd0pO3QzmgAABRJ0AUAoEhaFwAAClSpVFae+pu6urpUX7/+9VhBFwCgIK2trenVV19Nr7/+er8MuVWNjY1p6623ToMHD+7yfQi6AAAFeeGFF3I1dNttt81hsT+KgD5//vw0e/bs9I53vKPL9yPoAgAUVM1dunRp2nHHHVNDQ/+OeZtuumk+uFM8pq62MdgZDQCgENVWhehx7e+qj2F92i8EXQAAiiToAgAUrrmltYhtdFb/bt4AAKBdjQ316Yvn/DK9ubSlJvc/bEhDmn7WRzt8+wcffDBdeumladmyZWmLLbZIF198cdpss826fVyCLgDAAPDm0pa0ZFltgm5nxA5mp5xySrrhhhvS6NGj89fTTjstTZs2rdu3pXUBAIAeM2vWrBxw4xTGjx+fHn744fTaa691+7YEXQAAesy8efNyu0JVHBBik002SS+//HK3b0vQBQCgx8RyYWtb/qw7Dvn7lvvs9nsEAIB12HLLLdMrr7yy8vzy5cvTwoUL8+Xdzc5oAAADwLAhDX3ivseNG5fOO++89PTTT6d3vvOd6bbbbku77rprGjFiRLePS9AFAChcc0trp5b/6uo2Yhmz9kSgveKKK9LkyZPz8mJxqN+pU6fWZEyCLgBA4Ro7EEB7cht77bVXuv3221Ot6dEFAKBIgi4AAEUSdAEAKJKgCwBAkQRdAACKJOgCAFAkQRcAgCIJugAAhau0NPfJbVx55ZXpjDPOSLXigBEAAIWra2hML1x1VGpdtqQm91/fNDRtc8K1Hb79nDlz0oUXXphmzZqVDjzwwFQrgi4AwADQumxJqiyvTdBt7eTtb7311nx0tB133DG99tprqVa0LgAA0KNOPvnkNGHChDRo0KCabkfQBQCgSIIuAABFEnQBACiSndEAAAaA+qahnd5prDP33RcJugAAhYs1bjuz/FdXtxHLmHXG8ccfn2pJ6wIAQOHqOhlA++o2OkvQBQCgSIIuAABFEnQBACiSoAsAQJEEXQAAiiToAgBQJEEXAKBwzStaithGZzlgBABA4RoHNaRj7jwtLWleWpP7H9o4JF198IUdvv0tt9ySbr755lRXV5eGDh2azjjjjLTLLrt0+7gEXQCAAWBJ89K0pKU2QbczHnvssXTNNdekmTNnphEjRqT7778/HXfccenBBx/Mwbc7aV0AAKDHbLzxxuncc8/NITdEJXf+/PlpyZIl3b4tFV0AAHrMDjvskE+htbU1XXDBBWnfffdNw4YN6/ZtCboAAPS4N954I5166qlpwYIFuZWhFrQuAADQo5577rl0xBFHpA033DDNmDEjDR8+vCbbUdEFAKDHzJ07N02YMCEdeeSR+VRLgi4AwAAwtHFIn7jvadOmpcWLF6c777wzn6qifWHkyJHdOi5BFwCgcM0rWjq1zm1XtxHr9bZnypQp+dQT9OgCABSusQMBtD9so7MEXQAAiiToAgBQJEEXAIAiCboAABRJ0AUAoEiCLgAARRJ0AQAK19rcXMQ2OqvvLXgGAEC3qm9sTI9MPCqteHNJTe5/0LChaffrru3w7WfOnJmmT5+ev99kk03S2WefnbbbbrtuH5egCwAwAKx4c0lasaQ2Qbcznn322XTZZZelu+66K2266abpxhtvTGeddVb+2t0EXQAAesz222+fHnjggdTY2JhaWlrS3Llzc1W3FgRdAAB6VITcRx99NH39619PS5YsSdOmTavJduyMBgBAj3v/+9+fHnrooTR16tR09NFHp8WLF3f7NgRdAAB6zJw5c9Lvf//7lef322+/XOGdPXt2t29L6wIAwAAwaNjQPnHfixYtSieeeGK644470uabb577devr69MO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1re+lbc/f/78tPHGG+c1fP/xj3+kH//4x/lnYyWI0047LU2dOjVXD6Nqu2TJklyJrAbpVUP1E088kSvB//rXv/KqEVFNPfTQQ9PPfvazdMUVV+TgHsupRS/yBz/4wXTcccfl626++ea8vRjHEUcckXfOiyrppZdemrbaaqu81Frc3+TJk/PYnn322Ryuv/e97+V2jzi4RszhX//617Rs2bJ0yimnrPbGISxfvjxdeeWV6fe//30+Al38fMzxv/3bv3V4Xtc11hBzc9JJJ6Vnnnkmh/4zzzwz72AYrr322ryyRjyGTTfdNF+33XbbrXM765rH8N///d95HPH72nHHHdd5H6NHj04nnnhieuCBB/LvOObo6KOPzvN6wQUXpK233jq98MILqa6uLn37299O733ve3PLzDe+8Y2Vv8/4ncXjiucAAECng2585D1t2rT0la98ZeVlt912W9p33327NJsRYCOcbLnllummm25Kf/vb39LPf/7zHGiOOeaYlbeLnuB3vvOd+SAV4fTTT0833nhjDn8RiubNm5cv+9Of/pSef/75dMstt+TDFUfIigp0NQzdf//96frrr8870E2aNCmHugiRCxcuTJ/5zGdyoIuQFgHr3HPPzcHybW97Wzr22GNzaI7gGOEtLp87d24OqBMmTFhZWT7jjDPSe97znhy2zjnnnNx+MXTo0Nwu8dvf/jbttNNOOexGUDv//PNzSIzVK+69997V5uVHP/pRDrszZ87My7hNnz493/c111zToXltb6wxhk9/+tNpjz32yNuOAPyrX/0qz3OM6dZbb807HMZ1X/va1/LvZG3amsf4Ph5/PIaNNtoo/37aEtuLNwZRdY/VPD772c/my2O95njTsNdee6Vf/OIXeazxe/yv//qvPM743cZhqGM7//M//9Oh+QEABoZOBd0ITHfeeWcOGFFxfeWVV3KwjIpbhLmqjrYxxFHVqn2bsZpDVOmampry+ahARmANEdAee+yxHPhefPHF9Ic//CHttttub7m/WAUiKrg/+clP8u2ilzgqjWH27Nm5shinqBxG2Ivl0qqi8hlV1l133TWdddZZ6bDDDssV1whrEbwjsEagi4pzVBejGhoVzAiVYeTIkTnkhpibCKoR8EIE+Wp7RVSe47GF2FasTRxHnFvVfffdl0Nk9fKo6la30xHtjfUd73hHDrkhgmJU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7LDDcqU3enSjIh5FhqjktjV/lUolfz8Q57b8Rwhr2HLLLfMOKFXLly/P73bjcjrm8ccfT7/4xS9WuyxeSJubm1eb2/i+Oq8Rite8btWKD+0/V+P7DTbYIH+kubbrzHXHPfDAA+mhhx5a7fkb//Qj9LY1f+b2rZ577rncfhA7Sc6YMSMNHz68y89P89v+3N59993pT3/602rP3XjetjV/m266aWpqasqfxq15XekEXQaccePG5f68p59+Op+Pj3523XXXlX1QtC/eHERFofqieeONN+aP2WIP35///Odp8eLF+aO2H//4x+mAAw7It9l///3TT3/60/yz8RHazJkzV17H2sWe1RHIqv+4brrppryXdASymE9z3XULFizIHwVHtSzEyhYxt9HK1Nb8xXXR8xtzHi0kEToG8txGr360hXzqU59KU6dOzWEqdPX5aX7bn9vnn38+XX755Xn+ovc2VreIXty25m/QoEH59SRWcAhRHY7VhwbCqguWF2PAiUB7xRVXpMmTJ+flxeKdbryI0HFjx45Nxx13XN4ZIpapiUrNd77znVxNePbZZ/OOJ/ECvNtuu6Vjjz02/8ynP/3pNGfOnPyxW1R+4wU2dkhh3Xbcccd06qmn5taQmLPttttuZS9efPT+zDPPmOsuirmJZZYiREQoiJ1TzznnnHbnL5bBiiXeYieguC7mf88990wDVYSsCLPRqx+nqnjjEHPW2een+W1/bqM3N3YIPuSQQ/LcxvyceOKJ7c7flClT0llnnZUOPPDA/HPf/OY307bbbptKVxdLL/T2IAAAoLtpXQAAoEiCLgAARRJ0AQAokqALAECRBF0AAIok6AIAUCRBFwCAIgm6AAAUSdAFAKBIgi4AAEUSdAEASCX6f0DJHeq50UzJAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_cluster_abundances.plot.barh()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": ".venv", "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.12.6" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }