Ternære plots
Overview
Teaching: 0 min
Exercises: 0 minQuestions
FIXME
Objectives
FIXME
Sådden nogen her:
Hvis du ved at du har brug for at lave sådan et - så ved du også hvordan du skal aflæse dem. Men vi har lige et eksempel eller to til sidst alligevel.
Vi skal bruge en ekstra pakke, ggtern
.
library(ggtern)
Registered S3 methods overwritten by 'ggtern':
method from
grid.draw.ggplot ggplot2
plot.ggplot ggplot2
print.ggplot ggplot2
--
Remember to cite, run citation(package = 'ggtern') for further info.
--
Attaching package: 'ggtern'
The following objects are masked from 'package:ggplot2':
aes, annotate, ggplot, ggplot_build, ggplot_gtable, ggplotGrob,
ggsave, layer_data, theme_bw, theme_classic, theme_dark,
theme_gray, theme_light, theme_linedraw, theme_minimal, theme_void
Så skal vi bruge noget data der kan plottes på den måde. De kommer oprindeligt herfra: https://ourworldindata.org/electricity-mix
Dem indlæser vi:
elmix <- read_csv("../data/electricity-prod-source.csv")
Rows: 8070 Columns: 15
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): land, code
dbl (13): aar, Coal, Gas, Hydro, Nuclear, Oil, Other_renewables, Solar, Wind...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Du kan finde dem her: (indsæt link når siden er renderet første gang).
Vi kan lave dem på to måder. Enten direkte:
elmix %>%
filter(aar == 2018, land == "Sweden") %>%
ggtern(aes(x=fossil/total,
y = vedvarende/total,
z = kernekraft/total)) +
geom_point()

plot of chunk unnamed-chunk-4
den ser ud som den gør, fordi fordelingen af elproduktionen i Sverige i 2018 var således:
elmix %>%
filter(aar == 2018, land == "Sweden") %>%
transmute(fossil = fossil/total,
vedvarende = vedvarende/total,
kernekraft = kernekraft/total) %>%
pivot_longer(everything(), names_to = "kilde",
values_to = "andel") %>%
mutate(andel = scales::percent(andel)) %>%
knitr::kable()
|kilde |andel | |:———-|:—–| |fossil |2% | |vedvarende |56% | |kernekraft |42% | I stedet kan vi bruge ggplot (ggtern er baseret på den), og supplere med et nyt koordinatsystem:
tern_plot <- elmix %>%
filter(aar == 2018, land == "Sweden") %>%
ggplot(aes(x=fossil,
y = vedvarende,
z = kernekraft)) +
coord_tern() +
geom_point()
Coordinate system already present. Adding new coordinate system, which will
replace the existing one.
tern_plot

plot of chunk unnamed-chunk-6
Bemærk også at det ikke var nødvendigt at beregne andelene - det klarer ggtern for os. Det var heller ikke nødvendigt i det første eksempel.
Vi kan bruge andre (men ikke alle) geoms fra ggplot. geom_text til at sætte etiketter på eksempelvis. Vi får advarsler i konsollen hvis vi prøver at gøre noget der ikke er muligt.
ggtern kommer med egne ekstra geoms.
tern_plot + geom_crosshair_tern()

plot of chunk unnamed-chunk-7
Der kan gøre det lettere at aflæse punkterne. Det er stadig pænt svært at huske hvad der er hvad. ggtern har nogen themes, der kan gøre det lettere:
tern_plot +
geom_crosshair_tern() +
theme_hidetitles() +
theme_showarrows()

plot of chunk unnamed-chunk-8
Der er mange andre ting gemt i pakken. Læs evt. dokumentationen.
Stier kan bruges til at illustrere hvordan tingene har udviklet sig. Her skal vi huske at der kan optræde NA værdier i datasættet. Dem kan vi ikke plotte. vi bruger geom_path som geom - og smider en pil på, så vi kan se hvilken vej Frankrig bevæger sig.
elmix %>%
filter(land == "France") %>%
filter(complete.cases(.)) %>%
ggplot(aes(x=fossil,
y = vedvarende,
z = kernekraft)) +
geom_path(arrow = arrow(length=unit(.2, "cm"))) +
coord_tern() +
theme_hidetitles() +
theme_showarrows()
Coordinate system already present. Adding new coordinate system, which will
replace the existing one.

plot of chunk unnamed-chunk-9
Blot som et eksempel på hvad man kan få ud hvis man bruger et par timer på hjælpefilerne:
ggtern(data = data.frame(x = rnorm(100),
y = rnorm(100),
z = rnorm(100)),
aes(x, y, z)) +
stat_density_tern(geom = 'polygon',
n = 200,
aes(fill = ..level..,
alpha = ..level..),
bdl = 0.02) +
geom_point() +
theme_rgbw() +
labs(title = "Example Density/Contour Plot") +
scale_fill_gradient(low = "blue",high = "red") +
guides(color = "none", fill = "none", alpha = "none")
Warning: The dot-dot notation (`..level..`) was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(level)` instead.
ℹ The deprecated feature was likely used in the ggplot2 package.
Please report the issue at <https://github.com/tidyverse/ggplot2/issues>.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
generated.
Warning: Removed 93 rows containing non-finite values (`StatDensityTern()`).

plot of chunk unnamed-chunk-10
Key Points
FIXME