User:0x0077BE/Code/NASA Federal Budget
Appearance
< User:0x0077BE | Code
Below is the code to generate the two charts of NASA's federal budget (inset), using Python and matplotlib. The data were taken from Budget of NASA, and are available as a .json file below. If you update the .json file, make sure to adjust the end_year
parameter appropriately.
"""
Generate a plot for the NASA data
Licensed under CC-0
"""
from json import load as load_json
import numpy as np
from matplotlib import pyplot as plt
# Load the NASA data
data_loc = 'nasa_budget.json'
save_loc_bar = 'NASA-Budget-Federal.svg'
save_loc_line = 'NASA-Budget-Federal-Line.svg'
make_line = True
make_bar = True
with open(data_loc, 'r') as data_file:
data_dict = load_json(data_file)
cal_year = np.array(data_dict['year'])
perc_budget = np.array(data_dict['perc_budget'])
# Setup some plot parameters
start_year = 1958
end_year = 2012
plt_title = 'NASA Budget as a Percentage of Federal Budget'
y_lab = 'Percentage of Federal Budget'
x_lab = 'Calendar Year'
bar_color='#cc0e0e'
line_color= '#940000'
grid_color = '#a5a5a5'
cdpi = 150
fsize=(10, 6.5)
if make_bar:
# Set up the plot
fig = plt.figure(figsize=fsize, dpi=cdpi)
ax = plt.axes(axisbg='none')
# Create a bar chart
ax.bar(cal_year, perc_budget, color=bar_color, zorder=5)
ax.grid(color=grid_color, axis='y', linestyle='-', zorder=0)
plt.xlabel(x_lab, fontweight='bold')
plt.ylabel(y_lab, fontweight='bold')
plt.title(plt_title, fontweight='bold')
ax.set_xlim([start_year, end_year])
xticks = range(start_year, end_year+1, 3) # Every third year, 2-digits.
ax.set_xticks(xticks)
ax.set_xticklabels(['{:02.0f}'.format(xtick%100) for xtick in xticks])
plt.tight_layout()
# Show and save the figure
plt.show()
plt.savefig(save_loc_bar, transparent=True, dpi=cdpi)
if make_line:
# Set up the plot
fig = plt.figure(figsize=fsize, dpi=cdpi)
ax = plt.axes(axisbg='none')
# Create a bar chart
ax.plot(cal_year, perc_budget, '-', linewidth=2, color=line_color, zorder=5)
ax.grid(color=grid_color, axis='y', linestyle='-', zorder=0)
plt.xlabel(x_lab, fontweight='bold')
plt.ylabel(y_lab, fontweight='bold')
plt.title(plt_title, fontweight='bold')
ax.set_xlim([start_year, end_year])
xticks = range(start_year, end_year+1, 3) # Every third year, 2-digits.
ax.set_xticks(xticks)
ax.set_xticklabels(['{:02.0f}'.format(xtick%100) for xtick in xticks])
plt.tight_layout()
# Show and save the figure
plt.show()
plt.savefig(save_loc_line, transparent=True, dpi=cdpi)
nasa_budget.json
{
"year": [1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012],
"perc_budget": [0.1, 0.2, 0.5, 0.9, 1.18, 2.29, 3.52, 4.31, 4.41, 3.45, 2.65, 2.31, 1.92, 1.61, 1.48, 1.35, 1.21, 0.98, 0.99, 0.98, 0.91, 0.87, 0.84, 0.82, 0.83, 0.85, 0.83, 0.77, 0.75, 0.76, 0.85, 0.96, 0.99, 1.05, 1.01, 1.01, 0.94, 0.88, 0.89, 0.9, 0.86, 0.8, 0.75, 0.76, 0.72, 0.68, 0.66, 0.63, 0.57, 0.58, 0.6, 0.57, 0.52, 0.53, 0.48],
"constant_dollars": [488, 1841, 3205, 6360, 12221, 24342, 33241, 33514, 32106, 29696, 26139, 21376, 18768, 15717, 15082, 14303, 11494, 11131, 11640, 11658, 11411, 11404, 11668, 11248, 11766, 13051, 13561, 13218, 13421, 13735, 14454, 16734, 18019, 19686, 15310, 18582, 18053, 16915, 16457, 15943, 15521, 15357, 14926, 15427, 15831, 16021, 15559, 16016, 16085, 15861, 17138, 17186, 17804, 17005, 16014],
"nominal_dollars": [89, 145, 401, 744, 1257, 2552, 4171, 5092, 5933, 5425, 4722, 4251, 3752, 3382, 3423, 3312, 3255, 3269, 3671, 4002, 4164, 4380, 4959, 5537, 6155, 6853, 7055, 7251, 7403, 7591, 9092, 11036, 12429, 13878, 13961, 14305, 13695, 13378, 13881, 14360, 14194, 13636, 13428, 14095, 14405, 14610, 15152, 15602, 15125, 15861, 17833, 17782, 18724, 17863, 17753]
}'