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]
}'