Die Daten stammen von The World Bank: World Development Indicators, WDI.
Bequem geladen mit dem WDI-Paket.
country | year | air_pollution | life_expectancy | region | capital |
---|---|---|---|---|---|
United Arab Emirates | 2017 | 40.91751 | 77.647 | Middle East & North Africa | Abu Dhabi |
Afghanistan | 2017 | 56.91081 | 64.130 | South Asia | Kabul |
Antigua and Barbuda | 2017 | 18.62234 | 76.752 | Latin America & Caribbean | Saint John’s |
Albania | 2017 | 18.20060 | 78.333 | Europe & Central Asia | Tirane |
Armenia | 2017 | 32.52812 | 74.797 | Europe & Central Asia | Yerevan |
Angola | 2017 | 32.38850 | 60.379 | Sub-Saharan Africa | Luanda |
Heute geht es um Luftverschmutzung (air pollution), definiert als durchschnittliche jährliche Menge in Mikrogramm pro Kubikmeter, der Menschen ausgesetzt sind, sowie Lebenserwartung (life expectancy) in Jahren zum Geburtszeitpunkt.
Mögliche Verbesserung: Facets.
Heute geht es jedoch um eine andere Möglichkeit …
crosstalk ist eine leistungsfähige Ergänzung zu plotly: Man kann damit zwei Diagramme interaktiv verknüpfen.
Beide Pakete wurden von Carson Sievert initiiert. help(package = “plotly”) / help(package = “crosstalk”), um Mitstreiter abzurufen.
Wir benötigen ein Shared Data Object für die Verknüpfung der Kontrollelemente mit dem Diagramm. Die Kernfunktionalität basiert auf dem R6-Paket und dem gleichnamigen System für objektorientiertes Programmieren in R.
---
title: "Plotly: Kontroll-Elemente wie in Shiny Apps - ohne Shiny!"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
theme: spacelab
source_code: embed
fontsize: 16pt
---
World Bank Data: WDI
=======================
Die Daten stammen von **The World Bank**: *World Development Indicators*, WDI.
Bequem geladen mit dem **WDI-Paket**.
```{r setup}
library(knitr)
library(kableExtra)
library(flexdashboard)
library(WDI)
library(tidyverse)
library(plotly)
library(crosstalk)
library(ggthemes)
knitr::opts_chunk$set(echo = FALSE)
# cache <- WDIcache()
# Noteworthy indicators, but with many missings:
# renewable_energy_consumption = "EG.FEC.RNEW.ZS",
# GDP_per_cap = "6.0.GDPpc_constant",
# GDP_usd = "6.0.GDP_usd",
# GNI_per_cap = "6.0.GNIpc"
# obesity_pct = "HF.STA.OB18.ZS",
# overweight_pct = "HF.STA.OW18.ZS"
# data_org <- WDI(country = "all",
# indicator = c(survival_15_60 = "HD.HCI.AMRT",
# life_expectancy = "SP.DYN.LE00.IN",
# air_pollution = "EN.ATM.PM25.MC.M3"),
# extra = TRUE,
# cache = cache)
# saveRDS(data_org, "WDI_data.rds")
data_org <- readRDS("WDI_data.rds")
data <- data_org %>%
filter(region != "Aggregates") %>%
filter(!is.na(air_pollution) & !is.na(life_expectancy)) %>%
filter(year == 2017)
data %>%
select(country, year, air_pollution, life_expectancy, region, capital) %>%
head() %>%
kbl() %>%
kable_paper("hover", full_width = FALSE,
lightable_options = "striped",
font_size = 18)
```
Heute geht es um **Luftverschmutzung** *(air pollution)*, definiert als durchschnittliche jährliche Menge in Mikrogramm pro Kubikmeter, der Menschen ausgesetzt sind, sowie **Lebenserwartung** *(life expectancy)* in Jahren zum Geburtszeitpunkt.
ggplot2 und ggplotly
====================
Column
------
```{r static-plot, fig.width = 9, fig.height = 6}
p <- data %>%
ggplot(aes(x = air_pollution, y = life_expectancy, group = country, color = region)) +
geom_point(size = 3, alpha = 0.8) +
theme_economist_white(base_family = "Verdana") +
# scale_color_economist() +
# scale_colour_viridis_d() +
scale_color_brewer(palette = "Dark2") +
labs(title = "Life Expectancy vs. Air Pollution 2017",
x = "Air Pollution
Mean Annual Exposure in micrograms per cubic meter",
y = "Life Expectancy\nat birth in years",
caption = "Data Source: World Bank, World Development Indicators (WDI),
obtained via the WDI R package, version 2.7.1") +
theme(legend.position = "right",
legend.text = element_text(size = 14),
legend.title = element_blank())
p
```
Column
------
```{r ggplotly, fig.width = 9, fig.height = 6}
ggplotly(p)
# ggplotly(p) %>%
# layout(annotations = list(
# x = 2016, y = 250, xanchor = 'right',
# showarrow = FALSE,
# # xshift = 0, yshift = 0, xref = 'paper', yref = 'paper',
# text = "Data Source: World Bank, World Development Indicators (WDI),
# obtained via the WDI R package, version 2.7.1"),
# font = list(size = 11)
# )
```
Mögliche Verbesserung: Facets.
Heute geht es jedoch um eine andere Möglichkeit ...
plotly und crosstalk: Regionen und Länder interaktiv auswählen
==============================================================
```{r plotly-crosstalk}
shared_data <- data %>%
select(country, air_pollution, life_expectancy, region) %>%
na.omit() %>%
mutate(region = stringr::str_replace(region, "&", "and"),
air_pollution = round(air_pollution, 1),
life_expectancy = round(life_expectancy, 1)) %>%
SharedData$new()
p <- shared_data %>%
plot_ly(x = ~air_pollution, y = ~life_expectancy, color = ~region,
hoverinfo = "text",
text = ~paste("Country:", country,
"
Region:", region,
"
Air Pollution:", air_pollution,
"
Life Expectancy:", life_expectancy)) %>%
group_by(region) %>%
add_markers(size = 3) %>%
layout(xaxis = list(title = "Air Pollution
Mean Annual Exposure in micrograms per cubic meter"),
yaxis = list(title = "Life Expectancy
at birth in years"),
legend = list(font = list(size = 16)))
# Combining several selectors
bscols(widths = c(3, 9),
list(
filter_checkbox(id = "region", label = "Region",
sharedData = shared_data, group = ~region),
filter_select(id = "country", label = "Country",
sharedData = shared_data, group = ~country),
filter_slider(id = "slider_ap", label = "Air Pollution",
sharedData = shared_data, column = ~air_pollution),
filter_slider(id = "slider_le", label = "Life Expectancy",
sharedData = shared_data, column = ~life_expectancy)
),
p)
```
Anmerkungen
===========
**crosstalk** ist eine leistungsfähige Ergänzung zu **plotly**: Man kann damit zwei Diagramme interaktiv verknüpfen.
Beide Pakete wurden von **Carson Sievert** initiiert. *help(package = "plotly")* / *help(package = "crosstalk")*, um Mitstreiter abzurufen.
Wir benötigen ein **Shared Data Object** für die Verknüpfung der Kontrollelemente mit dem Diagramm. Die Kernfunktionalität basiert auf dem **R6**-Paket und dem gleichnamigen System für objektorientiertes Programmieren in R.