Skip to content

Instantly share code, notes, and snippets.

@sbliven
Created April 17, 2023 23:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sbliven/83324f3d59f7733828191733cd62ee00 to your computer and use it in GitHub Desktop.
Save sbliven/83324f3d59f7733828191733cd62ee00 to your computer and use it in GitHub Desktop.
SVG images for XKCD "1-to-1 scale" https://xkcd.com/2761/
Display the source blob
Display the rendered blob
Raw
{
"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
}
Display the source blob
Display the rendered blob
Raw
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
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@sbliven
Copy link
Author

sbliven commented Apr 17, 2023

Code and images are released under the unlicense/CC0/public domain.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment