No topics yet. Start the conversation.
Summary
User supplied summary for the plot
Number of space launches from GCAT that reached Earth orbit, by country and year.
Description
The below description is supplied in free-text by the user
Space launches ๐
Overview of space launches up to at least earth orbit.
Source: GCAT: General Catalog of Artifical Space Objects by J. McDowell
Last 10 launches
- Jul 2026 Falcon 9 from Cape Canaveral Air Station, Florida (US)
- Jul 2026 Chang Zheng 6A from Taiyuan weixing fashe zhongxin (CN)
- Jul 2026 Chang Zheng 7A from Wenchang Space Center, Hainan (CN)
- Jul 2026 Falcon 9 from South Base, Vandenberg Space Force Base, California (US)
- Jul 2026 Starship V3 from Starbase, Boca Chica Beach, Texas (US)
- Jul 2026 Lijian-1 from Jiuquan Space Center, Nei Monggol Zizhiqu, China (CN)
- Jul 2026 Chang Zheng 3B from Xichang Space Center (Songlin), Sichuan, China (CN)
- Jul 2026 Yinli-1 from East China Sea launch zone (CN)
- Jul 2026 Falcon 9 from Cape Canaveral Air Station, Florida (US)
- Jul 2026 Falcon 9 from South Base, Vandenberg Space Force Base, California (US)
Source code
import inspect
import sys
import pandas as pd
from novem import Plot
# Retrieve data for Launches and Launch Sites
URL_LAUNCHES = 'https://planet4589.org/space/gcat/tsv/launch/launch.tsv'
URL_LAUNCH_SITES = 'https://planet4589.org/space/gcat/tsv/tables/sites.tsv'
COUNTRY_MAP = {
"US": "US",
"TTPI": "US", # Trust Territory of the Pacific Islands
"UM67": "US", # United States Minor Outlying Islands
"UM79": "US", # United States Minor Outlying Islands
"PCZ": "US", # Pacific Trust Territory
"RU": "RU",
"SU": "RU", # USSR
"CN": "CN",
}
COUNTRY_ORDER = ["US", "CN", "RU", "Others"]
def load_data():
launches = pd.read_csv(URL_LAUNCHES, sep="\t")
sites = pd.read_csv(URL_LAUNCH_SITES, sep="\t")
return launches.merge(sites[["#Site", "StateCode","Name"]],
left_on="Launch_Site", right_on="#Site", how="left")
def clean_data(df):
# Extract Year from messy String
df['Date'] = pd.to_datetime(df['Launch_Date'].str.rstrip("?").str.split().str[:3].str.join(" "), errors='coerce')
df['Year'] = df['Date'].dt.year
# Apply mapping, send everything else to "Others"
df["Country"] = df["StateCode"].map(COUNTRY_MAP).fillna("Others")
df["Country"] = pd.Categorical(
df["Country"], categories=COUNTRY_ORDER, ordered=True
)
df_space = df[df["LaunchCode"].astype(str).str.startswith("O")] # O for Orbital
return df_space
df = load_data()
df_space = clean_data(df)
novem_data_table = df_space.pivot_table(index='Year', columns='Country', aggfunc='size', observed=False).fillna(0)
plt = Plot('ex-space-launch')
plt.data = novem_data_table
plt.type = 'sbar'
plt.name = 'Dawn of a new space age ๐'
plt.summary = 'Number of space launches from GCAT that reached Earth orbit, by country and year.'
plt.shared = 'public'
# Description includes source, markup table and this python code itself
plt.description = '''# Space launches ๐
Overview of space launches up to at least earth orbit.
Source: *GCAT: General Catalog of Artifical Space Objects* by J. McDowell\n
## Last 10 launches
'''
df_last_10 = df_space.sort_values(by='Launch_JD', ascending=False).head(10)
df_last_10_table = '\n'.join(
f"- {row['Date'].strftime('%d. %b %Y')} {row['LV_Type']} from {row['Name']} ({row['StateCode']}) "
for _, row in df_last_10.iterrows()
)
plt.description += df_last_10_table
plt.description += '\n\n## Source code\n\n'
plt.description += '\n\n```python' + ' ' + inspect.getsource(sys.modules[__name__]) + '```'