{ "cells": [ { "cell_type": "markdown", "id": "483deb11", "metadata": {}, "source": [ "# Generalized Procrustes analysis from TPS file" ] }, { "cell_type": "code", "execution_count": null, "id": "84c4ea18", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "from sklearn.decomposition import PCA\n", "\n", "from ktch.landmark import GeneralizedProcrustesAnalysis\n", "from ktch.io import read_tps" ] }, { "cell_type": "markdown", "id": "5a1f6b73", "metadata": {}, "source": [ "## Reading TPS file" ] }, { "cell_type": "code", "execution_count": null, "id": "76afaddf", "metadata": {}, "outputs": [], "source": [ "df_triangles = read_tps(\"./landmarks_triangle.tps\", as_frame=True)\n", "df_triangles" ] }, { "cell_type": "code", "execution_count": null, "id": "d981b2cc", "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "sns.scatterplot(\n", " data = df_triangles,\n", " x=\"x\",y=\"y\", \n", " hue=\"specimen_id\", style=\"coord_id\",ax=ax\n", " )\n", "ax.set_aspect('equal')\n", "ax.legend(loc=\"upper left\", bbox_to_anchor=(1, 1))" ] }, { "cell_type": "markdown", "id": "51ead748", "metadata": {}, "source": [ "## GPA" ] }, { "cell_type": "code", "execution_count": null, "id": "fcbaadc7", "metadata": {}, "outputs": [], "source": [ "gpa = GeneralizedProcrustesAnalysis().set_output(transform=\"pandas\")" ] }, { "cell_type": "code", "execution_count": null, "id": "7f8bda8c", "metadata": {}, "outputs": [], "source": [ "df_coords = df_triangles.unstack().swaplevel(1, 0, axis=1).sort_index(axis=1)\n", "df_coords.columns = [dim +\"_\"+ str(landmark_idx) for landmark_idx,dim in df_coords.columns]\n", "df_coords\n", "\n", "df_shapes = gpa.fit_transform(df_coords)\n", "df_shapes" ] }, { "cell_type": "code", "execution_count": null, "id": "8c0f907e", "metadata": {}, "outputs": [], "source": [ "df_shapes_vis = df_shapes.copy()\n", "df_shapes_vis.columns = pd.MultiIndex.from_tuples([[int(landmark_idx), dim] for dim, landmark_idx in [idx.split(\"_\") for idx in df_shapes_vis.columns]], names=[\"coord_id\",\"dim\"])\n", "df_shapes_vis.sort_index(axis=1, inplace=True)\n", "df_shapes_vis = df_shapes_vis.swaplevel(0,1,axis=1).stack(level=1)\n", "df_shapes_vis" ] }, { "cell_type": "code", "execution_count": null, "id": "5d042f63", "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "sns.scatterplot(\n", " data = df_shapes_vis,\n", " x=\"x\",y=\"y\", \n", " hue=\"specimen_id\", style=\"coord_id\",ax=ax\n", " )\n", "ax.set_aspect('equal')\n", "ax.legend(loc=\"upper left\", bbox_to_anchor=(1, 1))" ] }, { "cell_type": "code", "execution_count": null, "id": "4d01a7d8", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 5 }