I kapitlet Facets (Subgrafer) demonstrerades hur en kategorisk variabel kan användas för att skapa flera subgrafer (facets) som presenterar av subgrupper av data. Detta görs med funktioner i ggplot2 (facet_wrap()
och facet_grid()
). Dessa funktioner kan inte användas för att placera separata grafer intill varandra. För det ändamålet behövs tilläggspaket till ggplot2
. De två mest populära paketen är gridExtra
och cowplot
. Här kommer endast cowplot
demonstreras eftersom det erbjuder alla funktioner som behövs, även för mer de mest avancerade användarna. Cowplot har en intuitiv syntax och skapar enhetliga och organiserade layouter med mycket hög flexibilitet.
Börja med att installera och aktivera cowplot
. Aktivera även tidyverse
som bland annat innehåller ggplot2
och gapminder
som innehåller övningsdata.
install.packages("cowplot")
library(cowplot)
library(tidyverse)
library(gapminder)
# Inspektera gapminders första 5 rader
head(gapminder)
country<fctr> | continent<fctr> | year<int> | lifeExp<dbl> | pop<int> | gdpPercap<dbl> |
---|---|---|---|---|---|
Afghanistan | Asia | 1952 | 28.801 | 8425333 | 779.4453 |
Afghanistan | Asia | 1957 | 30.332 | 9240934 | 820.8530 |
Afghanistan | Asia | 1962 | 31.997 | 10267083 | 853.1007 |
Afghanistan | Asia | 1967 | 34.020 | 11537966 | 836.1971 |
Afghanistan | Asia | 1972 | 36.088 | 13079460 | 739.9811 |
Afghanistan | Asia | 1977 | 38.438 | 14880372 | 786.1134 |
För att organisera flera grafer i en layout behöver varje graf sparas som ett objekt. Objekten i detta kapitel kommer benämnas plot_1
, plot_2
, plot_3
och plot_4
. Skillnaden mellan dessa grafer kommer vara liten men det har ingen betydelse för att demonstrera hur grafer organiseras.
Vi börjar med att skapa plot_1
, plot_2
, plot_3
och plot_4
med data från gapminder. Skillnaden på nedanstående grafer är endast vad som finns på x-axel, y-axel samt färgtemat.
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Vi använder nu plot_grid()
från cowplot för att organisera plot_1 och plot_2 till en figur med 2 kolumner (ncol
). Vi skapar även labels
, som framgår nedan.
plot_grid(plot_1, plot_2, ncol = 2, labels = c('A', 'B'))
Figurerna kan placeras vertikalt istället genom att ändra ncol
till ncol=1
. Nedan använder vi labels="AUTO"
istället för att få labels automatiskt.
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Vi kan också använda align="h"
för horisontell placering av figurer, respektive align="v"
för vertikal placering.
plot_grid(plot_1, plot_2, aligh = "h")
Vi kan justera hur stor andel av utrymmet som varje graf ska uppta genom argumentet rel_widths()
. Nedan får första grafen hälften (1) så mycket utrymme som andra grafen (2).
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Notera i nedanstående graf att titeln på övre figurens y-axel har större distans från y-axelns siffror.
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
När figurerna i en plot_grid()
inte är placerade i linje vad avser titlar och axlar används argumentet axis
för att justera detta. Axis har argumenten none
, l
(left), r
(right), b
(bottom) och t
(top). Du kan använda en eller flera av dessa för att justera respektive sida. Nedan justerar vi graferna åt vänster med axis="l"
.
plot_grid(plot_1, plot_2, ncol = 1, align = 'v', axis = 'l')
Du kan skapa tomma figurutrymmen med argumentet NULL
i plot_grid()
. Nedan skapar vi en matris med fyra figurer varav två är NULL
, och vi lägger till labels automatiskt.
plot_grid(
plot_1, NULL, NULL, plot_2,
labels = "AUTO",
ncol = 2
)
Du kan skapa matriser med figurer på flera rader och med varierande storlekar på dessa rader. Detta görs genom att skapa flera plot_grid()
som sedan används som objekt i en slutlig plot_grid()
.
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Gemensam rubrik för många paneler
Med plot_grid()
kan man ge varje panel en label och själva panelen kan ha en title skapad med ggplot()
. Det kan dock vara önskvärt att ha en titel som sträcker sig över flera paneler. Detta åstadkommer man med ggdraw()
, enligt följande:
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Överlappa figurer
Det kan vara användbart att överlappa figurer för att tydligare åskådliggöra samband. Detta är användbart om figurerna delar en axel (oftast x-axeln). Om två figurer har samma x-axel men olika y-axlar, så kan figurerna överlappas för att sambandet mellan x-axeln och båda y-axlarna kan visualiseras med överlappning. Detta kan ibland resultera i tydligare illustrationer, även om vinsten - jämfört med två separata figurer placerade bredvid varandra - egentligen är ganska liten.
För denna övning använder vi mpg (miles per gallon) data som innehåller data på bränsleförbrukning (variablerna cty
och hwy
) för olika bilar. Dessa data finns i tidyverse, vilket innebär att de borde finnas tillgängliga nu (annars skall tidyverse aktiveras med kommandot library(tidyverse)
). Börja med att inspektera data:
head(mpg)
manufacturer <chr> | model <chr> | displ <dbl> | year <int> | cyl <int> | trans <chr> | drv <chr> | cty <int> | hwy <int> | fl <chr> |
---|---|---|---|---|---|---|---|---|---|
audi | a4 | 1.8 | 1999 | 4 | auto(l5) | f | 18 | 29 | p |
audi | a4 | 1.8 | 1999 | 4 | manual(m5) | f | 21 | 29 | p |
audi | a4 | 2.0 | 2008 | 4 | manual(m6) | f | 20 | 31 | p |
audi | a4 | 2.0 | 2008 | 4 | auto(av) | f | 21 | 30 | p |
audi | a4 | 2.8 | 1999 | 6 | auto(l5) | f | 16 | 26 | p |
audi | a4 | 2.8 | 1999 | 6 | manual(m5) | f | 18 | 26 | p |
Vi skapar den första figuren (se kommentarer för förklaringar) enligt följande:
plot_1 <- ggplot(mpg, aes(x=manufacturer,
y=hwy)) +
geom_boxplot() +
# Temat "half open" har inget rutnät och endast två linjer (x-axel och y-axel)
theme_half_open() +
theme(
# Roterar labels på x-axeln 45°
axis.text.x = element_text(angle = 45, hjust = 1, vjust= 1),
# Tar bort titeln på x-axeln
axis.title.x = element_blank())
plot_1
Notera att figuren inte har linjer på högra sidan och överst. Vi fortsätter med andra figuren:
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Slutligen skall dessa två grafer överlappas. Detta görs med align_plots()
och ggdraw()
, som följer:
# Placera graferna ovanpå varandra
aligned_plots <- align_plots(plot_1, plot_2, align="hv", axis="tblr")
# Visa den färdiga grafen
ggdraw(aligned_plots[[1]]) + draw_plot(aligned_plots[[2]])