Faceted Line Chart with Cumulative Sum#
This chart creates one facet per natural disaster and shows the cumulative number of deaths for that category. Note the use of different predicates to filter based on both a list and a range.
import altair as alt
from vega_datasets import data
source = data.disasters()
columns_sorted = ['Drought', 'Epidemic', 'Earthquake', 'Flood']
alt.Chart(source).transform_filter(
{'and': [
alt.FieldOneOfPredicate(field='Entity', oneOf=columns_sorted), # Filter data to show only disasters in columns_sorted
alt.FieldRangePredicate(field='Year', range=[1900, 2000]) # Filter data to show only 20th century
]}
).transform_window(
cumulative_deaths='sum(Deaths)', groupby=['Entity'] # Calculate cumulative sum of Deaths by Entity
).mark_line().encode(
alt.X('Year:Q', title=None).axis(format='d'),
alt.Y('cumulative_deaths:Q', title=None),
alt.Color('Entity:N', legend=None)
).properties(
width=300,
height=150
).facet(
facet=alt.Facet(
'Entity:N',
title=None,
sort=columns_sorted,
header=alt.Header(labelAnchor='start', labelFontStyle='italic')
),
title=alt.Title(
text=['Cumulative casualties by type of disaster', 'in the 20th century'],
anchor='middle'
),
columns=2
).resolve_axis(y='independent', x='independent')
import altair as alt
from vega_datasets import data
source = data.disasters()
columns_sorted = ['Drought', 'Epidemic', 'Earthquake', 'Flood']
alt.Chart(source).transform_filter(
{'and': [
alt.FieldOneOfPredicate(field='Entity', oneOf=columns_sorted), # Filter data to show only disasters in columns_sorted
alt.FieldRangePredicate(field='Year', range=[1900, 2000]) # Filter data to show only 20th century
]}
).transform_window(
cumulative_deaths='sum(Deaths)', groupby=['Entity'] # Calculate cumulative sum of Deaths by Entity
).mark_line().encode(
alt.X('Year:Q', title=None, axis=alt.Axis(format='d')),
alt.Y('cumulative_deaths:Q', title=None),
alt.Color('Entity:N', legend=None)
).properties(
width=300,
height=150
).facet(
facet=alt.Facet(
'Entity:N',
title=None,
sort=columns_sorted,
header=alt.Header(labelAnchor='start', labelFontStyle='italic')
),
title=alt.Title(
text=['Cumulative casualties by type of disaster', 'in the 20th century'],
anchor='middle'
),
columns=2
).resolve_axis(y='independent', x='independent')