File:Temp-sunspot-co2.svg
Summary
Category:Commons:Maint:Igen:T
Description |
English: Global average temperature, atmospheric CO2, and sunspot activity since 1850. Thick lines for temperature and sunspots represent a 25 year LOWESS and moving average smoothing of the raw data. |
||
Date | 11 January 2009 (original upload date) | ||
Source | Transferred from en.wikipedia to Commons by Anrie using CommonsHelper. | ||
Author | Leland McInnes at English Wikipedia | ||
Other versions |
|
||
SVG development | Category:Invalid SVG created with Matplotlib code#1000Temp-sunspot-co2.svg#(light blue) Law Dome CO2 Data: ftp://ftp.ncdc.noaa.gov/pub/data/paleo/icecore/antarctica/law/law_co2.txt
Global average temperature, atmospheric CO2, and sunspot activity since 1850. Thick lines for temperature and sunspots represent a 25 year moving average smoothing of the raw data. This figure was produced by Leland McInnes using python and matplotlib and is licensed under the GFDL. All data is from publicly available sources.
| ||
Source code | Python code#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pylab as plt
import matplotlib.ticker as ticker
import urllib3
import ftplib
import shutil
plt.rcdefaults()
plt.style.use('classic')
def saveurl(url, fname):
if url.startswith("ftp"):
ftp = ftplib.FTP('/'.join(url.split('/')[2:3]))
ftp.login('', '')
with open(fname, 'wb') as f:
res = ftp.retrbinary('RETR %s' % '/'.join(url.split('/')[3:]), f.write)
else:
c = urllib3.PoolManager()
with c.request('GET', url, preload_content=False) as resp, open(fname, 'wb') as out_file:
shutil.copyfileobj(resp, out_file)
print('saved', fname, 'from', url)
def smooth_convolution(signal, window_size):
window_size = 1 + 2 * (window_size // 2) # should be odd
w = np.hamming(window_size)
y = (np.convolve(w, signal) / np.convolve(w, np.ones_like(signal)))
return y[(len(w)-1)//2:-(len(w)//2)]
def smooth_lowess(signal, window_size):
s = window_size // 2
window = np.hamming(1+2*s) / np.hamming(1+2*s).sum()
smoothed = np.empty_like(signal)
for i in range(len(signal)):
i0, i1 = max(i-s, 0), min(i+s, len(signal)-1) + 1
# linear LOWESS smoothing
smoothed[i] = np.poly1d(np.polyfit(np.arange(i0, i1), signal[i0:i1], deg=1,
w=np.sqrt(window[i0-i+s:i1-i+s])))(i)
return smoothed
saveurl("http://woodfortrees.org/data/hadcrut4gl/mean:12", "hadcrut4gl.txt")
with open("hadcrut4gl.txt") as temp_file:
temp_years, temps = [], []
for l in temp_file.readlines():
yT = l.split()
if (not l.startswith('#')) and len(yT) == 2:
temp_years.append(float(yT[0]))
temps.append(float(yT[1]))
#print('T', list(zip(temp_years, temps)))
saveurl("ftp://aftp.cmdl.noaa.gov/products/trends/co2/co2_mm_mlo.txt", "co2_mm_mlo.dat")
with open("co2_mm_mlo.dat") as co2_file:
data_rows = [x.split() for x in co2_file if not x.startswith("#") and x.find("-99.99") == -1]
co2_years = [float(x[2]) for x in data_rows]
co2concs = [float(x[3]) for x in data_rows]
#print('co2', list(zip(co2_years, co2concs)))
saveurl("ftp://ftp.ncdc.noaa.gov/pub/data/paleo/icecore/antarctica/law/law_co2.txt", "law_co2.txt")
with open("law_co2.txt", encoding="ISO-8859-1") as lawco2_file:
data_rows = [x.split() for x in lawco2_file if x.startswith(" 1")]
del data_rows[ [float(x[0]) for x in data_rows].index(1010.):]
lawco2_years = [float(x[0]) for x in data_rows]
lawco2concs = [float(x[-1]) for x in data_rows]
#print('lawco2', list(zip(lawco2_years, lawco2concs)))
saveurl("http://www.sidc.be/silso/DATA/SN_y_tot_V2.0.txt", "yearssn.dat")
with open("yearssn.dat") as sunspot_file:
data_rows = [x.split() for x in sunspot_file if "*" not in x]
sun_years = [float(x[0]) for x in data_rows]
sunspots = [float(x[1]) for x in data_rows]
#print('sunspots', list(zip(sun_years, sunspots)))
t_min, t_max = 1850, max(temp_years[-1], co2_years[-1], sun_years[-1])
smoothed_temps = smooth_lowess(temps, 25 * 12)
smoothed_sunspots = smooth_convolution(sunspots, 25)
rect = [0.125, 0.1, 0.775, 0.8]
base_ax = plt.axes(rect)
base_ax.yaxis.tick_left()
plt.yticks([])
plt.xlim(t_min, t_max)
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(20))
plt.xlabel("Year", size=16)
plt.title(r"Temperature, CO$_2$, and Sunspots", size=22)
temp_ax = plt.axes([rect[0],rect[1]+.42*rect[3],rect[2],.58*rect[3]], frameon=False)
temp_ax.yaxis.tick_left()
plt.plot(temp_years, temps, '#FF2200')
tline = plt.plot(temp_years, smoothed_temps, '#AA0000', lw=3)
plt.xlim(t_min, t_max)
plt.ylim(min(temps)*1.03 - 0.03*max(temps), max(temps)*1.03 - 0.03*min(temps))
plt.yticks(np.arange(-0.6,0.9,0.2))
plt.ylabel(u'Temperature anomaly (°C)', size=14, color='#AA0000')
plt.xticks([])
co2_ax = plt.axes([rect[0],rect[1]+.25*rect[3],rect[2],.5*rect[3]], frameon=False)
co2_ax.yaxis.tick_right()
co2_ax.yaxis.set_label_position("right")
co2_ax.xaxis.tick_bottom()
plt.plot(co2_years, co2concs, '#44AAFF')
cline = plt.plot(lawco2_years, lawco2concs, '#2288EE', lw=2)
plt.xlim(t_min, t_max)
plt.ylabel(r'CO$_2$ (ppm)', size=14, color='#2288EE')
plt.xticks([])
sun_ax = plt.axes([rect[0],rect[1],rect[2],.5*rect[3]], frameon=False)
sun_ax.yaxis.tick_left()
plt.plot(sun_years, sunspots, "#FFDD00")
sline = plt.plot(sun_years, smoothed_sunspots, "#FF9900", lw=3)
plt.xlim(t_min, t_max)
plt.yticks(np.arange(0,250,50))
plt.ylabel("Sunspot number", size=14, color='#FF9900')
plt.xticks([])
plt.sca(base_ax)
t_proxy = plt.Line2D([0], [0], c='#AA0000', lw=3)
c_proxy = plt.Line2D([0], [0], c='#2288EE', lw=3)
s_proxy = plt.Line2D([0], [0], c='#FF9900', lw=3)
plt.legend((t_proxy, c_proxy, s_proxy), ("Temperature", r"CO$_2$", "Sunspots"), loc="upper left")
plt.savefig("Temp-co2-sunspot.svg")
plt.show()
|
Related Images
Licensing
Leland McInnes at the English-language Wikipedia, the copyright holder of this work, hereby publishes it under the following license:
![]() ![]() ![]() |
This file is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported license. Subject to disclaimers. | |
Attribution: Leland McInnes at the English-language Wikipedia | ||
| ||
This licensing tag was added to this file as part of the GFDL licensing update. |
![]() |
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License. Subject to disclaimers. |
Original upload log
The original description page was here. All following user names refer to en.wikipedia.
- 2009-01-11 03:45 Leland McInnes 720×540× (102750 bytes)
- 2008-10-09 00:57 Leland McInnes 600×480× (34962 bytes)
- 2007-03-11 02:47 Leland McInnes 600×480× (48910 bytes) Fix for wrong data selection
- 2007-03-11 02:10 Leland McInnes 600×480× (48672 bytes) Update to Had CRUT3 instead of CRUTEM
- 2007-03-10 20:46 Leland McInnes 600×480× (48525 bytes)
- 2007-03-10 20:41 Leland McInnes 600×480× (47761 bytes)
- 2007-03-10 05:01 Leland McInnes 600×480× (33704 bytes) Global average temperature, Mauna Loa CO<sub>2</sub>, and sunspot activity for the last 50 years.
Any autoconfirmed user can overwrite this file from the same source. Please ensure that overwrites comply with the guideline.
Category:Files allowed to be overwritten by everyone
Category:Atmospheric CO2 time series
Category:CC-BY-SA-3.0-migrated-with-disclaimers
Category:Commons:Maint:Igen:T
Category:Files allowed to be overwritten by everyone
Category:Files that need updating
Category:GFDL-en
Category:Global warming graphs
Category:Invalid SVG created with Matplotlib code
Category:License migration completed
Category:Physical phenomena
Category:Self-published work
Category:Sunspot diagrams
Category:User:Kopiersperre Diagrams