I recently saw this graph I thought it would be a good exercise to try and reproduce a similar graph from online-available data (graph source: J.-M. Jancovici):
Of course, it would be too easy if we could find the actual data in the correct format…
Here, we will try reproducing the following graphs from CO2_emission.csv, energy-use-per-capita.csv, country-and-continent.csv and tot_population.csv (sources: CO2, Energy, Population, countries and continents).
You can get help on dataset merging here.
Data wrangling
- Load the different datasets in tibbles named
CO2
, continent
, pop
and energy
- In the case of
continent
, we care only about the 1st and 5th columns, respectively “Continent”, and “Code”
- Make sure all tibbles are tidy, and that the column types (double, character…) are set correctly.
- Merge all tibbles into a single one using
inner_join
- We are only interested in the columns ‘Code’, ‘Year’, ‘CO2’, ‘Continent’, ‘Energy’, ‘Country’ and ‘Population’. This tibble should look like the tibble printed below
- Create a vector of the countries you are interested in (e.g. EU…)
- Create a tibble
ave
containing the averaged CO2 emission, Energy consumption and Population for each country of this group of countries
library(tidyverse)
# CO2 data
CO2 <- read_csv("Data/CO2_emission.csv", na="..")[,-c(1,2)]
names(CO2) <- c("Country","Code",1960:2018)
CO2 <- CO2 %>% pivot_longer(cols="1960":"2018",
names_to="Year",
values_to="CO2",
names_transform = list(Year = as.numeric),
values_drop_na=TRUE)
# Attribute the correct continent
continent <- read_csv("Data/country-and-continent.csv")[,c(1,5)]
names(continent) <- c("Continent","Code")
CO2 <- inner_join(CO2, continent)
# Population
pop <- read_csv("Data/tot_population.csv", na="..")
names(pop) <- c("Country","Code","Year","Population")
# Energy data
energy <- read_csv("Data/energy-use-per-capita.csv")
names(energy) <- c("Country", "Code", "Year", "Energy")
# Merge data
DF <- CO2
DF <- inner_join(DF, energy, by=c("Code","Year"))
DF <- inner_join(DF, pop, by=c("Code","Year"))
DF <- DF %>% select(-Country.x, -Country.y)
DF
## # A tibble: 5,990 x 7
## Code Year CO2 Continent Energy Country Population
## <chr> <dbl> <dbl> <chr> <dbl> <chr> <dbl>
## 1 ALB 1971 1.99 Europe 9131. Albania 2187853
## 2 ALB 1972 2.52 Europe 10067. Albania 2243126
## 3 ALB 1973 2.30 Europe 8870. Albania 2296752
## 4 ALB 1974 1.85 Europe 9036. Albania 2350124
## 5 ALB 1975 1.91 Europe 9617. Albania 2404831
## 6 ALB 1976 2.01 Europe 10362. Albania 2458526
## 7 ALB 1977 2.28 Europe 10743. Albania 2513546
## 8 ALB 1978 2.53 Europe 11756. Albania 2566266
## 9 ALB 1979 2.90 Europe 10051. Albania 2617832
## 10 ALB 1980 1.94 Europe 13369. Albania 2671997
## # … with 5,980 more rows
# EU countries
EU <- c("Austria","Italy","Belgium","Latvia","Bulgaria","Lithuania","Croatia",
"Luxembourg","Cyprus","Malta","Czechia","Netherlands","Denmark","Poland",
"Estonia","Portugal","Finland","Romania","France","Slovakia","Germany",
"Slovenia","Greece","Spain","Hungary","Sweden","Ireland","United Kingdom")
# Averaged values for the past 20 years
this_year <- as.numeric(format(Sys.time(), '%Y'))
ave <- DF %>% filter(Country %in% EU & Year>=this_year-20) %>%
group_by(Country) %>%
summarise(CO2 = mean(CO2, na.rm =TRUE),
Energy = mean(Energy, na.rm =TRUE),
Population = mean(Population, na.rm =TRUE)
)
Plotting
- Try reproducing the following plots. The following graphs are for countries within the EU (as of 2019). Make it for the continent of your origin.
- Don’t bother with the text labels first
- Try adding them using the library
ggrepel
# Plotting
library(ggplot2)
library(ggrepel)
p1 <- ggplot(data=subset(DF, Country%in%EU),
aes(x=Energy, y=CO2, col=Country)
)+
lims(y=c(0,15), x=c(0,80e3))+
scale_colour_discrete(guide = FALSE) +
geom_point(alpha=0.1, aes(size=Population/1e6))+
scale_size(name="Population (millions)")+
geom_label_repel(data=ave, show.legend=FALSE, segment.size = 0.5,
force=30,
aes(x=Energy, y=CO2, col=Country, label = Country))+
geom_point(data=ave, alpha=0.9,
aes(x=Energy, y=CO2, col=Country, size=Population/1e6))+
labs(x="Energy consumption [kWh/capita]",
y="CO2 emission [ton/capita]")+
theme_bw()+
theme(legend.position = "top")
p2 <- ggplot(data=subset(DF, Country%in%EU),
aes(x=Energy*Population/1e9, y=CO2*Population/1e9, col=Country)
)+
lims(y=c(0,1))+
scale_colour_discrete(guide = FALSE) +
geom_point(alpha=0.1, aes(size=Population/1e6))+
scale_size(name="Population (millions)")+
geom_label_repel(data=ave, show.legend=FALSE, segment.size = 0.5,
aes(x=Energy*Population/1e9, y=CO2*Population/1e9,
col=Country, label=Country))+
geom_point(data=ave,alpha=0.9,
aes(x=Energy*Population/1e9, y=CO2*Population/1e9,
col=Country, size=Population/1e6))+
labs(x="Total energy consumption [TWh]",
y="Total CO2 emission [Gton]")+
theme_bw()+
theme(legend.position = "top")
p1
LS0tCnRpdGxlIDogIlIgRXhlcmNpc2VzIC0gQ08yIGVtaXNzaW9ucyIKZGF0ZSAgOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogCiAgICBodG1sX2RvY3VtZW50OgogICAgICAgIHRvYyAgICAgICAgICAgIDogeWVzCiAgICAgICAgdG9jX2Zsb2F0ICAgICAgOiB5ZXMKICAgICAgICB0b2NfZGVwdGggICAgICA6IDQKICAgICAgICBoaWdobGlnaHQgICAgICA6IHRhbmdvCiAgICAgICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgICAgIGNvZGVfZG93bmxvYWQgIDogdHJ1ZQpwYXJhbXM6IAogICAgc29sdXRpb246CiAgICAgICAgdmFsdWU6IHRydWUKLS0tCgoKCkkgcmVjZW50bHkgc2F3IHRoaXMgZ3JhcGggSSB0aG91Z2h0IGl0IHdvdWxkIGJlIGEgZ29vZCBleGVyY2lzZSB0byB0cnkgYW5kIHJlcHJvZHVjZSBhIHNpbWlsYXIgZ3JhcGggZnJvbSBvbmxpbmUtYXZhaWxhYmxlIGRhdGEgKGdyYXBoIHNvdXJjZTogW0ouLU0uIEphbmNvdmljaV0oaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL2plYW5tYXJjLmphbmNvdmljaS9waG90b3MvYS4xNTM1OTM3NjcyODAvMTAxNTg1MzQ0NTM2NDcyODEvP3R5cGU9MykpOgoKIVtdKERhdGEvamFuY28uanBnKQoKT2YgY291cnNlLCBpdCB3b3VsZCBiZSB0b28gZWFzeSBpZiB3ZSBjb3VsZCBmaW5kIHRoZSBhY3R1YWwgZGF0YSBpbiB0aGUgY29ycmVjdCBmb3JtYXQuLi4KCkhlcmUsIHdlIHdpbGwgdHJ5IHJlcHJvZHVjaW5nIHRoZSBmb2xsb3dpbmcgZ3JhcGhzIGZyb20gPGEgaHJlZj0iRGF0YS9DTzJfZW1pc3Npb24uY3N2IiBkb3dubG9hZCB0YXJnZXQ9Il9ibGFuayI+Q08yX2VtaXNzaW9uLmNzdjwvYT4sIDxhIGhyZWY9IkRhdGEvZW5lcmd5LXVzZS1wZXItY2FwaXRhLmNzdiIgZG93bmxvYWQgdGFyZ2V0PSJfYmxhbmsiPmVuZXJneS11c2UtcGVyLWNhcGl0YS5jc3Y8L2E+LCA8YSBocmVmPSJEYXRhL2NvdW50cnktYW5kLWNvbnRpbmVudC5jc3YiIGRvd25sb2FkIHRhcmdldD0iX2JsYW5rIj5jb3VudHJ5LWFuZC1jb250aW5lbnQuY3N2PC9hPiBhbmQgPGEgaHJlZj0iRGF0YS90b3RfcG9wdWxhdGlvbi5jc3YiIGRvd25sb2FkIHRhcmdldD0iX2JsYW5rIj50b3RfcG9wdWxhdGlvbi5jc3Y8L2E+IChzb3VyY2VzOiBbQ08yXShodHRwczovL2RhdGFiYW5rLndvcmxkYmFuay5vcmcvcmVwb3J0cy5hc3B4P3NvdXJjZT0yJnNlcmllcz1FTi5BVE0uQ08yRS5QQyZjb3VudHJ5PSMpLCBbRW5lcmd5XShodHRwczovL291cndvcmxkaW5kYXRhLm9yZy9lbmVyZ3ktcHJvZHVjdGlvbi1hbmQtY2hhbmdpbmctZW5lcmd5LXNvdXJjZXMjcGVyLWNhcGl0YS1lbGVjdHJpY2l0eS1jb25zdW1wdGlvbiksIFtQb3B1bGF0aW9uXShodHRwczovL2dpdGh1Yi5jb20vZGF0YXNldHMvcG9wdWxhdGlvbi9ibG9iL21hc3Rlci9kYXRhL3BvcHVsYXRpb24uY3N2KSwgW2NvdW50cmllcyBhbmQgY29udGluZW50c10oaHR0cHM6Ly9kYXRhaHViLmlvL0pvaG5Tbm93TGFicy9jb3VudHJ5LWFuZC1jb250aW5lbnQtY29kZXMtbGlzdCkpLgoKWW91IGNhbiBnZXQgaGVscCBvbiBkYXRhc2V0IG1lcmdpbmcgW2hlcmVdKGh0dHBzOi8vcnB1YnMuY29tL2JyYWRsZXlib2VobWtlL2RhdGFfd3JhbmdsaW5nKS4KCiMgRGF0YSB3cmFuZ2xpbmcKCi0gTG9hZCB0aGUgZGlmZmVyZW50IGRhdGFzZXRzIGluIHRpYmJsZXMgbmFtZWQgYENPMmAsIGBjb250aW5lbnRgLCBgcG9wYCBhbmQgYGVuZXJneWAKICAgICsgSW4gdGhlIGNhc2Ugb2YgYGNvbnRpbmVudGAsIHdlIGNhcmUgb25seSBhYm91dCB0aGUgMXN0IGFuZCA1dGggY29sdW1ucywgcmVzcGVjdGl2ZWx5ICJDb250aW5lbnQiLCBhbmQgIkNvZGUiCi0gTWFrZSBzdXJlIGFsbCB0aWJibGVzIGFyZSB0aWR5LCBhbmQgdGhhdCB0aGUgY29sdW1uIHR5cGVzIChkb3VibGUsIGNoYXJhY3Rlci4uLikgYXJlIHNldCBjb3JyZWN0bHkuCi0gTWVyZ2UgYWxsIHRpYmJsZXMgaW50byBhIHNpbmdsZSBvbmUgdXNpbmcgYGlubmVyX2pvaW5gCi0gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgY29sdW1ucyAnQ29kZScsICdZZWFyJywgJ0NPMicsICdDb250aW5lbnQnLCAnRW5lcmd5JywgJ0NvdW50cnknIGFuZCAnUG9wdWxhdGlvbicuIFRoaXMgdGliYmxlIHNob3VsZCBsb29rIGxpa2UgdGhlIHRpYmJsZSBwcmludGVkIGJlbG93Ci0gQ3JlYXRlIGEgdmVjdG9yIG9mIHRoZSBjb3VudHJpZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluIChlLmcuIEVVLi4uKQotIENyZWF0ZSBhIHRpYmJsZSBgYXZlYCBjb250YWluaW5nIHRoZSBhdmVyYWdlZCBDTzIgZW1pc3Npb24sIEVuZXJneSBjb25zdW1wdGlvbiBhbmQgUG9wdWxhdGlvbiBmb3IgZWFjaCBjb3VudHJ5IG9mIHRoaXMgZ3JvdXAgb2YgY291bnRyaWVzCgpgYGB7ciBlY2hvPXBhcmFtcyRzb2x1dGlvbiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjYWNoZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCiMgQ08yIGRhdGEKQ08yIDwtIHJlYWRfY3N2KCJEYXRhL0NPMl9lbWlzc2lvbi5jc3YiLCBuYT0iLi4iKVssLWMoMSwyKV0KbmFtZXMoQ08yKSA8LSBjKCJDb3VudHJ5IiwiQ29kZSIsMTk2MDoyMDE4KQpDTzIgPC0gQ08yICU+JSBwaXZvdF9sb25nZXIoY29scz0iMTk2MCI6IjIwMTgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvPSJZZWFyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG89IkNPMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190cmFuc2Zvcm0gPSBsaXN0KFllYXIgPSBhcy5udW1lcmljKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19kcm9wX25hPVRSVUUpCiMgQXR0cmlidXRlIHRoZSBjb3JyZWN0IGNvbnRpbmVudApjb250aW5lbnQgPC0gcmVhZF9jc3YoIkRhdGEvY291bnRyeS1hbmQtY29udGluZW50LmNzdiIpWyxjKDEsNSldCm5hbWVzKGNvbnRpbmVudCkgPC0gYygiQ29udGluZW50IiwiQ29kZSIpCkNPMiA8LSBpbm5lcl9qb2luKENPMiwgY29udGluZW50KQojIFBvcHVsYXRpb24KcG9wIDwtIHJlYWRfY3N2KCJEYXRhL3RvdF9wb3B1bGF0aW9uLmNzdiIsIG5hPSIuLiIpCm5hbWVzKHBvcCkgPC0gYygiQ291bnRyeSIsIkNvZGUiLCJZZWFyIiwiUG9wdWxhdGlvbiIpCiMgRW5lcmd5IGRhdGEKZW5lcmd5IDwtIHJlYWRfY3N2KCJEYXRhL2VuZXJneS11c2UtcGVyLWNhcGl0YS5jc3YiKQpuYW1lcyhlbmVyZ3kpIDwtIGMoIkNvdW50cnkiLCAiQ29kZSIsICJZZWFyIiwgIkVuZXJneSIpCiMgTWVyZ2UgZGF0YQpERiA8LSBDTzIKREYgPC0gaW5uZXJfam9pbihERiwgZW5lcmd5LCBieT1jKCJDb2RlIiwiWWVhciIpKQpERiA8LSBpbm5lcl9qb2luKERGLCBwb3AsIGJ5PWMoIkNvZGUiLCJZZWFyIikpCkRGIDwtIERGICU+JSBzZWxlY3QoLUNvdW50cnkueCwgLUNvdW50cnkueSkKREYKIyBFVSBjb3VudHJpZXMKRVUgPC0gYygiQXVzdHJpYSIsIkl0YWx5IiwiQmVsZ2l1bSIsIkxhdHZpYSIsIkJ1bGdhcmlhIiwiTGl0aHVhbmlhIiwiQ3JvYXRpYSIsCiAgICAgICAgIkx1eGVtYm91cmciLCJDeXBydXMiLCJNYWx0YSIsIkN6ZWNoaWEiLCJOZXRoZXJsYW5kcyIsIkRlbm1hcmsiLCJQb2xhbmQiLAogICAgICAgICJFc3RvbmlhIiwiUG9ydHVnYWwiLCJGaW5sYW5kIiwiUm9tYW5pYSIsIkZyYW5jZSIsIlNsb3Zha2lhIiwiR2VybWFueSIsCiAgICAgICAgIlNsb3ZlbmlhIiwiR3JlZWNlIiwiU3BhaW4iLCJIdW5nYXJ5IiwiU3dlZGVuIiwiSXJlbGFuZCIsIlVuaXRlZCBLaW5nZG9tIikKIyBBdmVyYWdlZCB2YWx1ZXMgZm9yIHRoZSBwYXN0IDIwIHllYXJzCnRoaXNfeWVhciA8LSBhcy5udW1lcmljKGZvcm1hdChTeXMudGltZSgpLCAnJVknKSkKYXZlIDwtIERGICU+JSBmaWx0ZXIoQ291bnRyeSAlaW4lIEVVICYgWWVhcj49dGhpc195ZWFyLTIwKSAlPiUKICAgICAgICAgZ3JvdXBfYnkoQ291bnRyeSkgJT4lCiAgICAgICAgIHN1bW1hcmlzZShDTzIgICAgICAgID0gbWVhbihDTzIsIG5hLnJtID1UUlVFKSwKICAgICAgICAgICAgICAgICAgIEVuZXJneSAgICAgPSBtZWFuKEVuZXJneSwgbmEucm0gPVRSVUUpLAogICAgICAgICAgICAgICAgICAgUG9wdWxhdGlvbiA9IG1lYW4oUG9wdWxhdGlvbiwgbmEucm0gPVRSVUUpCiAgICAgICAgICAgICAgICAgICApCmBgYAoKCiMgUGxvdHRpbmcKCi0gVHJ5IHJlcHJvZHVjaW5nIHRoZSBmb2xsb3dpbmcgcGxvdHMuIFRoZSBmb2xsb3dpbmcgZ3JhcGhzIGFyZSBmb3IgY291bnRyaWVzIHdpdGhpbiB0aGUgRVUgKGFzIG9mIDIwMTkpLiBNYWtlIGl0IGZvciB0aGUgY29udGluZW50IG9mIHlvdXIgb3JpZ2luLgogICAgKyBEb24ndCBib3RoZXIgd2l0aCB0aGUgdGV4dCBsYWJlbHMgZmlyc3QKICAgICsgVHJ5IGFkZGluZyB0aGVtIHVzaW5nIHRoZSBsaWJyYXJ5IGBnZ3JlcGVsYAoKYGBge3IgZWNobz1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgY2FjaGU9RkFMU0V9CiMgUGxvdHRpbmcKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdncmVwZWwpCnAxIDwtIGdncGxvdChkYXRhPXN1YnNldChERiwgQ291bnRyeSVpbiVFVSksIAogICAgICAgICAgICAgYWVzKHg9RW5lcmd5LCB5PUNPMiwgY29sPUNvdW50cnkpCiAgICAgICAgICAgICkrCiAgICBsaW1zKHk9YygwLDE1KSwgeD1jKDAsODBlMykpKwogICAgc2NhbGVfY29sb3VyX2Rpc2NyZXRlKGd1aWRlID0gRkFMU0UpICsKICAgIGdlb21fcG9pbnQoYWxwaGE9MC4xLCBhZXMoc2l6ZT1Qb3B1bGF0aW9uLzFlNikpKwogICAgc2NhbGVfc2l6ZShuYW1lPSJQb3B1bGF0aW9uIChtaWxsaW9ucykiKSsKICAgIGdlb21fbGFiZWxfcmVwZWwoZGF0YT1hdmUsIHNob3cubGVnZW5kPUZBTFNFLCBzZWdtZW50LnNpemUgID0gMC41LAogICAgICAgICAgICAgIGZvcmNlPTMwLAogICAgICAgICAgICAgIGFlcyh4PUVuZXJneSwgeT1DTzIsIGNvbD1Db3VudHJ5LCBsYWJlbCA9IENvdW50cnkpKSsKICAgIGdlb21fcG9pbnQoZGF0YT1hdmUsIGFscGhhPTAuOSwgCiAgICAgICAgICAgICAgIGFlcyh4PUVuZXJneSwgeT1DTzIsIGNvbD1Db3VudHJ5LCBzaXplPVBvcHVsYXRpb24vMWU2KSkrCiAgICBsYWJzKHg9IkVuZXJneSBjb25zdW1wdGlvbiBba1doL2NhcGl0YV0iLCAKICAgICAgICAgeT0iQ08yIGVtaXNzaW9uIFt0b24vY2FwaXRhXSIpKwogICAgdGhlbWVfYncoKSsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQpwMiA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQoREYsIENvdW50cnklaW4lRVUpLCAKICAgICAgICAgICAgIGFlcyh4PUVuZXJneSpQb3B1bGF0aW9uLzFlOSwgeT1DTzIqUG9wdWxhdGlvbi8xZTksIGNvbD1Db3VudHJ5KQogICAgICAgICAgICApKwogICAgbGltcyh5PWMoMCwxKSkrCiAgICBzY2FsZV9jb2xvdXJfZGlzY3JldGUoZ3VpZGUgPSBGQUxTRSkgKwogICAgZ2VvbV9wb2ludChhbHBoYT0wLjEsIGFlcyhzaXplPVBvcHVsYXRpb24vMWU2KSkrCiAgICBzY2FsZV9zaXplKG5hbWU9IlBvcHVsYXRpb24gKG1pbGxpb25zKSIpKwogICAgZ2VvbV9sYWJlbF9yZXBlbChkYXRhPWF2ZSwgc2hvdy5sZWdlbmQ9RkFMU0UsIHNlZ21lbnQuc2l6ZSAgPSAwLjUsCiAgICAgICAgICAgICAgYWVzKHg9RW5lcmd5KlBvcHVsYXRpb24vMWU5LCB5PUNPMipQb3B1bGF0aW9uLzFlOSwgCiAgICAgICAgICAgICAgICAgIGNvbD1Db3VudHJ5LCBsYWJlbD1Db3VudHJ5KSkrCiAgICBnZW9tX3BvaW50KGRhdGE9YXZlLGFscGhhPTAuOSwgCiAgICAgICAgICAgICAgIGFlcyh4PUVuZXJneSpQb3B1bGF0aW9uLzFlOSwgeT1DTzIqUG9wdWxhdGlvbi8xZTksIAogICAgICAgICAgICAgICAgICAgY29sPUNvdW50cnksIHNpemU9UG9wdWxhdGlvbi8xZTYpKSsKICAgIGxhYnMoeD0iVG90YWwgZW5lcmd5IGNvbnN1bXB0aW9uIFtUV2hdIiwKICAgICAgICAgeT0iVG90YWwgQ08yIGVtaXNzaW9uIFtHdG9uXSIpKwogICAgdGhlbWVfYncoKSsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQpwMQpwMgpgYGA=