csiborgtools/notebooks/overlap/overlap_sketch.ipynb

169 lines
51 KiB
Plaintext
Raw Normal View History

2024-05-09 17:29:34 +02:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 119,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.patches as patches\n",
"from matplotlib.colors import ListedColormap\n",
"\n",
"import scienceplots"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"\n",
"def create_halo(center, radius, grid_size):\n",
" \"\"\"Create a binary mask for a halo in a grid based on its center and radius.\"\"\"\n",
" y, x = np.ogrid[-center[0]:grid_size-center[0], -center[1]:grid_size-center[1]]\n",
" mask = x*x + y*y <= radius*radius\n",
" return mask\n"
]
},
{
"cell_type": "code",
"execution_count": 124,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot parameters\n",
"grid_size = 5000\n",
"\n",
"halo_a_center = (0.6 * grid_size, 0.6 * grid_size)\n",
"halo_a_radius = 0.2 * grid_size\n",
"\n",
"halo_b_center = (0.5 * grid_size, 0.4 * grid_size)\n",
"halo_b_radius = 0.3 * grid_size\n",
"\n",
"halo_c_center = (0.325 * grid_size, 0.7 * grid_size)\n",
"halo_c_radius = 0.15 * grid_size\n",
"\n",
"# Create grid masks for the haloes\n",
"halo_a_mask = create_halo(halo_a_center, halo_a_radius, grid_size)\n",
"halo_a_circle = patches.Circle((halo_a_center[1], grid_size - halo_a_center[0]), halo_a_radius, fill=False, color=\"dodgerblue\", linewidth=2)\n",
"\n",
"halo_b_mask = create_halo(halo_b_center, halo_b_radius, grid_size)\n",
"halo_b_circle = patches.Circle((halo_b_center[1], grid_size - halo_b_center[0]), halo_b_radius, fill=False, color='crimson', linewidth=2)\n",
"\n",
"halo_c_mask = create_halo(halo_c_center, halo_c_radius, grid_size)\n",
"halo_c_circle = patches.Circle((halo_c_center[1], grid_size - halo_c_center[0]), halo_c_radius, fill=False, color='navy', linewidth=2)\n",
"\n",
"# Calculate the overlap\n",
"overlap_mask_a_b1 = halo_a_mask & halo_b_mask\n",
"overlap_mask_a_b2 = halo_b_mask & halo_c_mask\n",
"\n",
"fig, ax = plt.subplots()\n",
"ax.set_facecolor('none')\n",
"fig.patch.set_facecolor('none')\n",
"\n",
"# Display Halo A\n",
"# ax.imshow(halo_a_mask, extent=(0, grid_size, 0, grid_size), interpolation='none', cmap='Reds', alpha=0., label=r\"Halo $a \\in \\mathcal{A}$\")\n",
"ax.add_patch(halo_a_circle)\n",
"\n",
"# Display Halo B\n",
"# ax.imshow(halo_b_mask, extent=(0, grid_size, 0, grid_size), interpolation='none', cmap='Blues', alpha=0., label='Halo B')\n",
"ax.add_patch(halo_b_circle)\n",
"\n",
"# Display Halo C\n",
"# ax.imshow(halo_c_mask, extent=(0, grid_size, 0, grid_size), interpolation='none', cmap='Greens', alpha=0., label='Halo C')\n",
"ax.add_patch(halo_c_circle)\n",
"\n",
"# Highlight the overlap\n",
"gold_cmap = ListedColormap(['gold'])\n",
"ax.imshow(overlap_mask_a_b1, extent=(0, grid_size, 0, grid_size), interpolation='none', cmap=\"Purples\", label='Overlap', alpha=0.7)\n",
"# ax.imshow(overlap_mask_a_b2, extent=(0, grid_size, 0, grid_size), interpolation='none', cmap='Purples', alpha=0.25, label='Overlap')\n",
"\n",
"# Annotations and labels\n",
"# ax.set_title('Toy Model of Halo Overlap')\n",
"# ax.set_xlabel('X Coordinate')\n",
"# ax.set_ylabel('Y Coordinate')\n",
"\n",
"# Creating a legend with color patches\n",
"legend_elements = [patches.Patch(facecolor='crimson', label=r\"$a \\in \\mathcal{A}$\"),\n",
" patches.Patch(facecolor='dodgerblue', label=r\"$b_1 \\in \\mathcal{B}$\"),\n",
" patches.Patch(facecolor='navy', label=r\"$b_2 \\in \\mathcal{B}$\"),\n",
" patches.Patch(facecolor='purple', alpha=0.7, label=r\"$X_{a b_1}$\")]\n",
"\n",
"ax.legend(handles=legend_elements, ncol=4, loc=\"lower center\")\n",
"# ax.legend()\n",
"# Grid\n",
"ax.set_xticks(np.arange(0, grid_size + 1, int(0.1 * grid_size)), labels=[])\n",
"ax.set_yticks(np.arange(0, grid_size + 1, int(0.1 * grid_size)), labels=[])\n",
"# ax.grid(True, which='both', color='black', linewidth=0.5, linestyle='--', alpha=0.7)\n",
"\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"\n",
"# Hide bottom and left spines\n",
"ax.spines['bottom'].set_visible(False)\n",
"ax.spines['left'].set_visible(False)\n",
"\n",
"# Hide the ticks\n",
"ax.xaxis.set_ticks([])\n",
"ax.yaxis.set_ticks([])\n",
"\n",
"# Hide the tick labels\n",
"ax.set_xticklabels([])\n",
"ax.set_yticklabels([])\n",
"\n",
"# Equation to be added\n",
"equation = r\"$\\mathcal{O}_{a b_1} = \\frac{X_{a b_1}}{M_a + M_{b_1} - X_{a b_1}}$\"\n",
"\n",
"# Add the text with a box around it\n",
"ax.text(0.2 * grid_size, 0.875 * grid_size, equation, fontsize=14, verticalalignment='center', \n",
" horizontalalignment='center', bbox=dict(facecolor='white', alpha=0.5, boxstyle='round,pad=0.5'))\n",
"fig.tight_layout()\n",
"fig.savefig(\"../../plots/overlap_figure.pdf\", dpi=450, bbox_inches='tight')\n",
"fig.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "venv_csiborg",
"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.11.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}