798 lines
387 KiB
Text
798 lines
387 KiB
Text
|
|
{
|
||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 4,
|
||
|
|
"id": "d523fe6f-ca8e-4a3b-94b1-832704ace7f7",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"import ethoscopy as etho\n",
|
||
|
|
"import pandas as pd\n",
|
||
|
|
"from scipy.stats import mannwhitneyu\n",
|
||
|
|
"import matplotlib.pyplot as plt\n",
|
||
|
|
"import numpy as np\n",
|
||
|
|
"import seaborn as sns\n",
|
||
|
|
"from scipy.stats import wilcoxon, shapiro, ttest_rel\n",
|
||
|
|
"df = pd.read_pickle('/home/rdingjin/Gal4_2026-05-17/phase5.pkl')"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 5,
|
||
|
|
"id": "7f242b06-500e-40a9-a557-f1155e891c3e",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"df = df.baseline(column = 'baseline')"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 6,
|
||
|
|
"id": "3de9d377-3ad7-4f41-b62a-f8338179f383",
|
||
|
|
"metadata": {
|
||
|
|
"scrolled": true
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"\n",
|
||
|
|
" ==== METADATA ====\n",
|
||
|
|
"\n",
|
||
|
|
" date machine_name region_id \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|01 2026-05-17 ETHOSCOPE_130 1 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|02 2026-05-17 ETHOSCOPE_130 2 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|03 2026-05-17 ETHOSCOPE_130 3 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|04 2026-05-17 ETHOSCOPE_130 4 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|05 2026-05-17 ETHOSCOPE_130 5 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|06 2026-05-17 ETHOSCOPE_130 6 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|07 2026-05-17 ETHOSCOPE_130 7 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|08 2026-05-17 ETHOSCOPE_130 8 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|09 2026-05-17 ETHOSCOPE_130 9 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|10 2026-05-17 ETHOSCOPE_130 10 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|11 2026-05-17 ETHOSCOPE_130 11 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|12 2026-05-17 ETHOSCOPE_130 12 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|13 2026-05-17 ETHOSCOPE_130 13 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|14 2026-05-17 ETHOSCOPE_130 14 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|15 2026-05-17 ETHOSCOPE_130 15 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|16 2026-05-17 ETHOSCOPE_130 16 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|17 2026-05-17 ETHOSCOPE_130 17 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|18 2026-05-17 ETHOSCOPE_130 18 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|19 2026-05-17 ETHOSCOPE_130 19 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 2026-05-17 ETHOSCOPE_130 20 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 2026-05-17 ETHOSCOPE_302 1 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|02 2026-05-17 ETHOSCOPE_302 2 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|03 2026-05-17 ETHOSCOPE_302 3 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|04 2026-05-17 ETHOSCOPE_302 4 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|05 2026-05-17 ETHOSCOPE_302 5 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|06 2026-05-17 ETHOSCOPE_302 6 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|07 2026-05-17 ETHOSCOPE_302 7 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|08 2026-05-17 ETHOSCOPE_302 8 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|09 2026-05-17 ETHOSCOPE_302 9 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|10 2026-05-17 ETHOSCOPE_302 10 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|11 2026-05-17 ETHOSCOPE_302 11 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|12 2026-05-17 ETHOSCOPE_302 12 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|13 2026-05-17 ETHOSCOPE_302 13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|14 2026-05-17 ETHOSCOPE_302 14 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|15 2026-05-17 ETHOSCOPE_302 15 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|16 2026-05-17 ETHOSCOPE_302 16 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|17 2026-05-17 ETHOSCOPE_302 17 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|18 2026-05-17 ETHOSCOPE_302 18 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|19 2026-05-17 ETHOSCOPE_302 19 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|20 2026-05-17 ETHOSCOPE_302 20 \n",
|
||
|
|
"\n",
|
||
|
|
" sleep_deprived species food \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|01 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|02 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|03 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|04 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|05 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|06 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|07 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|08 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|09 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|10 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|11 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|12 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|13 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|14 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|15 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|16 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|17 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|18 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|19 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|02 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|03 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|04 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|05 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|06 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|07 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|08 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|09 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|10 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|11 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|12 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|13 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|14 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|15 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|16 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|17 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|18 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|19 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|20 True 11H05_Gal4 normal_food \n",
|
||
|
|
"\n",
|
||
|
|
" baseline sex time \n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|01 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|02 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|03 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|04 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|05 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|06 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|07 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|08 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|09 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|10 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|11 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|12 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|13 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|14 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|15 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|16 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|17 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|18 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|19 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|02 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|03 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|04 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|05 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|06 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|07 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|08 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|09 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|10 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|11 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|12 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|13 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|14 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|15 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|16 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|17 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|18 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|19 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|20 0 male 11-26-13 \n",
|
||
|
|
" ====== DATA ======\n",
|
||
|
|
"\n",
|
||
|
|
" t x y w \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 8770 277.625000 41.375000 37.875000 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 8780 366.000000 47.925926 33.333333 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 8790 366.848485 33.727273 35.303030 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 8800 369.000000 31.000000 34.000000 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 8810 332.333333 46.787879 25.090909 \n",
|
||
|
|
"... ... ... ... ... \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 518160 350.625000 20.000000 29.312500 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 518170 350.625000 19.875000 29.312500 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 518180 350.588235 19.882353 29.235294 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 518190 350.411765 19.882353 29.117647 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 518200 350.500000 20.000000 29.500000 \n",
|
||
|
|
"\n",
|
||
|
|
" h phi max_velocity \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 14.250000 70.125000 122.427433 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 13.555556 123.407407 8.767560 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 15.818182 30.757576 7.796124 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 15.000000 11.000000 2.991429 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 10.060606 10.393939 12.760825 \n",
|
||
|
|
"... ... ... ... \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 11.312500 12.125000 0.722568 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 11.625000 13.000000 0.862738 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 11.235294 0.000000 0.776030 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 11.058824 10.352941 0.699647 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 12.000000 0.000000 0.680579 \n",
|
||
|
|
"\n",
|
||
|
|
" mean_velocity dist has_interacted \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 24.095140 0.578283 0.0 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 3.064496 0.248224 0.0 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 3.442244 0.340782 0.0 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 2.991429 0.367946 0.0 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 3.324311 0.329107 0.0 \n",
|
||
|
|
"... ... ... ... \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.649101 0.031157 0.0 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.682539 0.032762 0.0 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.658967 0.033607 0.0 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.647799 0.033038 0.0 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.675138 0.004051 0.0 \n",
|
||
|
|
"\n",
|
||
|
|
" beam_cross moving micro walk \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0.0 True False True \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0.0 True False True \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0.0 True False True \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0.0 True False True \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0.0 True False True \n",
|
||
|
|
"... ... ... ... ... \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.0 False False False \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.0 False False False \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.0 False False False \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.0 False False False \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.0 False False False \n",
|
||
|
|
"\n",
|
||
|
|
" is_interpolated asleep \n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 False False \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 False False \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 False False \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 False False \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 False False \n",
|
||
|
|
"... ... ... \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 False True \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 False True \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 False True \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 False True \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 False True \n",
|
||
|
|
"\n",
|
||
|
|
"[2002709 rows x 16 columns]\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"#display metadata\n",
|
||
|
|
"df.display()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 8,
|
||
|
|
"id": "f29bb098-e4a8-4d98-baaa-eae45c3174dd",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"dead_flies = ['2026-05-17_11-29-42_13005e|03','2026-05-17_11-26-13_30232c|10','2026-05-17_11-26-13_30232c|20' ]"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 9,
|
||
|
|
"id": "d9bbb35f-e126-4afc-9c25-5f099fa8e979",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stderr",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"/srv/venv/lib/python3.12/site-packages/ethoscopy/behavpy_core.py:1611: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
|
||
|
|
" tdf.groupby(\"id\", group_keys=False).apply(\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA74AAADXCAYAAAA9bY0OAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA3XRJREFUeJzsnXdYVMf+hz+7IE0QpCkoggIGFUKLAmLHYL9iLBFNItFgiCX2a42aot5oLoJGxRtFIFGxgZioGERRRAUbKkJQQLAgSpEOK2V/f4w7s8vuUpR49f7mfZ59HGcPp8yZM2fPmZnvKxCLxWJwOBwOh8PhcDgcDofzP4rwv70DHA6Hw+FwOBwOh8Ph/J3wB18Oh8PhcDgcDofD4fxPwx98ORwOh8PhcDgcDofzPw1/8OVwOBwOh8PhcDgczv80/MGXw+FwOBwOh8PhcDj/0/AHXw6Hw+FwOBwOh8Ph/E/DH3w5HA6Hw+FwOBwOh/M/DX/w5XA4HA6Hw+FwOBzO/zT8wZfD4XA4HA6Hw+FwOP/T8AdfDofD4XA4HA6Hw+H8T8MffDkcDofD4XA4HA6H80Y4f/48xowZA1NTUwgEAhw9erTJv4mLi4OTkxPU1dVhZWWFkJCQFm+XP/hyOBwOh8PhcDgcDueNUFFRAXt7e2zbtq1Zy9+/fx+jRo3C4MGDkZycjPnz5+OLL77AqVOnWrRdgVgsFr/KDnM4nJYTFxcHHx8fZGdn/7d3hcPhcDgcDofD+a8iEAgQGRkJLy8vpcssXboUx48fR0pKCs2bPHkyiouLER0d3exttajHd8OGDejduzd0dHRgbGwMLy8vpKenyyxTXV2N2bNnw8DAANra2hg/fjyePn1Kv7958ya8vb1hZmYGTU1N9OjRA4GBgXLbEolEWLlyJczNzaGurg4LCwsEBwc3uY/btm2DhYUFNDQ04OLigqSkJJnvBw0aBIFAIPPx8/NrdJ3V1dXw8fGBnZ0dVFVVFZ4YHx8fufUKBAL06tWryX0GmtflHxERAU9PTxgYGEAgECA5ObnJ9WZnZ2PGjBno2rUrNDU1YWlpiTVr1uDFixcyyx08eBAODg7Q0tKCubk5Nm3a1Kz9lhAeHg6BQCBTNjU1NVi6dCns7OzQtm1bmJqa4rPPPkNubm6z17tu3Tr07dsXWlpa0NPTk/u+sLAQw4cPh6mpKdTV1WFmZoY5c+agtLRUZrnmDI/4O+pOUzT3/Ny6dQv9+/eHhoYGzMzMsHHjxtfaLofD4XA4HA6H01qIRCKUlpbKfEQiUaus+9KlSxg6dKhM3rBhw3Dp0qUWrUe1JQufO3cOs2fPRu/evVFbW4sVK1bA09MTqampaNu2LQBgwYIFOH78OA4dOgRdXV3MmTMHH330ERISEgAA165dg7GxMX777TeYmZnh4sWLmDlzJlRUVDBnzhy6rUmTJuHp06fYvXs3rKys8OTJE9TX1ze6fwcOHMDChQsRFBQEFxcXBAQEYNiwYUhPT4exsTFdztfXF9999x39v5aWVqPrraurg6amJr7++mscOXJE4TKBgYH417/+Rf9fW1sLe3t7TJw4sdF1S5B0+U+fPh0fffSR0mX69euHSZMmwdfXt1nr/euvv1BfX4+dO3fCysoKKSkp8PX1RUVFBX766ScAwMmTJzF16lRs3boVnp6eSEtLg6+vLzQ1NWXOiTKys7OxePFi9O/fXya/srIS169fxzfffAN7e3s8f/4c8+bNwz/+8Q9cvXq1Wfv/4sULTJw4EW5ubti9e7fc90KhEGPHjsUPP/wAIyMjZGRkYPbs2SgqKsK+ffsAsOERfn5+2Lt3L2JjY/HFF1/AxMQEw4YNA/D31Z2maM75KS0thaenJ4YOHYqgoCDcvn0b06dPh56eHmbOnNnsbX0oZHWx5DM3AIBuGGswVHp1p+kTMYcAAJdFtTQvVdSJpn3aPQEA9Lk+meZ9a3MMAPBN2li20ZP6NFlsWwcA0OxQQfO66D+n6frBjwEAL4b3pnlq0VcaPaaHa/rS9KZP9wAABmoU0zwtoRoAILJCl+ZF5DvT9FyT0+Q41Nk7wFXPHNg+12gCALZ3SqR57rfY9elo+AgAcOVpF3YckUYAAJsZqTQvId2Kpqc7kbbwg7ZZbD8Sp9C0sT55aWOqzV7ePNzJ/r54DCk/4R1tmrfYOwIAEFvUg+YlZVvQdF0VaerX92ft1/r/sHMndi8h2xx3B81FtZMpAOD3K8dp3sFyA5pecXEcAODAwJ00b8qhuWyfDGvINk+y21DbQ5ebvX3JuTfom0fzCsvIfWhKd8Xty6knpHxWW/1O804U29P0SL2bAIB+GqyOOl+aQdMJrv8BAESWd6V509uRF7vuC75ky21mxzzQj7TVGsdkX6Q1hv0NVh//OOoKAEj9cgfNGzHKGwBQ/q9qmlfxQo2mhQIykKurXhHNG6B/l6bn6j0AANjs/ormpc5gw80GzSYv9BZu3EvzkiosyXEIa2jegXtONJ3sGgoA6JfM6pWpDqvDY4xJ2R6eMJDm5W0Q0LTRmL/QUh4vI3Xg1Gz2InCk/z9p2n3KdQCAupC1Y90082naVTMTAPD5zq9pXoUlO74/PQMAAF5X2bm940bK5Mcidk0ez7Wl6YHGGQCAJAcVhftseLE9AGBFpxM072GtHk3POvE5AMB/+G80b2E8KdMeKx/RvNonrN43F9Uundl/NDXYutIzlP6NuL8jTQvib7R4m38HVX+y6+99ffYi/Xw4adurnCtpXjfvZJrO2kTue4JaVu+6Lr8ot361OBOaflFPzuOzSNbGl7tV0bR6CrlH2I9Oo3npoawdrn1ZzCpSv/1H+sXT9B/B5HfTCx32vdbLvqKOn9yneXefst8hI61IOx2VxO5lYhU2eHPQ++RamtXhDM37+Dyrw1c8tgIAPrwxneZVJ5F7dfD0rTTPVZ21zbY/k7Zi+bQDNK+yXp2m93z3DwCA+vM6mpczil0DbR+QNq3aiO2nySX2m/6FNvle5wErKOG562iMRyvJ9Z88i+3z8LRxNH3QJhwAsKOIldMqQ9bOxFWTerAggHVgHFxEOn20hGw/p5v1o+k/Hl8DAByrbE/z7ovYudm3wxMAkLAigOZtKnSg6QHaZPtXK7vRvJDfyN+0H8yu6YQPf8TbSn1ed6XfbQiagm+//VYmb82aNVi7du1rbzcvLw8dOnSQyevQoQNKS0tRVVUFTU3NZq2nRQ++DbuSQ0JCYGxsjGvXrmHAgAEoKSnB7t27sW/fPgwZMgQAsGfPHvTo0QOXL1+Gq6srpk+fLrOObt264dKlS4iIiKAPWdHR0Th37hyysrKgr08uRgsLiyb3z9/fH76+vvj8c3LjCAoKwvHjxxEcHIxly5bR5bS0tNCxY8dmH3fbtm2xYwf50ZGQkIDi4mK5ZXR1daGry35cHz16FM+fP6f70hQjRozAiBEjGl3m008/BYAWDZMdPnw4hg8fTv/frVs3pKenY8eOHfTB6tdff4WXlxftvezWrRuWL1+OH3/8EbNnz4ZAIFC4boC8FJg6dSq+/fZbxMfHy5SNrq4uYmJiZJb/+eef0adPHzx48ABdunRBU0guIGUT2Nu3b4+vvmI/3szNzTFr1iyZHuugoCB07doV//73vwEAPXr0wIULF7B582b64NtadSclJQVLlixBfHw82rZtC09PT2zevBmGhoYKl2/O+dm7dy9evHiB4OBgqKmpoVevXkhOToa/v3+LHnw5HA6Hw+FwOJxXpR7KOyGXL1+OhQsXyuSpq6srWfq/w2sFtyopIb0EkofTa9euoaamRqYr2sbGBl26dGm0K7qkpISuAwCOHTuGDz74ABs3bkSnTp3QvXt3LF68GFVVVUrX8eLFC1y7dk1m20KhEEOHDpXb9t69e2FoaAhbW1ssX74clZWVDVf32uzevRtDhw6Fubl5q6/7dWlY3iKRCBoaGjLLaGpq4tGjR8jJyWl0Xd999x2MjY0xY8aMRpeT3rZAIFA4bLk1yM3NRUREBAYOZL0KTQ2PaK26U1xcjCFDhsDR0RFXr15FdHQ0nj59ikmTJrXoGBqen0uXLmH
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 1000x190 with 2 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"start_hour = 0\n",
|
||
|
|
"end_hour = 120\n",
|
||
|
|
"fig = df.remove('id', *dead_flies).t_filter(start_time=start_hour, end_time=end_hour).xmv('machine_name', 'ETHOSCOPE_130').heatmap(variable = 'asleep')\n",
|
||
|
|
"fig.show()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 25,
|
||
|
|
"id": "0b3ffab2-d453-4425-a13e-e9abbf3f872b",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 1266.67x483.333 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"start_hour = 0\n",
|
||
|
|
"end_hour = 120\n",
|
||
|
|
"\n",
|
||
|
|
"# Generate plot from Ethoscopy\n",
|
||
|
|
"fig = df.remove('id', *dead_flies).t_filter(start_time=start_hour, end_time=end_hour).xmv('machine_name', 'ETHOSCOPE_130').plot_overtime(variable='asleep', avg_window=30, grids=True)\n",
|
||
|
|
"\n",
|
||
|
|
"# Extract the main axis from the figure\n",
|
||
|
|
"ax = fig.axes[0]\n",
|
||
|
|
"\n",
|
||
|
|
"# Add shading stimulus shading\n",
|
||
|
|
"# Draw a vertical span from ZT 48 to ZT 72\n",
|
||
|
|
"ax.axvspan(72, 96, color='#ff4c4c', alpha=0.3, zorder=1)\n",
|
||
|
|
"\n",
|
||
|
|
"# Set custom labels\n",
|
||
|
|
"ax.set_xlabel(\"Zeitgeber Time (Hours)\", fontsize=12)\n",
|
||
|
|
"ax.set_ylabel(\"Fraction of Time Asleep\", fontsize=12)\n",
|
||
|
|
"\n",
|
||
|
|
"# Show plot\n",
|
||
|
|
"fig.show()\n",
|
||
|
|
"\n",
|
||
|
|
"# Save as a high-resolution PNG\n",
|
||
|
|
"plt.savefig(\"60D05_plot.png\", dpi=600, bbox_inches='tight')"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 11,
|
||
|
|
"id": "7f4311b7-83f0-4e0d-b675-8a59d4daf17c",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"--- Individual Fly Sleep (Baseline: 0h to 72h, Averaged per day) ---\n",
|
||
|
|
" Fly_Label Base_Sleep_24h Base_Day_12h Base_Night_12h\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 01 8.227778 4.070967 4.438889\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 02 14.323148 5.709405 9.011111\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 04 14.232407 5.266545 9.332407\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 05 13.747222 5.116271 8.987037\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 06 5.305556 1.126368 4.257407\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 07 13.333333 4.039131 9.574074\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 08 15.550926 5.728403 10.219444\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 09 16.981481 7.141104 10.335185\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 10 13.337963 5.388161 8.323148\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 11 10.094444 3.410380 6.920370\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 12 10.923148 3.923727 7.271296\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 13 13.678704 4.956392 9.065741\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 14 14.388889 6.815785 8.045370\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 15 15.353704 6.004974 9.764815\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 16 16.628704 7.177710 9.950000\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 17 5.344444 2.644338 2.883333\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 18 13.358333 5.662687 8.088889\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 19 9.916667 3.738929 6.437963\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 20 13.319444 5.744321 7.973148\n",
|
||
|
|
"... (Showing first 20 rows)\n",
|
||
|
|
"\n",
|
||
|
|
"--- Grand Summary Statistics (Baseline: 0h to 72h) ---\n",
|
||
|
|
"Total Flies Analyzed: n = 19\n",
|
||
|
|
"\n",
|
||
|
|
"[ OVERALL SLEEP (Scaled to 24h Baseline Average) ]\n",
|
||
|
|
"Mean ± SEM: 12.53 ± 0.78 hours\n",
|
||
|
|
"Median: 13.36 hours\n",
|
||
|
|
"\n",
|
||
|
|
"[ DAY TIME (ZT 0-12, Averaged to 12h blocks) ]\n",
|
||
|
|
"Mean ± SEM: 4.93 ± 0.36 hours\n",
|
||
|
|
"Median: 5.27 hours\n",
|
||
|
|
"\n",
|
||
|
|
"[ NIGHT TIME (ZT 12-24, Averaged to 12h blocks) ]\n",
|
||
|
|
"Mean ± SEM: 7.94 ± 0.49 hours\n",
|
||
|
|
"Median: 8.32 hours\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"# BASELINE\n",
|
||
|
|
"\n",
|
||
|
|
"# Define baseline time period\n",
|
||
|
|
"start_hour = 0\n",
|
||
|
|
"end_hour = 72\n",
|
||
|
|
"\n",
|
||
|
|
"# Filter the dataset to ONLY include data within specific baseline window\n",
|
||
|
|
"base_df = df.t_filter(start_time=start_hour, end_time=end_hour).xmv('machine_name', 'ETHOSCOPE_130').copy()\n",
|
||
|
|
"\n",
|
||
|
|
"# Exclude dead flies\n",
|
||
|
|
"base_df = base_df[~base_df.index.get_level_values('id').isin(dead_flies)]\n",
|
||
|
|
"\n",
|
||
|
|
"# Calculate Overall 24h Baseline Average\n",
|
||
|
|
"sleep_hours = (base_df.groupby('id')['asleep'].sum() * 10) / 3600\n",
|
||
|
|
"\n",
|
||
|
|
"# (72 - 0) / 24 evaluates to exactly 3 days. \n",
|
||
|
|
"# Dividing total sleep by 3 to average the 72 hours into a single 24-hour metric\n",
|
||
|
|
"days_tracked = (end_hour - start_hour) / 24 \n",
|
||
|
|
"base_overall = (sleep_hours / days_tracked).reset_index(name='Base_Sleep_24h')\n",
|
||
|
|
"\n",
|
||
|
|
"# Calculate Day/Night 12h Baseline Averages\n",
|
||
|
|
"base_df['zt_hour'] = (base_df['t'] / 3600) % 24\n",
|
||
|
|
"base_df['Phase'] = np.where(base_df['zt_hour'] < 12, 'Day', 'Night')\n",
|
||
|
|
"\n",
|
||
|
|
"base_phase = base_df.groupby(['id', 'Phase']).agg(\n",
|
||
|
|
" total_sleep_epochs=('asleep', 'sum'),\n",
|
||
|
|
" total_tracking_epochs=('t', 'count')\n",
|
||
|
|
").reset_index()\n",
|
||
|
|
"\n",
|
||
|
|
"# Tracking_Hours will be ~24 for Day and ~24 for Night \n",
|
||
|
|
"# Dividing sleep by tracking hours and multiplying by 12 averages it to a single 12h block.\n",
|
||
|
|
"base_phase['Sleep_Hours'] = (base_phase['total_sleep_epochs'] * 10) / 3600\n",
|
||
|
|
"base_phase['Tracking_Hours'] = (base_phase['total_tracking_epochs'] * 10) / 3600\n",
|
||
|
|
"base_phase['Base_Sleep_12h'] = (base_phase['Sleep_Hours'] / base_phase['Tracking_Hours']) * 12\n",
|
||
|
|
"\n",
|
||
|
|
"base_pivot = base_phase.pivot(index='id', columns='Phase', values='Base_Sleep_12h').reset_index()\n",
|
||
|
|
"# Rename columns\n",
|
||
|
|
"base_pivot.columns = ['id', 'Base_Day_12h', 'Base_Night_12h']\n",
|
||
|
|
"\n",
|
||
|
|
"# Merge and clean up data\n",
|
||
|
|
"merged_df = pd.merge(base_overall, base_pivot, on='id')\n",
|
||
|
|
"\n",
|
||
|
|
"merged_df['Machine'] = merged_df['id'].map(df.meta['machine_name'])\n",
|
||
|
|
"merged_df['Tube'] = merged_df['id'].apply(lambda x: str(x).split('|')[-1])\n",
|
||
|
|
"merged_df['Fly_Label'] = merged_df['Machine'] + \" - Fly \" + merged_df['Tube']\n",
|
||
|
|
"\n",
|
||
|
|
"clean_table = merged_df.dropna(subset=['Machine']).sort_values(by=['Machine', 'Tube'])\n",
|
||
|
|
"baseline_stats = clean_table[['Fly_Label', 'Base_Sleep_24h', 'Base_Day_12h', 'Base_Night_12h']]\n",
|
||
|
|
"\n",
|
||
|
|
"# PRINT RESULTS\n",
|
||
|
|
"print(f\"--- Individual Fly Sleep (Baseline: {start_hour}h to {end_hour}h, Averaged per day) ---\")\n",
|
||
|
|
"print(baseline_stats.head(20).to_string(index=False)) \n",
|
||
|
|
"print(\"... (Showing first 20 rows)\\n\")\n",
|
||
|
|
"\n",
|
||
|
|
"print(f\"--- Grand Summary Statistics (Baseline: {start_hour}h to {end_hour}h) ---\")\n",
|
||
|
|
"print(f\"Total Flies Analyzed: n = {len(baseline_stats)}\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 1. OVERALL 24H STATS\n",
|
||
|
|
"print(\"\\n[ OVERALL SLEEP (Scaled to 24h Baseline Average) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {baseline_stats['Base_Sleep_24h'].mean():.2f} ± {baseline_stats['Base_Sleep_24h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {baseline_stats['Base_Sleep_24h'].median():.2f} hours\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 2. DAY TIME STATS\n",
|
||
|
|
"print(f\"\\n[ DAY TIME (ZT 0-12, Averaged to 12h blocks) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {baseline_stats['Base_Day_12h'].mean():.2f} ± {baseline_stats['Base_Day_12h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {baseline_stats['Base_Day_12h'].median():.2f} hours\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 3. NIGHT TIME STATS\n",
|
||
|
|
"print(f\"\\n[ NIGHT TIME (ZT 12-24, Averaged to 12h blocks) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {baseline_stats['Base_Night_12h'].mean():.2f} ± {baseline_stats['Base_Night_12h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {baseline_stats['Base_Night_12h'].median():.2f} hours\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 12,
|
||
|
|
"id": "0119fcf6-de9b-46c9-a8a2-afbf512f7b8a",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"--- Individual Fly Sleep (Stimulus: 72h to 96h) ---\n",
|
||
|
|
" Fly_Label Stim_Sleep_24h Stim_Day_12h Stim_Night_12h\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 01 4.436111 1.966667 2.469444\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 02 4.436111 2.011111 2.425000\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 04 11.913889 3.213889 8.700000\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 05 6.136111 2.425000 3.711111\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 06 1.408333 0.536111 0.872222\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 07 6.363889 2.466667 3.897222\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 08 7.444444 6.069444 1.375000\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 09 14.205556 7.161111 7.044444\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 10 7.286111 4.919444 2.366667\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 11 6.913889 2.719444 4.194444\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 12 3.169444 0.877778 2.291667\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 13 7.330556 2.655556 4.675000\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 14 6.347222 5.269444 1.077778\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 15 11.594444 5.947222 5.647222\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 16 3.736111 1.530556 2.205556\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 17 3.311111 2.358333 0.952778\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 18 3.905556 3.591667 0.313889\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 19 7.533333 2.641667 4.891667\n",
|
||
|
|
"ETHOSCOPE_130 - Fly 20 5.500000 0.222222 5.277778\n",
|
||
|
|
"... (Showing first 20 rows)\n",
|
||
|
|
"\n",
|
||
|
|
"--- Grand Summary Statistics (Stimulus: 72h to 96h) ---\n",
|
||
|
|
"Total Flies Analyzed: n = 19\n",
|
||
|
|
"\n",
|
||
|
|
"[ OVERALL SLEEP (24h Stimulus Block) ]\n",
|
||
|
|
"Mean ± SEM: 6.47 ± 0.74 hours\n",
|
||
|
|
"Median: 6.35 hours\n",
|
||
|
|
"\n",
|
||
|
|
"[ DAY TIME (ZT 0-12 during Stimulus) ]\n",
|
||
|
|
"Mean ± SEM: 3.08 ± 0.45 hours\n",
|
||
|
|
"Median: 2.64 hours\n",
|
||
|
|
"\n",
|
||
|
|
"[ NIGHT TIME (ZT 12-24 during Stimulus) ]\n",
|
||
|
|
"Mean ± SEM: 3.39 ± 0.52 hours\n",
|
||
|
|
"Median: 2.47 hours\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"# Define stimulus time period\n",
|
||
|
|
"start_hour = 72\n",
|
||
|
|
"end_hour = 96\n",
|
||
|
|
"\n",
|
||
|
|
"# Filter the dataset to ONLY include data within specific stimulus window\n",
|
||
|
|
"stim_df = df.t_filter(start_time=start_hour, end_time=end_hour).xmv('machine_name', 'ETHOSCOPE_130').copy()\n",
|
||
|
|
"\n",
|
||
|
|
"# Exclude dead flies\n",
|
||
|
|
"stim_df = stim_df[~stim_df.index.get_level_values('id').isin(dead_flies)]\n",
|
||
|
|
"\n",
|
||
|
|
"# Calculate Overall 24h Stimulus Average\n",
|
||
|
|
"sleep_hours = (stim_df.groupby('id')['asleep'].sum() * 10) / 3600\n",
|
||
|
|
"days_tracked = (end_hour - start_hour) / 24 \n",
|
||
|
|
"stim_overall = (sleep_hours / days_tracked).reset_index(name='Stim_Sleep_24h')\n",
|
||
|
|
"\n",
|
||
|
|
"# Calculate Day/Night 12h Stimulus Averages\n",
|
||
|
|
"stim_df['zt_hour'] = (stim_df['t'] / 3600) % 24\n",
|
||
|
|
"stim_df['Phase'] = np.where(stim_df['zt_hour'] < 12, 'Day', 'Night')\n",
|
||
|
|
"\n",
|
||
|
|
"stim_phase = stim_df.groupby(['id', 'Phase']).agg(\n",
|
||
|
|
" total_sleep_epochs=('asleep', 'sum'),\n",
|
||
|
|
" total_tracking_epochs=('t', 'count')\n",
|
||
|
|
").reset_index()\n",
|
||
|
|
"\n",
|
||
|
|
"# Tracking_Hours will now be ~12 for Day and ~12 for Night\n",
|
||
|
|
"# Dividing sleep by tracking hours and multiplying by 12 averages it to a single 12h block.\n",
|
||
|
|
"stim_phase['Sleep_Hours'] = (stim_phase['total_sleep_epochs'] * 10) / 3600\n",
|
||
|
|
"stim_phase['Tracking_Hours'] = (stim_phase['total_tracking_epochs'] * 10) / 3600\n",
|
||
|
|
"stim_phase['Stim_Sleep_12h'] = (stim_phase['Sleep_Hours'] / stim_phase['Tracking_Hours']) * 12\n",
|
||
|
|
"\n",
|
||
|
|
"stim_pivot = stim_phase.pivot(index='id', columns='Phase', values='Stim_Sleep_12h').reset_index()\n",
|
||
|
|
"# Rename columns \n",
|
||
|
|
"stim_pivot.columns = ['id', 'Stim_Day_12h', 'Stim_Night_12h']\n",
|
||
|
|
"\n",
|
||
|
|
"# Merge and clean up data\n",
|
||
|
|
"merged_df = pd.merge(stim_overall, stim_pivot, on='id')\n",
|
||
|
|
"\n",
|
||
|
|
"merged_df['Machine'] = merged_df['id'].map(df.meta['machine_name'])\n",
|
||
|
|
"merged_df['Tube'] = merged_df['id'].apply(lambda x: str(x).split('|')[-1])\n",
|
||
|
|
"merged_df['Fly_Label'] = merged_df['Machine'] + \" - Fly \" + merged_df['Tube']\n",
|
||
|
|
"\n",
|
||
|
|
"clean_table = merged_df.dropna(subset=['Machine']).sort_values(by=['Machine', 'Tube'])\n",
|
||
|
|
"stim_stats = clean_table[['Fly_Label', 'Stim_Sleep_24h', 'Stim_Day_12h', 'Stim_Night_12h']]\n",
|
||
|
|
"\n",
|
||
|
|
"# PRINT RESULTS\n",
|
||
|
|
"print(f\"--- Individual Fly Sleep (Stimulus: {start_hour}h to {end_hour}h) ---\")\n",
|
||
|
|
"print(stim_stats.head(20).to_string(index=False)) \n",
|
||
|
|
"print(\"... (Showing first 20 rows)\\n\")\n",
|
||
|
|
"\n",
|
||
|
|
"print(f\"--- Grand Summary Statistics (Stimulus: {start_hour}h to {end_hour}h) ---\")\n",
|
||
|
|
"print(f\"Total Flies Analyzed: n = {len(stim_stats)}\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 1. OVERALL 24H STATS\n",
|
||
|
|
"print(\"\\n[ OVERALL SLEEP (24h Stimulus Block) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {stim_stats['Stim_Sleep_24h'].mean():.2f} ± {stim_stats['Stim_Sleep_24h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {stim_stats['Stim_Sleep_24h'].median():.2f} hours\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 2. DAY TIME STATS\n",
|
||
|
|
"print(f\"\\n[ DAY TIME (ZT 0-12 during Stimulus) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {stim_stats['Stim_Day_12h'].mean():.2f} ± {stim_stats['Stim_Day_12h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {stim_stats['Stim_Day_12h'].median():.2f} hours\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 3. NIGHT TIME STATS\n",
|
||
|
|
"print(f\"\\n[ NIGHT TIME (ZT 12-24 during Stimulus) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {stim_stats['Stim_Night_12h'].mean():.2f} ± {stim_stats['Stim_Night_12h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {stim_stats['Stim_Night_12h'].median():.2f} hours\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 13,
|
||
|
|
"id": "b583d55c-d9c3-4920-8630-33b3387a5964",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"\n",
|
||
|
|
"--- 24h Total Statistical Analysis ---\n",
|
||
|
|
"Shapiro-Wilk P-value (Normality of differences): 0.1812\n",
|
||
|
|
"Result: Data is normal. Used Paired T-test.\n",
|
||
|
|
"P-value: 8.0904e-08\n",
|
||
|
|
"Significance: ****\n",
|
||
|
|
"\n",
|
||
|
|
"--- Daytime Statistical Analysis ---\n",
|
||
|
|
"Shapiro-Wilk P-value (Normality of differences): 0.0684\n",
|
||
|
|
"Result: Data is normal. Used Paired T-test.\n",
|
||
|
|
"P-value: 1.8841e-04\n",
|
||
|
|
"Significance: ***\n",
|
||
|
|
"\n",
|
||
|
|
"--- Nighttime Statistical Analysis ---\n",
|
||
|
|
"Shapiro-Wilk P-value (Normality of differences): 0.7893\n",
|
||
|
|
"Result: Data is normal. Used Paired T-test.\n",
|
||
|
|
"P-value: 1.2479e-07\n",
|
||
|
|
"Significance: ****\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"# STATISTICS\n",
|
||
|
|
"\n",
|
||
|
|
"# Merge Baseline and Stimulus data on Fly_Label\n",
|
||
|
|
"paired_df = pd.merge(baseline_stats, stim_stats, on='Fly_Label')\n",
|
||
|
|
"\n",
|
||
|
|
"def run_paired_stats(df, base_col, stim_col, label):\n",
|
||
|
|
" # Calculate the differences for the paired test\n",
|
||
|
|
" diffs = df[stim_col] - df[base_col]\n",
|
||
|
|
" \n",
|
||
|
|
" # 2. Shapiro-Wilk Test for Normality\n",
|
||
|
|
" _, p_shapiro = shapiro(diffs)\n",
|
||
|
|
" \n",
|
||
|
|
" print(f\"\\n--- {label} Statistical Analysis ---\")\n",
|
||
|
|
" print(f\"Shapiro-Wilk P-value (Normality of differences): {p_shapiro:.4f}\")\n",
|
||
|
|
" \n",
|
||
|
|
" # 3. Determine Test: If P > 0.05, data is normal (use t-test). If P < 0.05, use Wilcoxon.\n",
|
||
|
|
" if p_shapiro > 0.05:\n",
|
||
|
|
" stat, p_val = ttest_rel(df[base_col], df[stim_col])\n",
|
||
|
|
" print(f\"Result: Data is normal. Used Paired T-test.\")\n",
|
||
|
|
" else:\n",
|
||
|
|
" stat, p_val = wilcoxon(df[base_col], df[stim_col])\n",
|
||
|
|
" print(f\"Result: Data is not normal. Used Wilcoxon Signed-Rank test.\")\n",
|
||
|
|
" \n",
|
||
|
|
" print(f\"P-value: {p_val:.4e}\")\n",
|
||
|
|
" if p_val < 0.0001: print(\"Significance: ****\")\n",
|
||
|
|
" elif p_val < 0.001: print(\"Significance: ***\")\n",
|
||
|
|
" elif p_val < 0.01: print(\"Significance: **\")\n",
|
||
|
|
" elif p_val < 0.05: print(\"Significance: *\")\n",
|
||
|
|
" else: print(\"Significance: ns\")\n",
|
||
|
|
"\n",
|
||
|
|
"# Run for all three metrics\n",
|
||
|
|
"run_paired_stats(paired_df, 'Base_Sleep_24h', 'Stim_Sleep_24h', '24h Total')\n",
|
||
|
|
"run_paired_stats(paired_df, 'Base_Day_12h', 'Stim_Day_12h', 'Daytime')\n",
|
||
|
|
"run_paired_stats(paired_df, 'Base_Night_12h', 'Stim_Night_12h', 'Nighttime')"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 30,
|
||
|
|
"id": "68c7182a-83d0-4806-a1fc-60e456598d4c",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stderr",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"/tmp/ipykernel_45912/2339438175.py:43: FutureWarning: \n",
|
||
|
|
"\n",
|
||
|
|
"Setting a gradient palette using color= is deprecated and will be removed in v0.14.0. Set `palette='dark:black'` for the same effect.\n",
|
||
|
|
"\n",
|
||
|
|
" sns.stripplot(\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAqwAAAJICAYAAACkF7akAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAnQ1JREFUeJzs3XlcVGXfBvBrhn1kF5QdARUFBURwDxQ1XCstlzKX3HMpcynzabMn17KeUstdS600M8s1FY1ScUPFXVEU2WUflmGd8/5hzuvIIgwzzDBc38/n+byc+5xzz298CS7O3ItIEAQBREREREQ6SqztAoiIiIiIqsPASkREREQ6jYGViIiIiHQaAysRERER6TQGViIiIiLSaQysRERERKTTGFiJiIiISKcxsBIRERGRTmNgJSIiIiKdplOB9eDBg3jzzTcREhKCgIAAvPjii9i1axee3ozrl19+QXh4ONq3b48XXngBx48fr1H/aWlpmDlzJjp06IBOnTrhP//5D/Lz8zXxVoiIiIhITUS6tDXriBEj4OzsjD59+sDGxganTp3Chg0bMH36dMyYMQMAsH//fsyZMwdTp05Fly5dcODAAfz666/Yvn07AgICquy7tLQUQ4cOBQC88847KCoqwrJly9CmTRusXbu2Pt4eEREREalApwJrVlYWbG1tldo+/PBDHDhwAOfOnYNYLEZ4eDjatWuHFStWKK4ZOXIkLCwssH79+ir73rdvH+bOnYsDBw7A09MTAHDixAlMmDABv/zyC/z8/DTzpoiIiIioTnRqSMDTYRUA2rZti/z8fBQWFiIhIQH3799H//79la4ZMGAAoqKiUFJSUmXff//9N7y9vRVhFQC6d+8Oa2trREZGqu9NEBEREZFa6VRgrUx0dDSaN28Oc3NzxMXFAQA8PDyUrvHy8kJpaSkSEhKq7CcuLk4prAKASCSCh4eHol8iIiIi0j2G2i6gOufPn8eBAwfw3nvvAQByc3MBAJaWlkrXPT5+fL4yUqkUFhYWFdqtrKyqvQ8AevfuXeW5hw8fwt/fH9u2bau2DyIiIiJSjc4+YU1NTcU777yDzp07Y8yYMdoup0rl5eVISUnRdhlEREREeksnn7BKpVJMmjQJ1tbWWLlyJcTiR7naysoKAJCXlwd7e3ul6588XxlLS8tKl7DKzc2Fo6NjtfVERERUea66p69EREREVHc694S1qKgIU6ZMQV5eHjZs2KD0Mf7jMahPjzmNi4uDkZERXF1dq+zX09Ozwn2CIODevXsVxrYSERERke7QqcBaVlaGWbNmIS4uDhs2bEDz5s2Vzru6uqJFixY4dOiQUvuBAwfQtWtXGBsbV9l3SEgIbt68ifv37yvaoqKikJOTg9DQULW+DyIiIiJSH50KrAsXLsTx48cxdepU5Ofn49KlS4r/PV6yaubMmdi3bx+++eYbnDlzBh9//DEuX76MadOmKfpJSkqCj48PVq1apWgLDw9Hq1atMHPmTBw/fhwHDhzAggUL0LNnT67BSkRERKTDdGoM68mTJwEAS5curXAuIiICLi4uGDRoEGQyGdavX49169bBw8MDq1atQocOHRTXCoKA8vJypS1djYyMsGHDBnz22WeYPXs2DA0N0bdvXyxYsEDzb4yIiIiIVKZTO101RI8nXVU3MYuIiIiIVKdTQwKIiIiIiJ7GwEpEREREOo2BlYiIiIh0GgMrEREREek0BlYiIiIi0mkMrERERESk0xhYiYiIiEinMbASERERkU5jYCUiIiIincbASkREREQ6jYGViIiIiHQaAysRERER6TQGViIiIiLSaQysRERERKTTGFiJiIiISKcxsBIRERGRTmNgJSIiIiKdxsBKRERERDqNgZWIiIiIdBoDK9W7M2fOYP78+VWeDwsLq/b+lStXYvfu3VWeT0xMxOjRo1Wuj/SDpr/PqHHgzysi3cDASvUiLy8Ply5dqtAulUoRExODU6dOoby8vML5f/75BwBw+/ZtpKWlVTgfFxeHxMRElJWVISoqqsL54uJinD17tu5vgBoETX+fUePAn1dEuoeBlepFUlIS3nvvPXz22WcoLCwEAPz5558YMmQILl68iJ07d2L48OG4efMmACAhIQETJkzA5s2bUVBQgNu3b2PEiBH46aefIAgCysrK8O2332LSpElITExERkYGli9fjjlz5iArKwvAoycjQ4YMwfHjx7X2vql+afr7jBoH/rwi0j0iQRAEbRfRkPXu3RsAEBERoeVKdF9JSQm2bt2KLVu2ID8/H6GhoZg3bx6cnZ0BAOfPn8fnn3+Oa9euoWXLlpg5c6bi3xcAsrKy8L///Q/79++HoaEhRo4ciSlTpkAikQAA5HI5fvvtN6xduxZpaWno2LEj5s+fj9atW2vl/ZJ2aPr7jBoH/rwi0i18wkr1RiQSQSwWQyQSKY4ff13V8dPEYnGV5x/3X1V/1Dho+vuMGgf+vCLSLQysVC9u3bqFF154AUlJSVi4cCHCw8MRHh6O0aNH4/vvv8ecOXOwePFifPLJJ2jWrBlWrlyJbdu2Yfz48SgoKMCBAwfw8ssvo3Xr1hg7dizmzJkDIyMjDB48GKdPn0ZaWhpeeeUVnDhxAl988QX8/PwwefJkvPXWW1i+fLm23z7VE01/n1HjwJ9XRDpIoDoJCwsTwsLCtF2GzpNKpcLFixcFQRCE06dPC++9954gCIKQm5srXLp0SThx4oRQVlYmCIIg9OrVS3FfZGSkIAiCcOvWLSE1NVUQBEH45ptvhF9//VUQBEG4c+eOkJCQIJSWlgonT54UBEEQEhIShNdff10QBEEoKioSzpw5o/k3SDpB099n1Djw5xWR7jHUdmCmxsHCwgIBAQEV2i0tLeHv71/lfSEhIQBQ5bguLy8vxdfdunWrcN7ExASdOnWqZbXUUNXH9xnpP/68ItI9nHRVR5x0RURERKRZHMNKRERERDqNgZWIiIiIdBoDKxERERHpNAZWIiIiItJpDKxEREREpNMYWImIiIhIp3EdVqoxQRAgk8m0XUa9MjMz43aJGsbvK9IEfl8R6RcGVqoRQRDw0ksv4fz589oupV4FBwfjt99+4y8BDeH3Fb+vNIHfV/y+Iv3DIQFUIzKZrNH98AeAc+fONbqnNPWJ31ekCfy+ItI/fMJKtRYTEwOJRKLtMjSqsLCw2i0YSf34fUWawO8rIv3AwEq1JpFI9P4XANU/fl+RJvD7ikg/cEgAEREREek0BlYiIiIi0mkMrERERESk0xhYiYiIiEinMbASERERkU5jYCUiIiIincbASkREREQ6jeuwUo2YmZkhODhY8bW+a2zvV1sa279zY3u/2tLY/p0b2/ulxkkkCIKg7SIast69ewMAIiIitFyJ5j3+Vmks+1Q3tverLY3t37mxvV9taWz/zo3t/VLjwyesVGON7QdhY3u/2tLY/p0b2/vVlsb279zY3i81PhzDSkREREQ6jYGViIiIiHQaAysRERER6TQGViIiIiLSaTo16So+Ph4bN25ETEwMYmNj4enpiX379inOJyYmKmblP83Y2BhXrlypsu8zZ85gzJgxFdoHDBiAr776qu7FExEREZFG6FRgjY2NRWRkJPz9/SGXy/H0ilvNmjXDjh07lNoEQcDEiRPRpUuXGr3GkiVL4OnpqTi2sbGpe+FEREREpDE6FVjDwsLQp08fAMD8+fNx9epVpfPGxsYICAhQajtz5gzy8/MxaNCgGr1Gq1at0L59e7XUS0RERESap1NjWMXi2pezb98+mJubIywsTAMVEREREZG26VRgra3S0lIcPnwYffv2hYmJSY3umTx5Mtq2bYuQkBAsW7YMRUVFGq6SiIiIiOpCp4YE1Nbff/+NnJycGg0HsLCwwMSJExEcHAwTExOcPn0amzZtQlxcHNauXVvtvVVN9AKAlJQUODo61rp2IiIiIqqZBh1Y9+7dCzs7O3Tt2vWZ1/r4+MDHx0dx3LVrVzRr1gyffvopLl++DD8/P02WSkREREQqarCBtaCgAMePH8ewYcNgYGCgUh/9+/fHp59+iqtXr1YbWCMiIqo8V93TVyIiIiK
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 700x600 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"#PLOT\n",
|
||
|
|
"\n",
|
||
|
|
"# 1. PREPARE DATA & CALCULATE STATS\n",
|
||
|
|
"combined = pd.merge(baseline_stats, stim_stats, on='Fly_Label')\n",
|
||
|
|
"\n",
|
||
|
|
"# Calculate the paired statistics for the brackets\n",
|
||
|
|
"p_values = {}\n",
|
||
|
|
"metrics = {\n",
|
||
|
|
" '24h': ('Base_Sleep_24h', 'Stim_Sleep_24h'),\n",
|
||
|
|
" 'Day': ('Base_Day_12h', 'Stim_Day_12h'),\n",
|
||
|
|
" 'Night': ('Base_Night_12h', 'Stim_Night_12h')\n",
|
||
|
|
"}\n",
|
||
|
|
"\n",
|
||
|
|
"for phase, (base_col, stim_col) in metrics.items():\n",
|
||
|
|
" diffs = combined[stim_col] - combined[base_col]\n",
|
||
|
|
" _, p_shapiro = shapiro(diffs)\n",
|
||
|
|
" \n",
|
||
|
|
" if p_shapiro > 0.05:\n",
|
||
|
|
" _, p_val = ttest_rel(combined[base_col], combined[stim_col])\n",
|
||
|
|
" else:\n",
|
||
|
|
" _, p_val = wilcoxon(combined[base_col], combined[stim_col])\n",
|
||
|
|
" p_values[phase] = p_val\n",
|
||
|
|
"\n",
|
||
|
|
"plot_df = combined.melt(id_vars=['Fly_Label'], var_name='Variable', value_name='Hours')\n",
|
||
|
|
"plot_df['Condition'] = plot_df['Variable'].apply(lambda x: '24h' if '24h' in x else ('Day' if 'Day' in x else 'Night'))\n",
|
||
|
|
"plot_df['State'] = plot_df['Variable'].apply(lambda x: 'Baseline' if 'Base' in x else 'Stimulus')\n",
|
||
|
|
"\n",
|
||
|
|
"# 2. GENERATE PLOT\n",
|
||
|
|
"plt.figure(figsize=(7, 6))\n",
|
||
|
|
"sns.set_theme(style=\"ticks\")\n",
|
||
|
|
"\n",
|
||
|
|
"order = ['24h', 'Day', 'Night']\n",
|
||
|
|
"hue_order = ['Baseline', 'Stimulus']\n",
|
||
|
|
"palette = {'Baseline': '#cccccc', 'Stimulus': '#ff4c4c'}\n",
|
||
|
|
"\n",
|
||
|
|
"# Boxplot \n",
|
||
|
|
"sns.boxplot(\n",
|
||
|
|
" data=plot_df, x='Condition', y='Hours', hue='State', \n",
|
||
|
|
" order=order, hue_order=hue_order, palette=palette,\n",
|
||
|
|
" width=0.6, gap=0.2, boxprops={'edgecolor': 'black', 'alpha': 0.7},\n",
|
||
|
|
" medianprops={'color': 'black', 'linewidth': 1.5}, showfliers=False\n",
|
||
|
|
")\n",
|
||
|
|
"\n",
|
||
|
|
"# Stripplot\n",
|
||
|
|
"sns.stripplot(\n",
|
||
|
|
" data=plot_df, x='Condition', y='Hours', hue='State', \n",
|
||
|
|
" order=order, hue_order=hue_order, dodge=True,\n",
|
||
|
|
" color='black', alpha=0.5, size=4, jitter=0.05,\n",
|
||
|
|
" legend=False\n",
|
||
|
|
")\n",
|
||
|
|
"\n",
|
||
|
|
"# 3. ADD MEDIAN LABELS\n",
|
||
|
|
"ax = plt.gca()\n",
|
||
|
|
"medians = plot_df.groupby(['Condition', 'State'], sort=False)['Hours'].median()\n",
|
||
|
|
"\n",
|
||
|
|
"# Offsets remain exactly as provided\n",
|
||
|
|
"offsets = {'Baseline': -0.4, 'Stimulus': 0.4}\n",
|
||
|
|
"\n",
|
||
|
|
"for i, cond in enumerate(order):\n",
|
||
|
|
" for state in hue_order:\n",
|
||
|
|
" val = medians[(cond, state)]\n",
|
||
|
|
" ax.text(i + offsets[state], val, f\"{val:.1f}h\", \n",
|
||
|
|
" ha='center', va='bottom', fontsize=10)\n",
|
||
|
|
"\n",
|
||
|
|
"# 4. ADD SIGNIFICANCE BRACKETS\n",
|
||
|
|
"y_max = plot_df['Hours'].max()\n",
|
||
|
|
"y_line = y_max + 1.0 \n",
|
||
|
|
"h = 0.4 \n",
|
||
|
|
"\n",
|
||
|
|
"for i, cond in enumerate(order):\n",
|
||
|
|
" p = p_values[cond]\n",
|
||
|
|
" \n",
|
||
|
|
" if p < 0.0001: star = '****'\n",
|
||
|
|
" elif p < 0.001: star = '***'\n",
|
||
|
|
" elif p < 0.01: star = '**'\n",
|
||
|
|
" elif p < 0.05: star = '*'\n",
|
||
|
|
" else: star = 'ns'\n",
|
||
|
|
" \n",
|
||
|
|
" x1, x2 = i - 0.2, i + 0.2\n",
|
||
|
|
" plt.plot([x1, x1, x2, x2], [y_line, y_line+h, y_line+h, y_line], lw=1.5, c='k')\n",
|
||
|
|
" plt.text((x1+x2)*.5, y_line+h, star, ha='center', va='bottom', fontsize=12)\n",
|
||
|
|
"\n",
|
||
|
|
"# 5. FORMATTING\n",
|
||
|
|
"sns.despine()\n",
|
||
|
|
"plt.ylabel('Average time spent asleep (hours)', fontsize=12)\n",
|
||
|
|
"plt.xlabel('')\n",
|
||
|
|
"plt.xlim(-0.6, 2.5) \n",
|
||
|
|
"plt.ylim(0, max(20, y_line + h + 1.5)) \n",
|
||
|
|
"\n",
|
||
|
|
"# Legend moved outside the plot to the right\n",
|
||
|
|
"plt.legend(title='', frameon=False, loc='center left', bbox_to_anchor=(1, 0.5))\n",
|
||
|
|
"plt.tight_layout()\n",
|
||
|
|
"\n",
|
||
|
|
"plt.savefig(\"60D_Baseline_vs_Stimulus.png\", dpi=600, bbox_inches='tight')\n",
|
||
|
|
"plt.show()"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"metadata": {
|
||
|
|
"kernelspec": {
|
||
|
|
"display_name": "Python 3 (ipykernel)",
|
||
|
|
"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.3"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"nbformat": 4,
|
||
|
|
"nbformat_minor": 5
|
||
|
|
}
|