Created
April 17, 2023 23:14
-
-
Save sbliven/83324f3d59f7733828191733cd62ee00 to your computer and use it in GitHub Desktop.
SVG images for XKCD "1-to-1 scale" https://xkcd.com/2761/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"id": "97774457-1a86-41dd-9089-380d19141f6b", | |
"metadata": {}, | |
"source": [ | |
"# 1 to 1 scale\n", | |
"\n", | |
"https://xkcd.com/2761/" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "fb386e74-a54c-4ca9-8b11-34d3c445ea4f", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [], | |
"source": [ | |
"import svgwrite\n", | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"from io import StringIO" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "3823649f-3211-487b-a822-cf0a81ce07ce", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Planet</th>\n", | |
" <th>Color</th>\n", | |
" <th>Radius</th>\n", | |
" <th>px</th>\n", | |
" <th>py</th>\n", | |
" <th>nx</th>\n", | |
" <th>ny</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Earth</td>\n", | |
" <td>#31AAE4</td>\n", | |
" <td>12756</td>\n", | |
" <td>218</td>\n", | |
" <td>66</td>\n", | |
" <td>-12</td>\n", | |
" <td>440</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Jupiter</td>\n", | |
" <td>#972626</td>\n", | |
" <td>142984</td>\n", | |
" <td>285</td>\n", | |
" <td>131</td>\n", | |
" <td>-193</td>\n", | |
" <td>-183</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Mars</td>\n", | |
" <td>#B78463</td>\n", | |
" <td>6792</td>\n", | |
" <td>122</td>\n", | |
" <td>157</td>\n", | |
" <td>144</td>\n", | |
" <td>-89</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>Saturn</td>\n", | |
" <td>#FFCF98</td>\n", | |
" <td>120536</td>\n", | |
" <td>193</td>\n", | |
" <td>205</td>\n", | |
" <td>-79</td>\n", | |
" <td>-341</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>Venus</td>\n", | |
" <td>#C7B04A</td>\n", | |
" <td>12104</td>\n", | |
" <td>77</td>\n", | |
" <td>93</td>\n", | |
" <td>188</td>\n", | |
" <td>153</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>Uranus</td>\n", | |
" <td>#DDEEF6</td>\n", | |
" <td>51118</td>\n", | |
" <td>349</td>\n", | |
" <td>163</td>\n", | |
" <td>-169</td>\n", | |
" <td>-205</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>Neptune</td>\n", | |
" <td>#6C83AF</td>\n", | |
" <td>49528</td>\n", | |
" <td>407</td>\n", | |
" <td>203</td>\n", | |
" <td>-110</td>\n", | |
" <td>-69</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>Mercury</td>\n", | |
" <td>#8A8685</td>\n", | |
" <td>4879</td>\n", | |
" <td>32</td>\n", | |
" <td>123</td>\n", | |
" <td>250</td>\n", | |
" <td>43</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Planet Color Radius px py nx ny\n", | |
"0 Earth #31AAE4 12756 218 66 -12 440\n", | |
"1 Jupiter #972626 142984 285 131 -193 -183\n", | |
"2 Mars #B78463 6792 122 157 144 -89\n", | |
"3 Saturn #FFCF98 120536 193 205 -79 -341\n", | |
"4 Venus #C7B04A 12104 77 93 188 153\n", | |
"5 Uranus #DDEEF6 51118 349 163 -169 -205\n", | |
"6 Neptune #6C83AF 49528 407 203 -110 -69\n", | |
"7 Mercury #8A8685 4879 32 123 250 43" | |
] | |
}, | |
"execution_count": 2, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Radius in km\n", | |
"# px,py in pixels at 80 dpi\n", | |
"data = \"\"\"Planet,Color,Radius,px,py,nx,ny\n", | |
"Earth,#31AAE4,12756,218,66,-12,440\n", | |
"Jupiter,#972626,142984,285,131,-193,-183\n", | |
"Mars,#B78463,6792,122,157,144,-89\n", | |
"Saturn,#FFCF98,120536,193,205,-79,-341\n", | |
"Venus,#C7B04A,12104,77,93,188,153\n", | |
"Uranus,#DDEEF6,51118,349,163,-169,-205\n", | |
"Neptune,#6C83AF,49528,407,203,-110,-69\n", | |
"Mercury,#8A8685,4879,32,123,250,43\n", | |
"\"\"\"\n", | |
"df = pd.read_csv(StringIO(data))\n", | |
"df" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "b16c25b5-e4d5-48c4-81a1-96f3a43cbd2d", | |
"metadata": {}, | |
"source": [ | |
"## Calculations in mm" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "f9a8c410-d081-4c00-88ed-4e166dae14d9", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Planet</th>\n", | |
" <th>Color</th>\n", | |
" <th>Radius</th>\n", | |
" <th>px</th>\n", | |
" <th>py</th>\n", | |
" <th>nx</th>\n", | |
" <th>ny</th>\n", | |
" <th>|n|</th>\n", | |
" <th>ox</th>\n", | |
" <th>oy</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Earth</td>\n", | |
" <td>#31AAE4</td>\n", | |
" <td>12756</td>\n", | |
" <td>218</td>\n", | |
" <td>66</td>\n", | |
" <td>-12</td>\n", | |
" <td>440</td>\n", | |
" <td>440.163606</td>\n", | |
" <td>416.976600</td>\n", | |
" <td>-12682.043678</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Jupiter</td>\n", | |
" <td>#972626</td>\n", | |
" <td>142984</td>\n", | |
" <td>285</td>\n", | |
" <td>131</td>\n", | |
" <td>-193</td>\n", | |
" <td>-183</td>\n", | |
" <td>265.966163</td>\n", | |
" <td>103847.716095</td>\n", | |
" <td>98471.693888</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Mars</td>\n", | |
" <td>#B78463</td>\n", | |
" <td>6792</td>\n", | |
" <td>122</td>\n", | |
" <td>157</td>\n", | |
" <td>144</td>\n", | |
" <td>-89</td>\n", | |
" <td>169.283785</td>\n", | |
" <td>-5738.829565</td>\n", | |
" <td>3609.590877</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>Saturn</td>\n", | |
" <td>#FFCF98</td>\n", | |
" <td>120536</td>\n", | |
" <td>193</td>\n", | |
" <td>205</td>\n", | |
" <td>-79</td>\n", | |
" <td>-341</td>\n", | |
" <td>350.031427</td>\n", | |
" <td>27265.531922</td>\n", | |
" <td>117487.236459</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>Venus</td>\n", | |
" <td>#C7B04A</td>\n", | |
" <td>12104</td>\n", | |
" <td>77</td>\n", | |
" <td>93</td>\n", | |
" <td>188</td>\n", | |
" <td>153</td>\n", | |
" <td>242.390181</td>\n", | |
" <td>-9363.523529</td>\n", | |
" <td>-7615.762965</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>Uranus</td>\n", | |
" <td>#DDEEF6</td>\n", | |
" <td>51118</td>\n", | |
" <td>349</td>\n", | |
" <td>163</td>\n", | |
" <td>-169</td>\n", | |
" <td>-205</td>\n", | |
" <td>265.680259</td>\n", | |
" <td>32627.118775</td>\n", | |
" <td>39553.670290</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>Neptune</td>\n", | |
" <td>#6C83AF</td>\n", | |
" <td>49528</td>\n", | |
" <td>407</td>\n", | |
" <td>203</td>\n", | |
" <td>-110</td>\n", | |
" <td>-69</td>\n", | |
" <td>129.849913</td>\n", | |
" <td>42085.969786</td>\n", | |
" <td>26447.545797</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>Mercury</td>\n", | |
" <td>#8A8685</td>\n", | |
" <td>4879</td>\n", | |
" <td>32</td>\n", | |
" <td>123</td>\n", | |
" <td>250</td>\n", | |
" <td>43</td>\n", | |
" <td>253.671047</td>\n", | |
" <td>-4798.232661</td>\n", | |
" <td>-816.883538</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Planet Color Radius px py nx ny |n| ox \\\n", | |
"0 Earth #31AAE4 12756 218 66 -12 440 440.163606 416.976600 \n", | |
"1 Jupiter #972626 142984 285 131 -193 -183 265.966163 103847.716095 \n", | |
"2 Mars #B78463 6792 122 157 144 -89 169.283785 -5738.829565 \n", | |
"3 Saturn #FFCF98 120536 193 205 -79 -341 350.031427 27265.531922 \n", | |
"4 Venus #C7B04A 12104 77 93 188 153 242.390181 -9363.523529 \n", | |
"5 Uranus #DDEEF6 51118 349 163 -169 -205 265.680259 32627.118775 \n", | |
"6 Neptune #6C83AF 49528 407 203 -110 -69 129.849913 42085.969786 \n", | |
"7 Mercury #8A8685 4879 32 123 250 43 253.671047 -4798.232661 \n", | |
"\n", | |
" oy \n", | |
"0 -12682.043678 \n", | |
"1 98471.693888 \n", | |
"2 3609.590877 \n", | |
"3 117487.236459 \n", | |
"4 -7615.762965 \n", | |
"5 39553.670290 \n", | |
"6 26447.545797 \n", | |
"7 -816.883538 " | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df[\"|n|\"] = np.sqrt(df.nx**2 + df.ny**2)\n", | |
"radius_unit = 1 # Should be 10**6\n", | |
"df[\"ox\"] = df.px * 254 / 800 - df.Radius* radius_unit * df.nx / df[\"|n|\"]\n", | |
"df[\"oy\"] = df.px * 254 / 800 - df.Radius* radius_unit * df.ny / df[\"|n|\"]\n", | |
"df" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "e5022a99-5a47-4287-9244-684898a6f5dd", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/svg+xml": [ | |
"<svg baseProfile=\"full\" height=\"100%\" version=\"1.1\" viewBox=\"0,0,140.96999999999997,80.3275\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><defs /><rect fill=\"black\" height=\"89.2\" width=\"141\" x=\"0\" y=\"0\" /><circle cx=\"416.97660030490215\" cy=\"-12682.04367784641\" fill=\"#31AAE4\" fill-opacity=\"0.75\" r=\"12749.596436740605\" /><circle cx=\"103847.71609481132\" cy=\"98471.69388782627\" fill=\"#972626\" fill-opacity=\"0.75\" r=\"142815.01405410303\" /><circle cx=\"-5738.829565194107\" cy=\"3609.5908770991355\" fill=\"#B78463\" fill-opacity=\"0.75\" r=\"6802.18398434514\" /><circle cx=\"27265.531921516143\" cy=\"117487.23645869626\" fill=\"#FFCF98\" fill-opacity=\"0.75\" r=\"120366.29500568277\" /><circle cx=\"-9363.523529249249\" cy=\"-7615.762965293271\" fill=\"#C7B04A\" fill-opacity=\"0.75\" r=\"12188.047873280848\" /><circle cx=\"32627.118775370553\" cy=\"39553.670289650676\" fill=\"#DDEEF6\" fill-opacity=\"0.75\" r=\"50926.43574357917\" /><circle cx=\"42085.969785851994\" cy=\"26447.545797488976\" fill=\"#6C83AF\" fill-opacity=\"0.75\" r=\"49253.55526788355\" /><circle cx=\"-4798.232661444714\" cy=\"-816.8835377684908\" fill=\"#8A8685\" fill-opacity=\"0.75\" r=\"4920.826010768466\" /></svg>" | |
], | |
"text/plain": [ | |
"<svgwrite.drawing.Drawing at 0x10b96beb0>" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"dia = svgwrite.Drawing()\n", | |
"dia.viewbox(0, 0, 444*25.4/80, 253*25.4/80)\n", | |
"dia.add(dia.rect((0,0), (141,89.2), fill=\"black\"))\n", | |
"for _, row in df.iterrows():\n", | |
" dia.add(dia.circle(center=(row[\"ox\"], row[\"oy\"]),\n", | |
" #r=row[\"Radius\"]*radius_unit, # doesn't work due to rounding\n", | |
" r=np.sqrt((row.px - row.ox)**2 + (row.py - row.oy)**2),\n", | |
" fill=row[\"Color\"], fill_opacity=.75))\n", | |
"# with open(\"1_to_1_scale.svg\",'w') as file:\n", | |
"# dia.write(file)\n", | |
"dia" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"id": "75986d99-26f1-4a86-b7a6-666572a8c70b", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/svg+xml": [ | |
"<svg baseProfile=\"full\" height=\"100%\" version=\"1.1\" viewBox=\"-93270.46807848386,-44512.30611217373,340102.18417329516,285968.0\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><defs /><rect fill=\"black\" height=\"89.2\" width=\"141\" x=\"0\" y=\"0\" /><circle cx=\"416.97660030490215\" cy=\"-12682.04367784641\" fill=\"#31AAE4\" fill-opacity=\"0.75\" r=\"12749.596436740605\" /><circle cx=\"103847.71609481132\" cy=\"98471.69388782627\" fill=\"#972626\" fill-opacity=\"0.75\" r=\"142815.01405410303\" /><circle cx=\"-5738.829565194107\" cy=\"3609.5908770991355\" fill=\"#B78463\" fill-opacity=\"0.75\" r=\"6802.18398434514\" /><circle cx=\"27265.531921516143\" cy=\"117487.23645869626\" fill=\"#FFCF98\" fill-opacity=\"0.75\" r=\"120366.29500568277\" /><circle cx=\"-9363.523529249249\" cy=\"-7615.762965293271\" fill=\"#C7B04A\" fill-opacity=\"0.75\" r=\"12188.047873280848\" /><circle cx=\"32627.118775370553\" cy=\"39553.670289650676\" fill=\"#DDEEF6\" fill-opacity=\"0.75\" r=\"50926.43574357917\" /><circle cx=\"42085.969785851994\" cy=\"26447.545797488976\" fill=\"#6C83AF\" fill-opacity=\"0.75\" r=\"49253.55526788355\" /><circle cx=\"-4798.232661444714\" cy=\"-816.8835377684908\" fill=\"#8A8685\" fill-opacity=\"0.75\" r=\"4920.826010768466\" /></svg>" | |
], | |
"text/plain": [ | |
"<svgwrite.drawing.Drawing at 0x10b96beb0>" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"minx = (df.ox-df.Radius*radius_unit).min()\n", | |
"miny = (df.oy-df.Radius*radius_unit).min()\n", | |
"maxx = (df.ox+df.Radius*radius_unit).max()\n", | |
"maxy = (df.oy+df.Radius*radius_unit).max()\n", | |
"dia.viewbox(minx=minx, miny=miny, width=maxx-minx, height=maxy-miny)\n", | |
"\n", | |
"# with open(\"1_to_many_scale.svg\",'w') as file:\n", | |
"# dia.write(file)\n", | |
"dia" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "0febdeff-6180-475f-923a-54d9ab1d1db9", | |
"metadata": { | |
"tags": [] | |
}, | |
"source": [ | |
"## Calculate in pixels" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"id": "d6292d8a-6a43-4934-86e0-afc82087375d", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [], | |
"source": [ | |
"radius_unit = 1*254/800 # Should be 10**6 km/mm * 25.4 mm/in / 80 px/in\n", | |
"df[\"ox\"] = df.px - df.Radius* radius_unit * df.nx / df[\"|n|\"]\n", | |
"df[\"oy\"] = df.px - df.Radius* radius_unit * df.ny / df[\"|n|\"]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"id": "ba7cac0d-44e2-4a87-be9b-f1d43903fc94", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/svg+xml": [ | |
"<svg baseProfile=\"full\" height=\"100%\" version=\"1.1\" viewBox=\"0,0,444,253\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><defs /><rect fill=\"black\" height=\"253\" width=\"444\" x=\"0\" y=\"0\" /><circle cx=\"328.4143080968064\" cy=\"-3830.524630216236\" fill=\"#31AAE4\" fill-opacity=\"1\" r=\"3898.0887000316284\" /><circle cx=\"33227.92007885259\" cy=\"31521.03302813484\" fill=\"#972626\" fill-opacity=\"1\" r=\"45503.51807090376\" /><circle cx=\"-1712.3767494491287\" cy=\"1255.7467409789754\" fill=\"#B78463\" fill-opacity=\"1\" r=\"2138.2662275150565\" /><circle cx=\"8830.350778831376\" cy=\"37475.741969386065\" fill=\"#FFCF98\" fill-opacity=\"1\" r=\"38258.489716991375\" /><circle cx=\"-2903.6808017866365\" cy=\"-2348.7668227306135\" fill=\"#C7B04A\" fill-opacity=\"1\" r=\"3853.139402970957\" /><circle cx=\"10672.92882993015\" cy=\"12872.108935714088\" fill=\"#DDEEF6\" fill-opacity=\"1\" r=\"16373.910846994086\" /><circle cx=\"13728.267263258007\" cy=\"8763.06764695275\" fill=\"#6C83AF\" fill-opacity=\"1\" r=\"15834.485139074042\" /><circle cx=\"-1494.6646700086967\" cy=\"-230.58632324149585\" fill=\"#8A8685\" fill-opacity=\"1\" r=\"1567.0763550753366\" /></svg>" | |
], | |
"text/plain": [ | |
"<svgwrite.drawing.Drawing at 0x10ba04940>" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"dia = svgwrite.Drawing()\n", | |
"dia.viewbox(0, 0, 444, 253)\n", | |
"dia.add(dia.rect((0,0), (444, 253), fill=\"black\"))\n", | |
"for _, row in df.iterrows():\n", | |
" dia.add(dia.circle(center=(row[\"ox\"], row[\"oy\"]),\n", | |
" #r=row[\"Radius\"]*radius_unit, # doesn't work due to rounding\n", | |
" r=np.sqrt((row.px - row.ox)**2 + (row.py - row.oy)**2),\n", | |
" fill=row[\"Color\"], fill_opacity=1))\n", | |
"with open(\"1_to_1_scale.svg\",'w') as file:\n", | |
" dia.write(file)\n", | |
"dia" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"id": "546b2e5a-bcfa-4198-badb-3d0c24bae895", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/svg+xml": [ | |
"<svg baseProfile=\"full\" height=\"100%\" version=\"1.1\" viewBox=\"-29439.829221168624,-13876.386971865159,108065.16930002121,90794.84\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><defs /><rect fill=\"black\" height=\"253\" width=\"444\" x=\"0\" y=\"0\" /><circle cx=\"328.4143080968064\" cy=\"-3830.524630216236\" fill=\"#31AAE4\" fill-opacity=\"0.75\" r=\"3898.0887000316284\" /><circle cx=\"33227.92007885259\" cy=\"31521.03302813484\" fill=\"#972626\" fill-opacity=\"0.75\" r=\"45503.51807090376\" /><circle cx=\"-1712.3767494491287\" cy=\"1255.7467409789754\" fill=\"#B78463\" fill-opacity=\"0.75\" r=\"2138.2662275150565\" /><circle cx=\"8830.350778831376\" cy=\"37475.741969386065\" fill=\"#FFCF98\" fill-opacity=\"0.75\" r=\"38258.489716991375\" /><circle cx=\"-2903.6808017866365\" cy=\"-2348.7668227306135\" fill=\"#C7B04A\" fill-opacity=\"0.75\" r=\"3853.139402970957\" /><circle cx=\"10672.92882993015\" cy=\"12872.108935714088\" fill=\"#DDEEF6\" fill-opacity=\"0.75\" r=\"16373.910846994086\" /><circle cx=\"13728.267263258007\" cy=\"8763.06764695275\" fill=\"#6C83AF\" fill-opacity=\"0.75\" r=\"15834.485139074042\" /><circle cx=\"-1494.6646700086967\" cy=\"-230.58632324149585\" fill=\"#8A8685\" fill-opacity=\"0.75\" r=\"1567.0763550753366\" /><text color=\"black\" font-size=\"2000\" text-anchor=\"middle\" x=\"328.4143080968064\" y=\"-3830.524630216236\">Earth</text><text color=\"black\" font-size=\"2000\" text-anchor=\"middle\" x=\"33227.92007885259\" y=\"31521.03302813484\">Jupiter</text><text color=\"black\" font-size=\"2000\" text-anchor=\"middle\" x=\"-1712.3767494491287\" y=\"1255.7467409789754\">Mars</text><text color=\"black\" font-size=\"2000\" text-anchor=\"middle\" x=\"8830.350778831376\" y=\"37475.741969386065\">Saturn</text><text color=\"black\" font-size=\"2000\" text-anchor=\"middle\" x=\"-2903.6808017866365\" y=\"-2348.7668227306135\">Venus</text><text color=\"black\" font-size=\"2000\" text-anchor=\"middle\" x=\"10672.92882993015\" y=\"12872.108935714088\">Uranus</text><text color=\"black\" font-size=\"2000\" text-anchor=\"middle\" x=\"13728.267263258007\" y=\"8763.06764695275\">Neptune</text><text color=\"black\" font-size=\"2000\" text-anchor=\"middle\" x=\"-1494.6646700086967\" y=\"-230.58632324149585\">Mercury</text></svg>" | |
], | |
"text/plain": [ | |
"<svgwrite.drawing.Drawing at 0x108ae4250>" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"minx = (df.ox-df.Radius*radius_unit).min()\n", | |
"miny = (df.oy-df.Radius*radius_unit).min()\n", | |
"maxx = (df.ox+df.Radius*radius_unit).max()\n", | |
"maxy = (df.oy+df.Radius*radius_unit).max()\n", | |
"dia = svgwrite.Drawing()\n", | |
"dia.viewbox(minx=minx, miny=miny, width=maxx-minx, height=maxy-miny)\n", | |
"dia.add(dia.rect((0,0), (444, 253), fill=\"black\"))\n", | |
"for _, row in df.iterrows():\n", | |
" dia.add(dia.circle(center=(row[\"ox\"], row[\"oy\"]),\n", | |
" #r=row[\"Radius\"]*radius_unit, # doesn't work due to rounding\n", | |
" r=np.sqrt((row.px - row.ox)**2 + (row.py - row.oy)**2),\n", | |
" fill=row[\"Color\"], fill_opacity=.75))\n", | |
" \n", | |
"for _, row in df.iterrows():\n", | |
" dia.add(dia.text(row.Planet, x=[row.ox], y=[row.oy], color=\"black\", font_size=2000, text_anchor=\"middle\"))\n", | |
"\n", | |
"# with open(\"1_to_many_scale.svg\",'w') as file:\n", | |
"# dia.write(file)\n", | |
"dia" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "eea1d10c-5da8-4b80-b9ce-b73af4e80895", | |
"metadata": {}, | |
"source": [ | |
"## calculate in km" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"id": "d37bddaf-71ec-4de6-b7d6-053801f4eb99", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Planet</th>\n", | |
" <th>Color</th>\n", | |
" <th>Radius</th>\n", | |
" <th>px</th>\n", | |
" <th>py</th>\n", | |
" <th>nx</th>\n", | |
" <th>ny</th>\n", | |
" <th>|n|</th>\n", | |
" <th>ox</th>\n", | |
" <th>oy</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Earth</td>\n", | |
" <td>#31AAE4</td>\n", | |
" <td>12756</td>\n", | |
" <td>218</td>\n", | |
" <td>66</td>\n", | |
" <td>-12</td>\n", | |
" <td>440</td>\n", | |
" <td>440.163606</td>\n", | |
" <td>347.761670</td>\n", | |
" <td>-12751.258609</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Jupiter</td>\n", | |
" <td>#972626</td>\n", | |
" <td>142984</td>\n", | |
" <td>285</td>\n", | |
" <td>131</td>\n", | |
" <td>-193</td>\n", | |
" <td>-183</td>\n", | |
" <td>265.966163</td>\n", | |
" <td>103757.228685</td>\n", | |
" <td>98381.206478</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Mars</td>\n", | |
" <td>#B78463</td>\n", | |
" <td>6792</td>\n", | |
" <td>122</td>\n", | |
" <td>157</td>\n", | |
" <td>144</td>\n", | |
" <td>-89</td>\n", | |
" <td>169.283785</td>\n", | |
" <td>-5777.564526</td>\n", | |
" <td>3570.855916</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>Saturn</td>\n", | |
" <td>#FFCF98</td>\n", | |
" <td>120536</td>\n", | |
" <td>193</td>\n", | |
" <td>205</td>\n", | |
" <td>-79</td>\n", | |
" <td>-341</td>\n", | |
" <td>350.031427</td>\n", | |
" <td>27204.254483</td>\n", | |
" <td>117425.959020</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>Venus</td>\n", | |
" <td>#C7B04A</td>\n", | |
" <td>12104</td>\n", | |
" <td>77</td>\n", | |
" <td>93</td>\n", | |
" <td>188</td>\n", | |
" <td>153</td>\n", | |
" <td>242.390181</td>\n", | |
" <td>-9387.971005</td>\n", | |
" <td>-7640.210441</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>Uranus</td>\n", | |
" <td>#DDEEF6</td>\n", | |
" <td>51118</td>\n", | |
" <td>349</td>\n", | |
" <td>163</td>\n", | |
" <td>-169</td>\n", | |
" <td>-205</td>\n", | |
" <td>265.680259</td>\n", | |
" <td>32516.311386</td>\n", | |
" <td>39442.862900</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>Neptune</td>\n", | |
" <td>#6C83AF</td>\n", | |
" <td>49528</td>\n", | |
" <td>407</td>\n", | |
" <td>203</td>\n", | |
" <td>-110</td>\n", | |
" <td>-69</td>\n", | |
" <td>129.849913</td>\n", | |
" <td>41956.747415</td>\n", | |
" <td>26318.323427</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>Mercury</td>\n", | |
" <td>#8A8685</td>\n", | |
" <td>4879</td>\n", | |
" <td>32</td>\n", | |
" <td>123</td>\n", | |
" <td>250</td>\n", | |
" <td>43</td>\n", | |
" <td>253.671047</td>\n", | |
" <td>-4808.392651</td>\n", | |
" <td>-827.043528</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Planet Color Radius px py nx ny |n| ox \\\n", | |
"0 Earth #31AAE4 12756 218 66 -12 440 440.163606 347.761670 \n", | |
"1 Jupiter #972626 142984 285 131 -193 -183 265.966163 103757.228685 \n", | |
"2 Mars #B78463 6792 122 157 144 -89 169.283785 -5777.564526 \n", | |
"3 Saturn #FFCF98 120536 193 205 -79 -341 350.031427 27204.254483 \n", | |
"4 Venus #C7B04A 12104 77 93 188 153 242.390181 -9387.971005 \n", | |
"5 Uranus #DDEEF6 51118 349 163 -169 -205 265.680259 32516.311386 \n", | |
"6 Neptune #6C83AF 49528 407 203 -110 -69 129.849913 41956.747415 \n", | |
"7 Mercury #8A8685 4879 32 123 250 43 253.671047 -4808.392651 \n", | |
"\n", | |
" oy \n", | |
"0 -12751.258609 \n", | |
"1 98381.206478 \n", | |
"2 3570.855916 \n", | |
"3 117425.959020 \n", | |
"4 -7640.210441 \n", | |
"5 39442.862900 \n", | |
"6 26318.323427 \n", | |
"7 -827.043528 " | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"pixel_scale = 254/800*10**-6\n", | |
"df[\"ox\"] = df.px* pixel_scale - df.Radius * df.nx / df[\"|n|\"]\n", | |
"df[\"oy\"] = df.px* pixel_scale - df.Radius * df.ny / df[\"|n|\"]\n", | |
"df" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"id": "50b8305a-47ab-4e00-8ceb-f3c0d71e92e8", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/svg+xml": [ | |
"<svg baseProfile=\"full\" height=\"100%\" version=\"1.1\" viewBox=\"-93331.74551720635,-44602.793521686224,340072.9742025052,285968.0\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><defs /><rect fill=\"black\" height=\"285968.0\" width=\"340072.9742025052\" x=\"-93331.74551720635\" y=\"-44602.793521686224\" /><rect fill=\"black\" height=\"8.03275e-05\" width=\"0.00014097\" x=\"0\" y=\"0\" /><circle cx=\"347.7616695199021\" cy=\"-12751.25860863141\" fill=\"#31AAE4\" fill-opacity=\"0.8\" r=\"12755.999951757936\" /><circle cx=\"103757.22868529882\" cy=\"98381.20647831378\" fill=\"#972626\" fill-opacity=\"0.8\" r=\"142984.00003364257\" /><circle cx=\"-5777.564526459107\" cy=\"3570.8559158341354\" fill=\"#B78463\" fill-opacity=\"0.8\" r=\"6791.999994157665\" /><circle cx=\"27204.254482793644\" cy=\"117425.95901997377\" fill=\"#FFCF98\" fill-opacity=\"0.8\" r=\"120535.99999628832\" /><circle cx=\"-9387.97100480175\" cy=\"-7640.210440845771\" fill=\"#C7B04A\" fill-opacity=\"0.8\" r=\"12104.000003206567\" /><circle cx=\"32516.311386178055\" cy=\"39442.862900458174\" fill=\"#DDEEF6\" fill-opacity=\"0.8\" r=\"51118.00004556709\" /><circle cx=\"41956.74741507449\" cy=\"26318.323426711475\" fill=\"#6C83AF\" fill-opacity=\"0.8\" r=\"49528.00003441765\" /><circle cx=\"-4808.392651284714\" cy=\"-827.0435276084908\" fill=\"#8A8685\" fill-opacity=\"0.8\" r=\"4879.000004897593\" /><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"347.7616695199021\" y=\"-12751.25860863141\">Earth</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"103757.22868529882\" y=\"98381.20647831378\">Jupiter</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"-5777.564526459107\" y=\"3570.8559158341354\">Mars</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"27204.254482793644\" y=\"117425.95901997377\">Saturn</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"-9387.97100480175\" y=\"-7640.210440845771\">Venus</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"32516.311386178055\" y=\"39442.862900458174\">Uranus</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"41956.74741507449\" y=\"26318.323426711475\">Neptune</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"-4808.392651284714\" y=\"-827.0435276084908\">Mercury</text></svg>" | |
], | |
"text/plain": [ | |
"<svgwrite.drawing.Drawing at 0x10b96bfd0>" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"dia = svgwrite.Drawing()\n", | |
"\n", | |
"minx = (df.ox-df.Radius).min()\n", | |
"miny = (df.oy-df.Radius).min()\n", | |
"maxx = (df.ox+df.Radius).max()\n", | |
"maxy = (df.oy+df.Radius).max()\n", | |
"dia.viewbox(minx=minx, miny=miny, width=maxx-minx, height=maxy-miny)\n", | |
"\n", | |
"dia.add(dia.rect((minx, miny), (maxx-minx, maxy-miny), fill=\"black\"))\n", | |
"dia.add(dia.rect((0,0), (444*pixel_scale, 253*pixel_scale), fill=\"black\"))\n", | |
"for _, row in df.iterrows():\n", | |
" dia.add(dia.circle(center=(row[\"ox\"], row[\"oy\"]),\n", | |
" #r=row[\"Radius\"]*radius_unit,\n", | |
" r=np.sqrt((row.px*pixel_scale - row.ox)**2 + (row.py*pixel_scale - row.oy)**2),\n", | |
" fill=row[\"Color\"], fill_opacity=.8))\n", | |
"for _, row in df.iterrows():\n", | |
" dia.add(dia.text(row.Planet, x=[row.ox], y=[row.oy], color=\"black\", font_size=3000, text_anchor=\"middle\"))\n", | |
"\n", | |
"with open(\"1_to_many_scale.svg\",'w') as file:\n", | |
" dia.write(file)\n", | |
"dia" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"id": "ed6b53c1-e23b-4575-96b4-5bdb202d0210", | |
"metadata": { | |
"tags": [] | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/svg+xml": [ | |
"<svg baseProfile=\"full\" height=\"100%\" version=\"1.1\" viewBox=\"0,0,0.00014097,8.03275e-05\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><defs /><rect fill=\"black\" height=\"285968.0\" width=\"340072.9742025052\" x=\"-93331.74551720635\" y=\"-44602.793521686224\" /><rect fill=\"black\" height=\"8.03275e-05\" width=\"0.00014097\" x=\"0\" y=\"0\" /><circle cx=\"347.7616695199021\" cy=\"-12751.25860863141\" fill=\"#31AAE4\" fill-opacity=\"0.8\" r=\"12755.999951757936\" /><circle cx=\"103757.22868529882\" cy=\"98381.20647831378\" fill=\"#972626\" fill-opacity=\"0.8\" r=\"142984.00003364257\" /><circle cx=\"-5777.564526459107\" cy=\"3570.8559158341354\" fill=\"#B78463\" fill-opacity=\"0.8\" r=\"6791.999994157665\" /><circle cx=\"27204.254482793644\" cy=\"117425.95901997377\" fill=\"#FFCF98\" fill-opacity=\"0.8\" r=\"120535.99999628832\" /><circle cx=\"-9387.97100480175\" cy=\"-7640.210440845771\" fill=\"#C7B04A\" fill-opacity=\"0.8\" r=\"12104.000003206567\" /><circle cx=\"32516.311386178055\" cy=\"39442.862900458174\" fill=\"#DDEEF6\" fill-opacity=\"0.8\" r=\"51118.00004556709\" /><circle cx=\"41956.74741507449\" cy=\"26318.323426711475\" fill=\"#6C83AF\" fill-opacity=\"0.8\" r=\"49528.00003441765\" /><circle cx=\"-4808.392651284714\" cy=\"-827.0435276084908\" fill=\"#8A8685\" fill-opacity=\"0.8\" r=\"4879.000004897593\" /><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"347.7616695199021\" y=\"-12751.25860863141\">Earth</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"103757.22868529882\" y=\"98381.20647831378\">Jupiter</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"-5777.564526459107\" y=\"3570.8559158341354\">Mars</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"27204.254482793644\" y=\"117425.95901997377\">Saturn</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"-9387.97100480175\" y=\"-7640.210440845771\">Venus</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"32516.311386178055\" y=\"39442.862900458174\">Uranus</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"41956.74741507449\" y=\"26318.323426711475\">Neptune</text><text color=\"black\" font-size=\"3000\" text-anchor=\"middle\" x=\"-4808.392651284714\" y=\"-827.0435276084908\">Mercury</text></svg>" | |
], | |
"text/plain": [ | |
"<svgwrite.drawing.Drawing at 0x10b96bfd0>" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"dia.viewbox(0,0, 444*pixel_scale, 253*pixel_scale)\n", | |
"# with open(\"1_to_1_scale.svg\",'w') as file:\n", | |
"# dia.write(file)\n", | |
"dia\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "ab0edeb1-1543-4abe-9dde-f7708dffcaad", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "dc85c17c-a760-4056-876e-f3a5a973d482", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python [conda env:science]", | |
"language": "python", | |
"name": "conda-env-science-py" | |
}, | |
"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.15" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Code and images are released under the unlicense/CC0/public domain.