Skip to content

Instantly share code, notes, and snippets.

@maxnoe
Last active June 11, 2021 10:21
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 maxnoe/d3b620b89ca43b20b4b4abfd8b06ea20 to your computer and use it in GitHub Desktop.
Save maxnoe/d3b620b89ca43b20b4b4abfd8b06ea20 to your computer and use it in GitHub Desktop.
Perseverance flight to Mars animated using matplotlib / astropy / astroquery
name: eschool2021
channels:
- default
- conda-forge
dependencies:
- astropy=4.2
- numpy=1.20
- matplotlib=3.4
- astroquery
- jupyter
- notebook
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>.container { width:95% !important; }</style>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"\n",
"import astropy.units as u\n",
"from astropy.constants import c\n",
"from astropy.coordinates import get_body, SkyCoord, HeliocentricMeanEcliptic, HeliocentricEclipticIAU76\n",
"from astropy.time import Time\n",
"\n",
"\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.animation import FuncAnimation\n",
"\n",
"from IPython.core.display import display, HTML\n",
"from tqdm.notebook import tqdm\n",
"\n",
"from astroquery.jplhorizons import Horizons\n",
"\n",
"display(HTML(\"<style>.container { width:95% !important; }</style>\"))\n",
"%matplotlib notebook"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"perseverance_data = Horizons(id='-168', id_type='id', epochs={\n",
" 'start':'2020-07-30T13:00:00',\n",
" 'stop':'2021-03-10',\n",
" 'step':'1d',\n",
"}).ephemerides()\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<i>Table masked=True length=223</i>\n",
"<table id=\"table140269397703888\" class=\"table-striped table-bordered table-condensed\">\n",
"<thead><tr><th>targetname</th><th>datetime_str</th><th>datetime_jd</th><th>solar_presence</th><th>flags</th><th>RA</th><th>DEC</th><th>RA_app</th><th>DEC_app</th><th>RA_rate</th><th>DEC_rate</th><th>AZ</th><th>EL</th><th>AZ_rate</th><th>EL_rate</th><th>sat_X</th><th>sat_Y</th><th>sat_PANG</th><th>siderealtime</th><th>airmass</th><th>magextinct</th><th>V</th><th>surfbright</th><th>illumination</th><th>illum_defect</th><th>sat_sep</th><th>sat_vis</th><th>ang_width</th><th>PDObsLon</th><th>PDObsLat</th><th>PDSunLon</th><th>PDSunLat</th><th>SubSol_ang</th><th>SubSol_dist</th><th>NPole_ang</th><th>NPole_dist</th><th>EclLon</th><th>EclLat</th><th>r</th><th>r_rate</th><th>delta</th><th>delta_rate</th><th>lighttime</th><th>vel_sun</th><th>vel_obs</th><th>elong</th><th>elongFlag</th><th>alpha</th><th>lunar_elong</th><th>lunar_illum</th><th>sat_alpha</th><th>sunTargetPA</th><th>velocityPA</th><th>OrbPlaneAng</th><th>constellation</th><th>TDB-UT</th><th>ObsEclLon</th><th>ObsEclLat</th><th>NPole_RA</th><th>NPole_DEC</th><th>GlxLon</th><th>GlxLat</th><th>solartime</th><th>earth_lighttime</th><th>RA_3sigma</th><th>DEC_3sigma</th><th>SMAA_3sigma</th><th>SMIA_3sigma</th><th>Theta_3sigma</th><th>Area_3sigma</th><th>RSS_3sigma</th><th>r_3sigma</th><th>r_rate_3sigma</th><th>SBand_3sigma</th><th>XBand_3sigma</th><th>DoppDelay_3sigma</th><th>true_anom</th><th>hour_angle</th><th>alpha_true</th><th>PABLon</th><th>PABLat</th></tr></thead>\n",
"<thead><tr><th>---</th><th>---</th><th>d</th><th>---</th><th>---</th><th>deg</th><th>deg</th><th>deg</th><th>deg</th><th>arcsec / h</th><th>arcsec / h</th><th>deg</th><th>deg</th><th>arcsec / min</th><th>arcsec / min</th><th>arcsec</th><th>arcsec</th><th>deg</th><th>---</th><th>---</th><th>mag</th><th>mag</th><th>mag / arcsec2</th><th>%</th><th>arcsec</th><th>arcsec</th><th>---</th><th>arcsec</th><th>deg</th><th>deg</th><th>deg</th><th>deg</th><th>deg</th><th>arcsec</th><th>deg</th><th>arcsec</th><th>deg</th><th>deg</th><th>AU</th><th>km / s</th><th>AU</th><th>km / s</th><th>min</th><th>km / s</th><th>km / s</th><th>deg</th><th>---</th><th>deg</th><th>deg</th><th>%</th><th>deg</th><th>deg</th><th>deg</th><th>deg</th><th>---</th><th>s</th><th>deg</th><th>deg</th><th>deg</th><th>deg</th><th>deg</th><th>deg</th><th>---</th><th>min</th><th>arcsec</th><th>arcsec</th><th>arcsec</th><th>arcsec</th><th>deg</th><th>arcsec2</th><th>arcsec</th><th>km</th><th>km / s</th><th>Hz</th><th>Hz</th><th>s</th><th>deg</th><th>---</th><th>deg</th><th>deg</th><th>deg</th></tr></thead>\n",
"<thead><tr><th>str28</th><th>str17</th><th>float64</th><th>str1</th><th>str1</th><th>float64</th><th>float64</th><th>float64</th><th>float64</th><th>float64</th><th>float64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>float64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>float64</th><th>float64</th><th>int64</th><th>int64</th><th>float64</th><th>float64</th><th>float64</th><th>float64</th><th>float64</th><th>float64</th><th>float64</th><th>float64</th><th>float64</th><th>float64</th><th>str2</th><th>float64</th><th>float64</th><th>float64</th><th>int64</th><th>float64</th><th>float64</th><th>float64</th><th>str3</th><th>float64</th><th>float64</th><th>float64</th><th>int64</th><th>int64</th><th>float64</th><th>float64</th><th>int64</th><th>float64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>int64</th><th>float64</th><th>float64</th><th>float64</th></tr></thead>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2020-Jul-30 13:00</td><td>2459061.041666667</td><td></td><td></td><td>309.05809</td><td>-1.74069</td><td>309.32565</td><td>-1.66812</td><td>340783.8</td><td>178329.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>97.89964</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>357.0</td><td>0.0</td><td>--</td><td>--</td><td>307.542</td><td>0.0033</td><td>1.015218994766</td><td>5.1107376</td><td>8.133306011e-05</td><td>6.3453809</td><td>0.00067643</td><td>36.3126238</td><td>8.943749</td><td>163.3324</td><td>/T</td><td>16.6671</td><td>55.6</td><td>81.6508</td><td>--</td><td>177.051</td><td>253.383</td><td>-15.94454</td><td>Aql</td><td>69.183292</td><td>311.3013988</td><td>16.3098854</td><td>--</td><td>--</td><td>43.926966</td><td>-23.994572</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>16.666</td><td>309.2384</td><td>8.161</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2020-Jul-31 13:00</td><td>2459062.041666667</td><td></td><td></td><td>6.26731</td><td>22.87891</td><td>6.53517</td><td>22.99049</td><td>350.9794</td><td>99.2852</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>68.94883</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>57.58</td><td>0.0</td><td>--</td><td>--</td><td>308.6276</td><td>0.0492</td><td>1.016013696339</td><td>1.2087007</td><td>0.00264377526846</td><td>4.0538476</td><td>0.02198761</td><td>32.9872278</td><td>4.0585086</td><td>112.1309</td><td>/L</td><td>67.7317</td><td>104.1</td><td>89.3402</td><td>--</td><td>237.559</td><td>280.649</td><td>-16.4387</td><td>And</td><td>69.183266</td><td>15.3741823</td><td>18.4624889</td><td>--</td><td>--</td><td>115.046643</td><td>-39.589479</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>67.7297</td><td>340.8638</td><td>11.0236</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2020-Aug-01 13:00</td><td>2459063.041666667</td><td></td><td></td><td>7.6269</td><td>23.22603</td><td>7.89603</td><td>23.3373</td><td>101.0336</td><td>27.36088</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>68.76863</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>57.91</td><td>0.0</td><td>--</td><td>--</td><td>309.6977</td><td>0.0893</td><td>1.016730970983</td><td>1.2835303</td><td>0.00494491213712</td><td>3.9385694</td><td>0.04112558</td><td>32.8625405</td><td>3.9399541</td><td>111.7873</td><td>/L</td><td>67.9547</td><td>93.0</td><td>95.0424</td><td>--</td><td>237.892</td><td>281.116</td><td>-16.26872</td><td>And</td><td>69.18324</td><td>16.7250226</td><td>18.2577494</td><td>--</td><td>--</td><td>116.709654</td><td>-39.393397</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>67.9527</td><td>342.0914</td><td>10.9435</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2020-Aug-02 13:00</td><td>2459064.041666667</td><td></td><td></td><td>8.12978</td><td>23.34964</td><td>8.39946</td><td>23.46083</td><td>47.45699</td><td>12.46667</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>69.22104</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>57.82</td><td>0.0</td><td>--</td><td>--</td><td>310.7642</td><td>0.1286</td><td>1.017500503814</td><td>1.382957</td><td>0.00720503408669</td><td>3.8938951</td><td>0.05992244</td><td>32.8032993</td><td>3.8945495</td><td>112.2309</td><td>/L</td><td>67.3943</td><td>81.3</td><td>98.5771</td><td>--</td><td>237.8</td><td>280.506</td><td>-16.20276</td><td>And</td><td>69.183214</td><td>17.2215951</td><td>18.1786585</td><td>--</td><td>--</td><td>117.320057</td><td>-39.316511</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>67.3922</td><td>342.8919</td><td>10.8852</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2020-Aug-03 13:00</td><td>2459065.041666667</td><td></td><td></td><td>8.39026</td><td>23.41144</td><td>8.66028</td><td>23.52262</td><td>26.92764</td><td>6.773788</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>69.84725</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>57.61</td><td>0.0</td><td>--</td><td>--</td><td>311.8282</td><td>0.1674</td><td>1.018329460497</td><td>1.4881924</td><td>0.00944581941393</td><td>3.8683508</td><td>0.07855848</td><td>32.761166</td><td>3.868714</td><td>112.8963</td><td>/L</td><td>66.6148</td><td>69.7</td><td>99.8945</td><td>--</td><td>237.585</td><td>279.62</td><td>-16.16692</td><td>And</td><td>69.183189</td><td>17.4776733</td><td>18.1358764</td><td>--</td><td>--</td><td>117.635127</td><td>-39.27698</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>66.6127</td><td>343.571</td><td>10.8346</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2020-Aug-04 13:00</td><td>2459066.041666667</td><td></td><td></td><td>8.54448</td><td>23.44592</td><td>8.81474</td><td>23.55711</td><td>16.51763</td><td>3.816229</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>70.54509</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>57.34</td><td>0.0</td><td>--</td><td>--</td><td>312.8898</td><td>0.206</td><td>1.019219838081</td><td>1.5953145</td><td>0.01167434832698</td><td>3.8504356</td><td>0.09709259</td><td>32.7253181</td><td>3.8506439</td><td>113.6589</td><td>/L</td><td>65.7407</td><td>58.3</td><td>99.0634</td><td>--</td><td>237.314</td><td>278.642</td><td>-16.14409</td><td>And</td><td>69.183164</td><td>17.628345</td><td>18.1086964</td><td>--</td><td>--</td><td>117.821196</td><td>-39.255053</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>65.7385</td><td>344.1963</td><td>10.788</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2020-Aug-05 13:00</td><td>2459067.041666667</td><td></td><td></td><td>8.63995</td><td>23.4647</td><td>8.91039</td><td>23.57592</td><td>10.20649</td><td>1.92389</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>71.27867</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>57.03</td><td>0.0</td><td>--</td><td>--</td><td>313.9492</td><td>0.2443</td><td>1.020172278479</td><td>1.7029731</td><td>0.01389370824303</td><td>3.8361922</td><td>0.11555045</td><td>32.6919412</td><td>3.8363038</td><td>114.4752</td><td>/L</td><td>64.8153</td><td>47.5</td><td>96.2466</td><td>--</td><td>237.01</td><td>277.636</td><td>-16.12801</td><td>And</td><td>69.183139</td><td>17.7205166</td><td>18.0895774</td><td>--</td><td>--</td><td>117.936041</td><td>-39.24378</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>64.813</td><td>344.791</td><td>10.7438</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2020-Aug-06 13:00</td><td>2459068.041666667</td><td></td><td></td><td>8.69767</td><td>23.4726</td><td>8.96825</td><td>23.58386</td><td>5.906078</td><td>0.493597</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>72.03196</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>56.7</td><td>0.0</td><td>--</td><td>--</td><td>315.0064</td><td>0.2823</td><td>1.021186928207</td><td>1.8106783</td><td>0.01610561717771</td><td>3.8244531</td><td>0.13394633</td><td>32.6598602</td><td>3.8245024</td><td>115.3263</td><td>/L</td><td>63.8576</td><td>37.5</td><td>91.6708</td><td>--</td><td>236.682</td><td>276.63</td><td>-16.11561</td><td>And</td><td>69.183114</td><td>17.7747661</td><td>18.0748785</td><td>--</td><td>--</td><td>118.005116</td><td>-39.240316</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>63.8553</td><td>345.3657</td><td>10.7012</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2020-Aug-07 13:00</td><td>2459069.041666667</td><td></td><td></td><td>8.72809</td><td>23.47188</td><td>8.99877</td><td>23.58318</td><td>2.593198</td><td>-0.68661</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>72.79678</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>56.36</td><td>0.0</td><td>--</td><td>--</td><td>316.0612</td><td>0.3201</td><td>1.022263654554</td><td>1.9178951</td><td>0.01831099941586</td><td>3.8134961</td><td>0.15228794</td><td>32.6271909</td><td>3.8135095</td><td>116.2026</td><td>/L</td><td>62.8772</td><td>29.1</td><td>85.5962</td><td>--</td><td>236.335</td><td>275.636</td><td>-16.10533</td><td>And</td><td>69.18309</td><td>17.8012668</td><td>18.0627004</td><td>--</td><td>--</td><td>118.041029</td><td>-39.243309</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>62.8749</td><td>345.9253</td><td>10.6598</td></tr>\n",
"<tr><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2021-Feb-28 13:00</td><td>2459274.041666667</td><td></td><td></td><td>55.00881</td><td>21.03003</td><td>55.31124</td><td>21.09688</td><td>84.36913</td><td>20.43261</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>89.55496</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>256.6</td><td>0.0</td><td>--</td><td>--</td><td>95.3547</td><td>1.3268</td><td>1.58253813196</td><td>1.905746</td><td>1.4619136167453</td><td>16.6898031</td><td>12.15836481</td><td>23.4084518</td><td>30.5320102</td><td>77.7633</td><td>/T</td><td>37.7128</td><td>118.0</td><td>97.8885</td><td>--</td><td>76.499</td><td>253.964</td><td>-1.31081</td><td>Tau</td><td>69.185381</td><td>57.9175154</td><td>1.4394789</td><td>--</td><td>--</td><td>167.54225</td><td>-26.889158</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>37.7116</td><td>76.4893</td><td>1.4601</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2021-Mar-01 13:00</td><td>2459275.041666667</td><td></td><td></td><td>55.60995</td><td>21.16356</td><td>55.91286</td><td>21.22941</td><td>84.67227</td><td>20.18379</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>89.60487</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>256.79</td><td>0.0</td><td>--</td><td>--</td><td>95.8379</td><td>1.3375</td><td>1.583676283428</td><td>1.9333242</td><td>1.47165191322258</td><td>16.7000189</td><td>12.23935575</td><td>23.4006839</td><td>30.7391878</td><td>77.3367</td><td>/T</td><td>37.6192</td><td>131.9</td><td>93.3679</td><td>--</td><td>76.689</td><td>254.167</td><td>-1.30414</td><td>Tau</td><td>69.185397</td><td>58.4941697</td><td>1.4425428</td><td>--</td><td>--</td><td>167.90647</td><td>-26.413377</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>37.618</td><td>77.0192</td><td>1.467</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2021-Mar-02 13:00</td><td>2459276.041666667</td><td></td><td></td><td>56.21315</td><td>21.29517</td><td>56.51654</td><td>21.36001</td><td>84.96038</td><td>19.91823</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>89.65555</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>256.98</td><td>0.0</td><td>--</td><td>--</td><td>96.3205</td><td>1.3482</td><td>1.584808392013</td><td>1.9616275</td><td>1.48138074000161</td><td>16.7139499</td><td>12.32026793</td><td>23.3872901</td><td>30.9451447</td><td>76.9114</td><td>/T</td><td>37.524</td><td>145.9</td><td>86.4246</td><td>--</td><td>76.881</td><td>254.378</td><td>-1.29379</td><td>Tau</td><td>69.185413</td><td>59.0717747</td><td>1.4454601</td><td>--</td><td>--</td><td>168.268291</td><td>-25.935902</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>37.5228</td><td>77.5493</td><td>1.4738</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2021-Mar-03 13:00</td><td>2459277.041666667</td><td></td><td></td><td>56.81841</td><td>21.42484</td><td>57.12229</td><td>21.48865</td><td>85.23186</td><td>19.6357</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>89.70696</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>257.18</td><td>0.0</td><td>--</td><td>--</td><td>96.8023</td><td>1.3587</td><td>1.585934380454</td><td>1.9896039</td><td>1.49109967877687</td><td>16.7306173</td><td>12.40109788</td><td>23.3681633</td><td>31.1488135</td><td>76.4874</td><td>/T</td><td>37.4272</td><td>159.8</td><td>77.4911</td><td>--</td><td>77.075</td><td>254.599</td><td>-1.27967</td><td>Tau</td><td>69.185428</td><td>59.6503278</td><td>1.4482356</td><td>--</td><td>--</td><td>168.627765</td><td>-25.456761</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>37.426</td><td>78.0794</td><td>1.4804</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2021-Mar-04 13:00</td><td>2459278.041666667</td><td></td><td></td><td>57.4257</td><td>21.55254</td><td>57.73008</td><td>21.61531</td><td>85.48534</td><td>19.33626</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>89.75911</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>257.38</td><td>0.0</td><td>--</td><td>--</td><td>97.2834</td><td>1.3691</td><td>1.587054188774</td><td>2.0162079</td><td>1.50080823702704</td><td>16.7489151</td><td>12.4818415</td><td>23.3433579</td><td>31.3491426</td><td>76.0649</td><td>/T</td><td>37.3288</td><td>173.2</td><td>67.1421</td><td>--</td><td>77.271</td><td>254.829</td><td>-1.26175</td><td>Tau</td><td>69.185443</td><td>60.2298255</td><td>1.4508746</td><td>--</td><td>--</td><td>168.984948</td><td>-24.975978</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>37.3275</td><td>78.6097</td><td>1.4868</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2021-Mar-05 13:00</td><td>2459279.041666667</td><td></td><td></td><td>58.03502</td><td>21.67824</td><td>58.33992</td><td>21.73998</td><td>85.71978</td><td>19.02026</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>89.81198</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>257.57</td><td>0.0</td><td>--</td><td>--</td><td>97.7639</td><td>1.3794</td><td>1.58816777394</td><td>2.0404296</td><td>1.51050583922216</td><td>16.7676575</td><td>12.562494</td><td>23.3130879</td><td>31.5451342</td><td>75.6437</td><td>/T</td><td>37.2288</td><td>172.1</td><td>56.0163</td><td>--</td><td>77.469</td><td>255.068</td><td>-1.24009</td><td>Tau</td><td>69.185457</td><td>60.8102612</td><td>1.4533825</td><td>--</td><td>--</td><td>169.339896</td><td>-24.493576</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>37.2275</td><td>79.1402</td><td>1.4931</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2021-Mar-06 13:00</td><td>2459280.041666667</td><td></td><td></td><td>58.64634</td><td>21.80194</td><td>58.95177</td><td>21.86262</td><td>85.93449</td><td>18.68836</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>89.86555</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>257.77</td><td>0.0</td><td>--</td><td>--</td><td>98.2437</td><td>1.3896</td><td>1.589275109068</td><td>2.0613231</td><td>1.52019182930844</td><td>16.7856268</td><td>12.64304992</td><td>23.277722</td><td>31.7358848</td><td>75.2238</td><td>/T</td><td>37.1273</td><td>159.0</td><td>44.7489</td><td>--</td><td>77.668</td><td>255.316</td><td>-1.21487</td><td>Tau</td><td>69.185471</td><td>61.3916241</td><td>1.4557646</td><td>--</td><td>--</td><td>169.692664</td><td>-24.009578</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>37.1259</td><td>79.6707</td><td>1.4993</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2021-Mar-07 13:00</td><td>2459281.041666667</td><td></td><td></td><td>59.25967</td><td>21.92359</td><td>59.56563</td><td>21.98322</td><td>86.12916</td><td>18.34147</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>89.91981</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>257.98</td><td>0.0</td><td>--</td><td>--</td><td>98.7229</td><td>1.3997</td><td>1.590376182194</td><td>2.0780322</td><td>1.52986548140943</td><td>16.8016146</td><td>12.72350323</td><td>23.2377737</td><td>31.9206215</td><td>74.8052</td><td>/T</td><td>37.0242</td><td>145.9</td><td>33.925</td><td>--</td><td>77.87</td><td>255.571</td><td>-1.1863</td><td>Tau</td><td>69.185485</td><td>61.9738999</td><td>1.4580263</td><td>--</td><td>--</td><td>170.043306</td><td>-23.524007</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>37.0228</td><td>80.2014</td><td>1.5054</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2021-Mar-08 13:00</td><td>2459282.041666667</td><td></td><td></td><td>59.87498</td><td>22.04317</td><td>60.18145</td><td>22.10175</td><td>86.30393</td><td>17.98078</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>89.97475</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>258.18</td><td>0.0</td><td>--</td><td>--</td><td>99.2015</td><td>1.4097</td><td>1.59147099465</td><td>2.089815</td><td>1.53952601515492</td><td>16.8144585</td><td>12.80384744</td><td>23.1938885</td><td>32.0987325</td><td>74.388</td><td>/T</td><td>36.9195</td><td>133.0</td><td>24.053</td><td>--</td><td>78.073</td><td>255.834</td><td>-1.15471</td><td>Tau</td><td>69.185498</td><td>62.5570722</td><td>1.4601726</td><td>--</td><td>--</td><td>170.391873</td><td>-23.036889</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>36.9181</td><td>80.7322</td><td>1.5113</td></tr>\n",
"<tr><td>Mars2020 (spacecraft) (-168)</td><td>2021-Mar-09 13:00</td><td>2459283.041666667</td><td></td><td></td><td>60.49225</td><td>22.16067</td><td>60.79922</td><td>22.21818</td><td>86.45941</td><td>17.60769</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>999</td><td>--</td><td>--</td><td>--</td><td>90.03035</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>258.39</td><td>0.0</td><td>--</td><td>--</td><td>99.6794</td><td>1.4196</td><td>1.592559559094</td><td>2.0960639</td><td>1.54917261282642</td><td>16.8230746</td><td>12.88407575</td><td>23.1468267</td><td>32.2697894</td><td>73.9722</td><td>/T</td><td>36.8134</td><td>120.2</td><td>15.5525</td><td>--</td><td>78.278</td><td>256.104</td><td>-1.1205</td><td>Tau</td><td>69.185511</td><td>63.1411236</td><td>1.4622081</td><td>--</td><td>--</td><td>170.738419</td><td>-22.548248</td><td>--</td><td>0.0</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>36.8119</td><td>81.2632</td><td>1.5171</td></tr>\n",
"</table>"
],
"text/plain": [
"<Table masked=True length=223>\n",
" targetname datetime_str ... PABLon PABLat\n",
" --- --- ... deg deg \n",
" str28 str17 ... float64 float64\n",
"---------------------------- ----------------- ... -------- -------\n",
"Mars2020 (spacecraft) (-168) 2020-Jul-30 13:00 ... 309.2384 8.161\n",
"Mars2020 (spacecraft) (-168) 2020-Jul-31 13:00 ... 340.8638 11.0236\n",
"Mars2020 (spacecraft) (-168) 2020-Aug-01 13:00 ... 342.0914 10.9435\n",
"Mars2020 (spacecraft) (-168) 2020-Aug-02 13:00 ... 342.8919 10.8852\n",
"Mars2020 (spacecraft) (-168) 2020-Aug-03 13:00 ... 343.571 10.8346\n",
"Mars2020 (spacecraft) (-168) 2020-Aug-04 13:00 ... 344.1963 10.788\n",
"Mars2020 (spacecraft) (-168) 2020-Aug-05 13:00 ... 344.791 10.7438\n",
"Mars2020 (spacecraft) (-168) 2020-Aug-06 13:00 ... 345.3657 10.7012\n",
"Mars2020 (spacecraft) (-168) 2020-Aug-07 13:00 ... 345.9253 10.6598\n",
" ... ... ... ... ...\n",
"Mars2020 (spacecraft) (-168) 2021-Feb-28 13:00 ... 76.4893 1.4601\n",
"Mars2020 (spacecraft) (-168) 2021-Mar-01 13:00 ... 77.0192 1.467\n",
"Mars2020 (spacecraft) (-168) 2021-Mar-02 13:00 ... 77.5493 1.4738\n",
"Mars2020 (spacecraft) (-168) 2021-Mar-03 13:00 ... 78.0794 1.4804\n",
"Mars2020 (spacecraft) (-168) 2021-Mar-04 13:00 ... 78.6097 1.4868\n",
"Mars2020 (spacecraft) (-168) 2021-Mar-05 13:00 ... 79.1402 1.4931\n",
"Mars2020 (spacecraft) (-168) 2021-Mar-06 13:00 ... 79.6707 1.4993\n",
"Mars2020 (spacecraft) (-168) 2021-Mar-07 13:00 ... 80.2014 1.5054\n",
"Mars2020 (spacecraft) (-168) 2021-Mar-08 13:00 ... 80.7322 1.5113\n",
"Mars2020 (spacecraft) (-168) 2021-Mar-09 13:00 ... 81.2632 1.5171"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"perseverance_data"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"t = Time(perseverance_data['datetime_jd'], format='jd')\n",
"\n",
"perseverance_coords = SkyCoord(\n",
" lat=perseverance_data['EclLat'].quantity,\n",
" lon=perseverance_data['EclLon'].quantity,\n",
" distance=perseverance_data['r'].quantity,\n",
" frame=HeliocentricMeanEcliptic(obstime=t)\n",
").transform_to(HeliocentricMeanEcliptic())"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"# Get Earth and Mars positions in the Ecliptic.\n",
"# Heliocentric to have the sun at 0,0 of the cartesian representation.\n",
"\n",
"earth = get_body('Earth', t).transform_to(HeliocentricMeanEcliptic(obstime=t))\n",
"mars = get_body('Mars', t).transform_to(HeliocentricMeanEcliptic(obstime=t))\n",
"\n",
"# get the cartesian representation. Defauls is spherical.\n",
"earth_cart = earth.cartesian\n",
"mars_cart = mars.cartesian\n",
"perseverance_cart = perseverance_coords.cartesian\n",
"\n",
"earth_x = earth_cart.x.to_value(u.AU)\n",
"earth_y = earth_cart.y.to_value(u.AU)\n",
"mars_x = mars_cart.x.to_value(u.AU)\n",
"mars_y = mars_cart.y.to_value(u.AU)\n",
"\n",
"\n",
"# calculate distance and signal delay\n",
"distance = earth.separation_3d(mars)\n",
"signal_delay = (distance / c).to(u.min)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" 'Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.'\n",
" );\n",
" }\n",
"};\n",
"\n",
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = this.ws.binaryType !== undefined;\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById('mpl-warnings');\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent =\n",
" 'This browser does not support binary websocket messages. ' +\n",
" 'Performance may be slow.';\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message('supports_binary', { value: fig.supports_binary });\n",
" fig.send_message('send_image_mode', {});\n",
" if (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
" }\n",
" fig.send_message('refresh', {});\n",
" };\n",
"\n",
" this.imageObj.onload = function () {\n",
" if (fig.image_mode === 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function () {\n",
" fig.ws.close();\n",
" };\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"};\n",
"\n",
"mpl.figure.prototype._init_header = function () {\n",
" var titlebar = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
" if (this.ResizeObserver === undefined) {\n",
" if (window.ResizeObserver !== undefined) {\n",
" this.ResizeObserver = window.ResizeObserver;\n",
" } else {\n",
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
" this.ResizeObserver = obs.ResizeObserver;\n",
" }\n",
" }\n",
"\n",
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" this.resizeObserverInstance.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\n",
" return false;\n",
" });\n",
"\n",
" function set_focus() {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"};\n",
"\n",
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
"};\n",
"\n",
"mpl.figure.prototype.send_message = function (type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"};\n",
"\n",
"mpl.figure.prototype.send_draw_message = function () {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch (cursor) {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_message = function (fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message('ack', {});\n",
"};\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function (fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = 'image/png';\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src\n",
" );\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig['handle_' + msg_type];\n",
" } catch (e) {\n",
" console.log(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\n",
" }\n",
" }\n",
" };\n",
"};\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function (e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e) {\n",
" e = window.event;\n",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
"\n",
" return { x: x, y: y };\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys(original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object') {\n",
" obj[key] = original[key];\n",
" }\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function (event, name) {\n",
" var canvas_pos = mpl.findpos(event);\n",
"\n",
" if (name === 'button_press') {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"};\n",
"\n",
"mpl.figure.prototype.key_event = function (event, name) {\n",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
" if (name === 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message('toolbar_button', { name: name });\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"\n",
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
"// prettier-ignore\n",
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";/* global mpl */\n",
"\n",
"var comm_websocket_adapter = function (comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function () {\n",
" comm.close();\n",
" };\n",
" ws.send = function (m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function (msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data']);\n",
" });\n",
" return ws;\n",
"};\n",
"\n",
"mpl.mpl_figure_comm = function (comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element;\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error('Failed to find cell for figure', id, fig);\n",
" return;\n",
" }\n",
" fig.cell_info[0].output_area.element.on(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable();\n",
" fig.parent_element.innerHTML =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
" fig.close_ws(fig, msg);\n",
"};\n",
"\n",
"mpl.figure.prototype.close_ws = function (fig, msg) {\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"};\n",
"\n",
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message('ack', {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" if (event.target !== this) {\n",
" // Ignore bubbled events from children.\n",
" return;\n",
" }\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('tabindex', 0);\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager) {\n",
" manager = IPython.keyboard_manager;\n",
" }\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which === 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" fig.ondownload(fig, null);\n",
"};\n",
"\n",
"mpl.find_output_cell = function (html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i = 0; i < ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code') {\n",
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] === html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"};\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel !== null) {\n",
" IPython.notebook.kernel.comm_manager.register_target(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAAgAElEQVR4nOzdd3hU1dYG8DUtIZTQBUJHQAQFAUFAARUF/CgCohcFRERFQalKUZAidlAuvQdpioD0chEuCFJChyMgCobeJCCEkkDyvN8fc3Myk8xMZpJJ9knOe57n93hvZp991p6ZDGtW9tlbRARERERERERERESUYykPgIiIiIiIiIiIiDKP8gCIiIiIiIiIiIgo8ygPgIiIiIiIiIiIiDKP8gCIiIiIiIiIiIgo8ygPgIiIiIiIiIiIiDKP8gCIiIiIiIiIiIgo8ygPgIiIiIiIiIiIiDKP8gCIiIiIiIiIiIgo8ygPgIiIiIiIiIiIiDKP8gCIiIiIiIiIiIgo8ygPgIiIiIiIiIiIiDKP8gCIiIiIiIiIiIgo8ygPgIiIiIiIiIiIiDKP8gCIiIiIiIiIiIgo8ygPgIiIiIiIiIiIiDKP8gCIiIiIiIiIiIgo8ygPgIiIiIiIiIiIiDKP8gAwaNAg7Nq1Czdu3MClS5ewdOlSVK5cOc3zGjVqhD179uDOnTs4ceIEunfvrnwsREREREREREREBqM8AKxduxZdunRB1apVUb16daxcuRInT55E7ty5vZ5Trlw53Lx5E99++y2qVKmCbt26IT4+Hu3atVM+HiIiIiIiIiIiIgNRHkAqRYoUAQA0bNjQa5svvvgCR44ccfvZ5MmTsX37duXxExERERERERERGYjyAFK5//77AQDVqlXz2uaXX37B2LFj3X7Wpk0b3L17F3a73eM5ISEhyJcvn5uyZcum+hkRERER5VwRERHK810iIiKiLKY8gFSWL1+OLVu2+Gxz7NgxDB482O1n9evXBwAUL17c4znDhg0DDx48ePDgwYMHDx4sAhIREZHJKA/AzYQJExAdHY2SJUv6bHfs2DEMGjTI7WcNGjQAABQrVszjOSlnAEZEROgJoOq/RBMRERFR5kvK//Lly6c87yUiIiLKQsoD0I0bNw6nT59GuXLl0mybnluAU8qXLx8TQCIiIiITYf5HREREJqU8AIgIxo8fj7Nnz6JixYp+tf/iiy9w+PBht59NmjQpoE1AmAASERERmQvzPyIiIjIp5QFg4sSJuHbtGho1aoRixYrpcuXKpbf57LPP8N133+n/v1y5crh58ybGjBmDKlWqoGvXroiPj0e7du38vi4TQCIiIiJzYf5HREREJqU8AK+LM3fp0kVvExkZiU2bNrmd16hRI+zduxdxcXH466+/0L1794CuywSQiIiIyFyY/xEREZFJKQ9AGSaARERERObC/I+IiIhMSnkAyjABJCIiIjIX5n9ERERkUsoDUIYJIBEREZG5MP8jIiIik1IegDJMAImIiIjMhfkfERERmZTyAJRhAkhERERkLsz/iIiIyKSUB6AME0AiIiIic2H+R0RERCalPABlmAASERERmQvzPyIiIjIp5QEowwSQiIiIyFyY/xEREZFJKQ9AGSaARERERObC/I+IiIhMSnkAyjABJCIiIjIX5n9ERERkUsoDUIYJIBEREZG5MP8jIiIik1IegDJMAImIiIjMhfkfERERmZTyAJRhAkhERERkLsz/iIiIyKSUB6AME0AiIiIic2H+R0RERCalPABlmAASERERmQvzPyIiIjIp5QEowwSQiIiIyFyY/xEREZFJKQ9AGSaARERERObC/I+IiIhMSnkAyjABJCIiIjIX5n9ERERkUsoDUIYJIBEREZG5MP8jIiIik1IegDJMAImIiIjMhfkfERERmZTyAJRhAkhERERkLsz/iIiIyKSUB6AME0AiIiIic2H+R0RERCalPABlmAASERERmQvzPyIiIjIp5QEowwSQiIiIyFyY/xEREZFJKQ9AGSaARERERObC/I+IiIhMSnkAyjABJCIiIjIX5n9ERERkUsoDUIYJIBEREZG5MP8jIiIik1IegDJMAImIiIjMhfkfERERmZTyAJRhAkhERERkLsz/iIiIyKSUB6AME0AiIiIic2H+R0RERCalPABlmAASERERmQvzPyIiIjIp5QEowwSQiIiIyFyY/xEREZFJKQ9AGSaARERERObC/I+IiIhMSnkAyjABJCIiIjIX5n9ERERkUsoDUIYJIBEREZG5MP8jIiIik1IegDJMAImIiIjMhfkfERERmZTyAJRhAkhERERkLsz/iIiIyKSUB6AME0AiIiIic2H+R0RERCalPABlmAASERERmQvzPyIiIjIp5QEowwSQiIiIyFyY/xEREZFJKQ9AGSaARERERObC/I+IiIhMSnkAyjABJCIiIjIX5n9ERERkUsoDUIYJIBEREZG5MP8jIiIik1IegDJMAImIiIjMhfkfERERmZTyAJRhAkhERERkLsz/iIiI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2124cMHjTrdZrUKFCnqR6sqVK1m+oZin5753794Akm8Ddr39t0+fPqmec08FwOzwHnTdyXjmzJlwOByp2litVjRp0gQrV65ErVq1lL9fiIiCQHkAqfhTAPRkxYoVWL58udfHOQOQiDKqW7du0DQNq1atgs1mUx6PWZTPL/iovhVHu7nfIrzlZTtereacFZjUtooIPhDBVnEvBh4TwTciaCDOoqHqMRGRGkYuAEZFRXmdAZdSREREhq5bqFAh/fbHs2fP+nVOypl0Y8eOzfD4g1kABIBPP/3UY7s8efLg2rVrejsjFHQmTpyoxzNixIgsv76n575kyZJutwE/88wzepvSpUunes4zsgmIqvdg7ty59fPv3buX5YVXIiKFlAeQSnoLgB9++CGOHDnid3ujJYBEZGx58+bFr7/+Ck3T0KJFC+XxmFXj0hbMbWFDbJ/kYuClng6MecqG+wu4t60mzl2Ft4t7MTBKnDMG7zfAeIgoaxkt/3MtAAZyBGNNst27d+v9+bMOm2vx5fz588iVK1eGYwhmAfDu3bsoUqSI17Y//fST3rZz585KX/fChQvj1q1bAJy3rxYtWjTLY/D23G/btg0A8O9//xvTpk0DAOzYscPjc57RXYBVvAdLlCih93H16lWl7wMioiymPIBUgPQVABctWoSNGzf63d5oCSARGdvbb78NTdOwdOnSLF2kmzwrGiboX8d9VuCdfg4saWNH49Kpb+16VJxrBh4R92LgShH8S3iLMJFZGC3/y8wCYKFChdCiRQsMGDAAn3/+OcaNG+c2i/Ds2bMB9edafBk9enRQxh/MAuC+fft8tv3666/1tv369VP6ursuTTR58mQlMXh77vv06QPAeRvw5cuXUz1fgRQAjfgeDAkJcVuDMK115ImIchDlAUDEOS2/Ro0aqFGjBgDnGhM1atTQp5p/9tln+O677/T2vXv3xvPPP4+KFSuiatWq+OyzzwAAbdu29fuaRksAici4wsPDsX37dmiahqZNmyqPh5JZRPBMWQuWtnFfK3B3Z+ftwaE29/ahImgpgtkiOCXJhcCjIvhMnLMGVY+JiDKP0fK/YK8BKOK8jXPBggVuRY60jgYNGqTZr2vxJVjr4AazALh48WKfbYcPH663HTp0qLLXPFeuXHphLSEhAZUqVVISh7fnvlSpUvptwElHmTJlPD7n3gqARn8P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d13rsX379qked10nMK3NYEQEx48f19t/9NFHSl53A1EegDJGSgCJKPO8+uqr0DQN69aty/DiuURZrVoRC/5801kEPPOOA3WKp29zEBFBB3FuDHJOBDtEUN0A4yPKakbK/wItAC5cuFBv7212TpcuXTB37lw0bdrU64z3okWLYt26dXpfX331VbpiTs8agPnz53f7cvef//wHpUuXTtXusccew+nTp/V2ad3m5YoFQKLAhYeHuxVWXnvtNY/t/vjjD73N66+/nma/8+bN09tPmTIlQzFu375d72v27NkBn2+EAuArr7yix3D69Ok021esWNHt86x48eJ+X8tms6FMmTJ47rnn3D7zAWD06NFZNmbXPzo9/fTTabb/9ddf9faDBg1K9bjrH6LSWs4i5S3A06dPV/K6G4jyAJQxUgJIRJkjLCwMmzdvhqZpSndNJMqIEnkEOzs5Nwf5p5cDrSumvwhYTQTbxFkE/EsEnQwwPqKsZKT8L9AC4IQJE/T2aa29lZZChQrpt1GdPXs2XTGnpwD4xRdf6Of/8ssvPv8wV6dOHb3t1q1b/b4GC4BEgRs1apT+O3Pp0iXkzZvXYztvt/R++eWXuHbtGo4cOYLHH39c/3mgtwx788wzz7j9XvvafMQbIxQAe/Toocfgekvvww8/jP379+P69euYNm0arFbnRnCB3jKcJ08e+Dru3buHL7/8MuClFdIrd+7cbtdPuqXXbrdj9uzZuHHjBnbt2oUHH3xQPyetW4ZdZ6GOGDHC5/Uff/xxt+svXLhQyetuIMoDUMZICSARZY5u3bpB0zSsWrXK4yKyRNlFHodgWVtnEfBOPwe610jfDsEignBx7gycdEvwVyJwGGCMRFnBSPlfoAVA1wX6//nnnwxf3/VWW19rAXqLOdACYGhoqNutv57WdkrJdSaIvzNfWAAkCkz16tXdZmm99dZbXtu6zqZq2rQpRARPPvmk2++ca3HNtei/cuXKdMWXJ08et9s4FyxYkK5+jFAAfP/99/UYtm/frv988+bNbs9hly5dICLIlSuX289r166d5nPl7di8eTMqVaqUpeMtUqSIWwyVK1eGiOC1115z+/mmTZv0c3744Qf9556WlOjbt6/++OnTp5E7d26v108589Hb7tYmojwAZYyUABJR8OXNmxe//vorNE1Dy5YtlcdDlFE2i2B8k+Qdgj+s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Z+bOndvhb4y9ebuIiLlz57Z5bdGiRbF69epYv359PPDAA52uJrcta2pqavf8zZw5s93zN3DgwFiyZEmsWbMmWlpa4rnnnoumpqbYbbfdkh9Lfzh/m7j+SsOGDYtbb7011q5dG2vXro1bb701dtxxxzbbuP7ecOqpp8bKlSvjtddei0cffbTNogBNTU1x//33t9l+xowZ8dOf/jRee+21WLFiRcyfPz/5MfSX83feeefFL3/5y1i3bl388Y9/jB/96EfxgQ98IPkxpLBpVdq//mtqamr33BWFa29rzp9rr62O/t78f1ddgwBAppIHAAAAAAB6T/IAAAAAAEDvSR4AAAAAAOg9yQMAAAAAAL0neQAAAAAAoPckDwAAAAAA9J7kAQAAAACA3pM8AAAAAADQe5IHAAAAAAB6T/IAAAAAAEDvSR4AgF40cODAePXVV2PChAmdbnf99dfH66+/HieccMJm7zU1NcWdd9652etTpkyJiIixY8cmP04AAAA6lDwAAL3o6KOPjqVLl3a6zXbbbRcvvvhiXHbZZfF//s//2ex9A0AAAIB+LXkAAN7CTjvtFL/97W/jwgsvbH3toIMOipaWljj88MM73ffGG2+ML37xi51u88lPfjJ+8pOfxA477BCvvvrqZgM9A0AAAIB+LXkAALrgAx/4QLS0tMTUqVNj0KBBsXz58rj66qs73adSqcQLL7wQ7373uzvd7oc//GGcdtppURRF3HHHHbF48eI27xsAAgAA9GvJAwDQRV/72tdi6dKlceutt8YTTzwRAwYM6HT76dOnx+9+97uoVCodbjN+/PhoaWmJESNGRFEUceyxx8avfvWrNvsYAAIAAPRryQMA0EUDBw6MZ555JlpaWmLfffd9y+0vv/zyuOmmmzrd5rLLLou777679d+NjY3xhz/8oc2jxQaAAAAA/VryAAB00aRJk2LdunWxcePGOOqoo95y+6eeeiqOPfbYDt+vq6uLVatWxZ///OfYuHFjq4iIb3/7263bffnLX47/+I//2Gz/mTNnRkTE0KFDk58bAAAAOpQ8AABd0NjYGI899lg0NTXF+eefH2vWrIlddtmlw+3Hjx8f69ati+22267DbY466qh46aWXYr/99ovJkye3+tCHPhSvvfZaDB8+PIqiiFNPPTV+97vfbfbI8bnnnhtr1qxJfm4AAADoVPIAAHTBF7/4xVixYkUMGTIkKpVKPPDAA/G9732vw+0XLFjQ5tHe9tx5551x++23t/ve888/H2eccUYURRE77LBDrF69Or7zne/E1KlTY88994yPf/zj8cc//jHOPffc5OcGAACATiUPAMBbmDlzZmzYsKHNar5jxoyJ5ubm+MxnPtPuPj/60Y/i5JNP7vAzd9lll9iwYUN8+MMfbvf9L3/5y/H444+3/nuvvfaKO+64I55//vl4+eWX4/HHH4/TTjut0wVGAAAAqAnJAwDQw0aMGBEbNmyIkSNHJs8CAABAcskDANDD9t577zj99NOT5wAA/v9259AIAACGgdD+W3eKv1Qg8ADAC/MAAAAAANCZBwAAAACAzjwAAAAAAHTmAQAAAACgMw8AAAAAAJ15AAAAAADozAMAAAAAQGceAAAAAAA68wAAAAAA0JkHAAAAAIDOPAAAAAAAdOYBAAAAAKAzDwAAAAAAnXkAAAAAAOjMAwAAAABA5AA3bbCoEZ/fYwAAAABJRU5ErkJggg==\" width=\"1280\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "38b8d95f4a104e6ab419d958151bcae2",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/224 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.style.use('dark_background')\n",
"\n",
"fig = plt.figure(figsize=(12.8, 7.2), dpi=100)\n",
"ax = fig.add_axes([0.05, 0.05, 0.5, 0.95])\n",
"ax.set_aspect(1)\n",
"ax.set_xlim(-2, 2)\n",
"ax.set_ylim(-2, 2)\n",
"ax.set_xlabel('x / AU')\n",
"ax.set_ylabel('y / AU')\n",
"\n",
"plot_perseverance_line, = ax.plot([], [], color='xkcd:orange')\n",
"plot_perseverance_dot, = ax.plot([], [], marker='o', ms=4, color='xkcd:orange')\n",
"\n",
"plot_distance, = ax.plot([], [], color='lightgray')\n",
"plot_earth, = ax.plot([], [], color='xkcd:blue', marker='o', ms=8)\n",
"plot_mars, = ax.plot([], [], color='xkcd:red', marker='o', ms=5)\n",
"\n",
"plot_earth_line, = ax.plot([], [], color='xkcd:blue')\n",
"plot_mars_line, = ax.plot([], [], color='xkcd:red')\n",
"\n",
"\n",
"plot_sun, = ax.plot(0, 0, color='xkcd:yellow', marker='o', ms=12)\n",
"\n",
"\n",
"\n",
"text_template = '''\n",
"Earth / Mars\n",
"Date: {t:%Y-%m-%d}\n",
"Distance: {distance:4.2f} AU\n",
"Signal-Delay: {delay:4.1f} min\n",
"'''\n",
"\n",
"text = ax.text(1.05, 0.95, text_template, ha='left', va='top', transform=ax.transAxes, family='monospace', size=24)\n",
"\n",
"bar = tqdm(total=len(t) + 1)\n",
"\n",
"def update(frame):\n",
" bar.update(1)\n",
"\n",
" \n",
" \n",
" \n",
" plot_perseverance_line.set_data(perseverance_cart.x[:frame].to_value(u.AU), perseverance_cart.y[:frame].to_value(u.AU))\n",
" plot_perseverance_dot.set_data(perseverance_cart.x[frame].to_value(u.AU), perseverance_cart.y[frame].to_value(u.AU))\n",
" \n",
" plot_earth.set_data(earth_x[frame], earth_y[frame])\n",
" plot_earth_line.set_data(earth_x[:frame], earth_y[:frame])\n",
" plot_mars.set_data(mars_x[frame], mars_y[frame])\n",
" plot_mars_line.set_data(mars_x[:frame], mars_y[:frame])\n",
" \n",
" plot_distance.set_data([earth_x[frame], mars_x[frame]], [earth_y[frame], mars_y[frame]])\n",
"\n",
" text.set_text(text_template.format(t=t[frame].to_datetime(), distance=distance[frame].to_value(u.AU), delay=signal_delay[frame].to_value(u.min)))\n",
" \n",
" return plot_earth, plot_mars, plot_distance, text\n",
"\n",
"\n",
"ani = FuncAnimation(fig, update, frames=len(t), interval=1000/50, repeat=False)\n",
"ani.save('mars.mp4', extra_args=['-pix_fmt', 'yuv420p'], bitrate=-1)"
]
}
],
"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.9.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment