GISS Global/Hemispheric Temperatures
Table of Contents
Set Up
Imports
Python
from functools import partial
from pathlib import Path
import os
PyPi
from bokeh.layouts import column
from bokeh.palettes import Set1
from bokeh.models import (
BoxZoomTool,
HoverTool,
Legend,
PanTool,
ResetTool,
SaveTool,
Span,
WheelZoomTool,
)
from bokeh.models.widgets import Panel, Tabs
from bokeh.plotting import (figure,
ColumnDataSource,
)
from dotenv import load_dotenv
import holoviews
import pandas
This Project
from bartleby_the_penguin.tangles.embed_bokeh import EmbedBokeh
Setup the Embed
files_path = Path("../../files/posts/giss/giss-globalhemispheric-temperatures/")
Embed = partial(
EmbedBokeh,
folder_path=files_path)
Set Up Bokeh
I originally createde EmbedBokeh to use HoloViews to do the rendering so you have to set bokeh to be the backend or it will try to use matplotlib instead.
holoviews.extension("bokeh")
Load the Data
load_dotenv(".env")
path = Path(os.environ.get("ZONES")).expanduser()
assert path.is_file()
with path.open() as reader:
giss = pandas.read_csv(path)
giss.loc[:, "Year"] = giss.Year.astype("int32")
print(giss.describe())
Year Glob NHem SHem 24N-90N \
count 139.000000 139.000000 139.000000 139.000000 139.000000
mean 1949.000000 0.032302 0.056043 0.008561 0.077698
std 40.269923 0.336896 0.393435 0.301848 0.464606
min 1880.000000 -0.490000 -0.540000 -0.490000 -0.580000
25% 1914.500000 -0.200000 -0.220000 -0.235000 -0.280000
50% 1949.000000 -0.070000 -0.010000 -0.080000 0.020000
75% 1983.500000 0.215000 0.210000 0.265000 0.255000
max 2018.000000 0.980000 1.260000 0.710000 1.500000
24S-24N 90S-24S 64N-90N 44N-64N 24N-44N EQU-24N \
count 139.000000 139.000000 139.000000 139.000000 139.000000 139.000000
mean 0.036115 -0.018561 0.111079 0.117770 0.027698 0.027626
std 0.331384 0.295695 0.917715 0.516729 0.356416 0.326111
min -0.650000 -0.470000 -1.640000 -0.710000 -0.590000 -0.720000
25% -0.215000 -0.250000 -0.545000 -0.270000 -0.200000 -0.230000
50% -0.030000 -0.100000 0.020000 0.000000 -0.070000 0.000000
75% 0.255000 0.230000 0.660000 0.360000 0.135000 0.240000
max 0.970000 0.700000 3.050000 1.440000 1.060000 0.930000
24S-EQU 44S-24S 64S-44S 90S-64S
count 139.000000 139.000000 139.000000 139.000000
mean 0.045683 0.020432 -0.069353 -0.078129
std 0.343385 0.312688 0.269380 0.732359
min -0.580000 -0.430000 -0.540000 -2.570000
25% -0.210000 -0.220000 -0.265000 -0.490000
50% -0.030000 -0.080000 -0.090000 0.050000
75% 0.290000 0.260000 0.180000 0.410000
max 1.020000 0.780000 0.450000 1.270000
print(giss.iloc[0])
print()
print(giss.iloc[-1])
Year 1880.00 Glob -0.18 NHem -0.31 SHem -0.06 24N-90N -0.38 24S-24N -0.17 90S-24S -0.01 64N-90N -0.97 44N-64N -0.47 24N-44N -0.25 EQU-24N -0.21 24S-EQU -0.13 44S-24S -0.04 64S-44S 0.05 90S-64S 0.67 Name: 0, dtype: float64 Year 2018.00 Glob 0.82 NHem 0.99 SHem 0.66 24N-90N 1.19 24S-24N 0.64 90S-24S 0.70 64N-90N 1.87 44N-64N 1.09 24N-44N 1.03 EQU-24N 0.69 24S-EQU 0.59 44S-24S 0.78 64S-44S 0.37 90S-64S 1.07 Name: 138, dtype: float64
print(giss.columns)
giss = giss.rename(columns=dict(
Glob="Global",
NHem="Northern Hemisphere",
SHem="Southern Hemisphere"))
print(giss.columns)
Index(['Year', 'Glob', 'NHem', 'SHem', '24N-90N', '24S-24N', '90S-24S',
'64N-90N', '44N-64N', '24N-44N', 'EQU-24N', '24S-EQU', '44S-24S',
'64S-44S', '90S-64S'],
dtype='object')
Index(['Year', 'Global', 'Northern Hemisphere', 'Southern Hemisphere',
'24N-90N', '24S-24N', '90S-24S', '64N-90N', '44N-64N', '24N-44N',
'EQU-24N', '24S-EQU', '44S-24S', '64S-44S', '90S-64S'],
dtype='object')
Plot
Global/Hemispheric
class Plot:
width = 1000
height = 800
line_width = 4
alpha = 0.8
light_alpha = 0.2
title_font_size = "14pt"
hover = HoverTool(
tooltips = [
("Year", "@year"),
("Difference From Normal", "@anomaly")
]
)
tools = [
hover,
PanTool(),
WheelZoomTool(),
BoxZoomTool(),
ResetTool(),
SaveTool(),
]
plot = figure(plot_width=Plot.width, plot_height=Plot.height,
x_range=(giss.Year.min(), giss.Year.max()),
x_axis_label="Year",
y_axis_label="Difference (Celsius)",
tools=tools)
plot.title.text = "Yearly Temperature Difference from Mean 1931-1980 Temperature by Hemisphere"
plot.title.text_font_size = Plot.title_font_size
horizontal = Span(location=0, dimension="width", line_color="darkgray",
line_width=Plot.line_width,
line_cap="round",
line_dash="dashed")
plot.renderers.extend([horizontal])
locations = ["Global", "Northern Hemisphere", "Southern Hemisphere"]
for location, color in zip(locations, Set1[3]):
columns = ColumnDataSource(
data=dict(
year=giss.Year,
anomaly=giss[location],
smoothed=giss.rolling(5, on="Year", min_periods=1)[location].mean(),
)
)
line = plot.circle("year", "anomaly", source=columns,
color=color,
line_width=Plot.line_width,
alpha=Plot.light_alpha,
legend=location)
line = plot.line("year", "smoothed", source=columns,
color=color,
line_width=Plot.line_width, alpha=Plot.alpha,
legend="{} Rolling 5 Year Mean".format(location))
plot.legend.click_policy = "hide"
plot.legend.location = "top_left"
Embed the Plot
I need to fix the EmbedBokeh class.
embed = Embed(plot, "global_temperature_anomalies")
embed._figure = plot
embed()