from IPython.html.widgets import interact, interactive, fixed
from IPython.display import display, HTML
import requests
from mpl_toolkits.mplot3d import Axes3D
import datetime
import numpy as np
planets = ['mars','earth','venus','mercury','sun']
planets = ','.join(planets)
now = datetime.datetime.now()
year,month,day = now.year, now.month, now.day
def get_eph(year,month,day):
url = "http://www.astro-phys.com/api/de406/states?date=%s-%s-%s&bodies=%s" % (year,month,day, planets)
data = requests.get(url).json()
data = data['results']
return data
def distances(data):
dists = {}
for planet in data:
dists[planet] = int(np.linalg.norm(np.array(data["earth"]) - np.array(data[planet]), 2))
return dists
def system(year, month, day):
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
thisdate = str(datetime.date(year, month, day))
ax.set_title(thisdate)
data = get_eph(year, month, day)
table = '<h3>Distances from Earth on {0}:</h3><table>\n'.format(thisdate)
dists = distances(data)
for planet in sorted(data):
x,y,z = data[planet][0]
ax.scatter(x, y, z)
ax.text(x,y,z, planet)
if planet != "earth":
table += '<tr><td>{0}</td><td>{1} km</td></tr>\n'.format(planet, dists[planet])
display(HTML(table))
w = interactive(system, year=(1980,2020,1), month=(1,12,1), day=(1,30,1))
display(w)
mars | 57594401 km |
mercury | 91316004 km |
sun | 151842302 km |
venus | 122447400 km |