Skip to content

Instantly share code, notes, and snippets.

@smsharma
Last active April 2, 2023 16:49
Show Gist options
  • Save smsharma/4b8388fe7111fa375773a6dddb064757 to your computer and use it in GitHub Desktop.
Save smsharma/4b8388fe7111fa375773a6dddb064757 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "cb867a83-3228-44cf-bc72-aca011efcdbc",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Generate some fake data\n",
"\n",
"data = np.random.rand(20, 2) # 2D axis points (AI theory etc)\n",
"thrust = np.random.choice([\"ai_found\", \"phy_th\", \"phy_exp\"], size=20) # List of thrusts\n",
"affiliation = [np.random.choice([\"harvard\", \"mit\", \"neu\", \"tufts\", \"fellow\"], replace=False, size=np.random.randint(1, 4)) for _ in range(20)] # List of affiliations\n",
"\n",
"# Color mappings\n",
"thrust_colors = {\"ai_found\": \"grey\", \"phy_th\": \"blue\", \"phy_exp\": \"green\"}\n",
"affiliation_colors = {\"harvard\": \"red\", \"mit\": \"firebrick\", \"neu\": \"k\", \"tufts\": \"cyan\", \"fellow\": \"yellow\"}\n",
"\n",
"# Size of markers\n",
"radius = 0.2\n",
"\n",
"## Make plot\n",
"\n",
"def pie_marker(ratios, n_points=500):\n",
" \"\"\" `ratios` is the ratio of each pie component; `n_points` is the number of segments (more = smoother pie)\n",
" \"\"\"\n",
" markers = []\n",
" sizes = []\n",
" cumulative_ratio = 0\n",
" for r in ratios:\n",
" x = [0] + np.cos(np.linspace(2 * np.pi * cumulative_ratio, 2 * np.pi * (cumulative_ratio + r), n_points)).tolist()\n",
" y = [0] + np.sin(np.linspace(2 * np.pi * cumulative_ratio, 2 * np.pi * (cumulative_ratio + r), n_points)).tolist()\n",
" markers.append(np.column_stack([x, y]))\n",
" sizes.append(np.abs(markers[-1]).max())\n",
" cumulative_ratio += r\n",
" return markers, sizes\n",
"\n",
"def plot_pie_markers(data, thrust, affiliation, ax):\n",
" \"\"\" Plot pie markers given list of \n",
" \"\"\"\n",
" for point, th, aff in zip(data, thrust, affiliation):\n",
" aff_ratios = [1 / len(aff)] * len(aff)\n",
" markers, sizes = pie_marker(aff_ratios)\n",
" \n",
" circle_area = np.pi * radius**2\n",
" marker_area = 3000 * circle_area\n",
" \n",
" for marker, s, color in zip(markers, sizes, [affiliation_colors[a] for a in aff]):\n",
" ax.scatter(point[0], point[1], marker=marker, s=marker_area, facecolor=color, edgecolors='none')\n",
" ax.add_patch(plt.Circle(point, 0.18 * radius, lw=2, edgecolor=thrust_colors[th], fill=False))\n",
"\n",
"fig, ax = plt.subplots()\n",
"plot_pie_markers(data, thrust, affiliation, ax)\n",
"\n",
"# Need this to make sure the outer circles and markers are the same aspect ratio\n",
"ax.set_aspect('equal', adjustable='box') \n",
"\n",
"ax.set_xlim(0, 1)\n",
"ax.set_ylim(0, 1)\n",
"\n",
"plt.savefig(\"test_markers.pdf\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "79e491c2-c2e6-4c40-bf3c-df2bbd1fa27f",
"metadata": {},
"outputs": [],
"source": []
}
],
"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.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment