Skip to content

Instantly share code, notes, and snippets.

@GadgetSteve
Created March 1, 2020 15:29
Show Gist options
  • Save GadgetSteve/557b7c995a824af92f455f5f475948d5 to your computer and use it in GitHub Desktop.
Save GadgetSteve/557b7c995a824af92f455f5f475948d5 to your computer and use it in GitHub Desktop.
Create image like Picture from: E. Lucon Oscillateurs coupl ́es, d ́esordre et
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"from matplotlib.patches import Arc, Arrow\n",
"import numpy as np\n",
"import itertools"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"\n",
"def get_circle(x, y, r=1):\n",
" \"\"\" Get a cirlce with a specific position and radius\"\"\"\n",
" result = plt.Circle((x, y), r, color='k', fill=False)\n",
" return result\n",
"\n",
"def rpoint(x, y, r, deg):\n",
" \"\"\" Get a point on a radius at deg degrees.\"\"\"\n",
" rang = np.deg2rad(deg)\n",
" x1 = x + r * np.sin(rang)\n",
" y1 = y + r * np.cos(rang)\n",
" return (x1, y1)\n",
"\n",
"def radial(x, y, r=1, ang=0, style=\"-\"):\n",
" \"\"\" Draw a radial from a given center to the radius and an angle in degrees.\"\"\"\n",
" x1, y1 = rpoint(x, y, r, ang)\n",
" result = plt.Line2D([x,x1], [y,y1], color='k', linestyle=style)\n",
" return result\n",
"\n",
"def add_arc(x, y, r=1, ang1=0, ang2=0):\n",
" \"\"\" Draw the arrow radius.\"\"\"\n",
" sr = r * 0.75\n",
" x1, y1 = rpoint(x, y, sr, ang2)\n",
" x2, y2 = rpoint(x, y, sr, ang2+15)\n",
" arc = Arc([x, y], sr*2, sr*2, angle=-100, theta1=ang2, theta2=ang1)\n",
" return arc\n",
" \n",
"def add_arrow(x, y, r=1, ang1=0, ang2=0):\n",
" \"\"\" Draw the arrow head.\"\"\"\n",
" sr = r * 0.75\n",
" x1, y1 = rpoint(x, y, sr, ang2)\n",
" x2, y2 = rpoint(x, y, sr, ang2+10)\n",
" arrow = Arrow(x2, y2, x1-x2, y1-y2, color='k', linewidth=0.25)\n",
" return arrow\n",
" \n",
"def add_lables(x, y, r, ang1, ang2, n):\n",
" \"\"\" Add the lables.\"\"\"\n",
" x1, y1 = rpoint(x, y, r*1.21, ang1)\n",
" x2, y2 = rpoint(x, y, r*1.1, ang2)\n",
" text1 = plt.text(x1, y1, rf'$\\theta_{n}$')\n",
" text2 = plt.text(x2, y2, rf'$\\omega_{n}$')\n",
" \n",
"def add_item(ax, x, y, rad, n, ang1, ang2, theta_ang):\n",
" \"\"\" Add a single item.\"\"\"\n",
" ax.add_patch(get_circle(x, y, rad))\n",
" ax.add_artist(radial(x, y, rad, ang1))\n",
" ax.add_artist(radial(x, y, rad, ang2, '--'))\n",
" ax.add_patch(add_arc(x, y, rad, ang1, ang2))\n",
" ax.add_patch(add_arrow(x, y, rad, ang1, ang2))\n",
"\n",
" add_lables(x, y, rad, (ang1+ang2)/2, theta_ang, n)\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"\n",
"centx, centy = 120, 120\n",
"radius = 30\n",
"item_rad = 9\n",
"item_count = 6\n",
"step = 360/item_count\n",
"offset = step/2\n",
"item_angs = [offset+step*n for n in range(item_count)]\n",
"#print(item_angs)\n",
"itemxys = [rpoint(centx, centy, radius, item_angs[n]) for n in range(item_count)]\n",
"items = [(*p, item_angs[n], n) for n,p in enumerate(itemxys)]\n",
"#print(items)\n",
"\n",
"for x, y, ang, n in items:\n",
" add_item(ax, x, y, item_rad, n, 145, 45, ang-offset)\n",
"\n",
"for xy1, xy2 in itertools.combinations(itemxys, 2):\n",
" ax.add_artist(plt.Line2D([xy1[0], xy2[0]], [xy1[1], xy2[1]], color='lightgrey', linestyle=':'))\n",
"\n",
"ax.set_aspect('equal', adjustable='datalim')\n",
"ax.axes.get_xaxis().set_visible(False)\n",
"ax.axes.get_yaxis().set_visible(False)\n",
"ax.plot()\n",
"plt.savefig('demo.svg')\n",
"plt.savefig('demo.png')\n",
"plt.savefig('demo.pdf')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Based on E. Lucon Oscillateurs coupl ́es, d ́esordre et\n",
"The above code was written in response to a Software Recommendations question [here](https://softwarerecs.stackexchange.com/questions/72317/looking-for-a-program-to-draw-scientific-sketches/72318?noredirect=1#comment90128_72318)."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.8.1"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment