Scales, axlar, legends (guides)

I ggplot2 finns automatiska funktioner som optimerar skalor för x-axel, y-axel, color, fill, och figurförklaringar (eng. figure legends). Genom att justera skalor kan vi modifiera utseendet på x-axel och y-axel. Skalor används också för att modifiera figurförklaringars innehåll. Det innebär att skalor används för att modifiera både axlar och figurförklaringar. Tillsammans kallas axlarna och figurförklaringarna för figurens guides.

I detta kapitel kommer vi använda data från undersökningen mpg. Säkerställ att tidyverse är aktiverat, vilket resulterar i att även ggplot2 och mpg är aktiverat:

library(tidyverse)

## Inspektera första 5 raderna i mpg
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

mpg data.

I följande exempel skapas en graf med x-axel, y-axel och färgkodning (color) baserat på kolumnen class:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point()
Spridningsdiagram av motorvolym (displ) mot bränsleförbrukning på motorväg (hwy) i mpg, färgat efter bilklass (class)

Av ovanstående graf framgår att ggplot() automatiskt skapat en skala för x-axel, y-axel och en skala för färgerna på datapunkterna. Detta gör ggplot() med funktionerna scale_x_continuous(), scale_y_continuous() och scale_colour_discrete(). Vi behöver inte specificera dessa funktioner i koden ovan eftersom ggplot() gör det automatiskt. Om vi lägger till dessa funktioner får vi en identisk graf:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous() +
  scale_y_continuous() +
  scale_colour_discrete()
Samma spridningsdiagram av displ mot hwy färgat efter bilklass, ritat med uttryckligt angivna standardskalor

Dessa funktioner och deras namn tolkas som följer:

Funktion Förklaring
scale_x_continuous() Modifierar en kontinuerlig (numerisk) x-axel. I ovanstående exempel modifieras skalan för displ.
scale_x_continuous() Modifierar en kontinuerlig (numerisk) y-axel. I ovanstående exempel modifieras skalan för hwy.
scale_colour_discrete Modifierar colour (color) argument som är en diskret variabel. I ovanstående exempel modifieras skalan för class.

Andra scale-funktioner används på samma sätt och följer samma princip för namngivning:

  • Om x-axeln är en numerisk variabel så justeras den med scale_x_continuous().
  • Om y-axeln är en numerisk variabel så justeras den med scale_y_continuous().
  • Om x-axeln är en kategorisk variabel så justeras den med scale_x_discrete().
  • Om y-axeln är en kategorisk variabel så justeras den med scale_y_discrete().
  • Om color är en kategorisk variabel så justeras den med scale_color_continuous().
  • Om color är en kategorisk variabel så justeras den med scale_color_discrete().

Guides: axlar och legends

Figurens guides (sv. guider) består av axlarnas (x, y) skala och figurförklaringarna. Axlar och figurförklaringar (legends) modifieras med argumenten som följer:

  • breaks: modifierar vilka siffror som visas på en axel, respektive vilka kategorier som visas i en figurförklaring.
  • labels: modifierar labels som visas på en axel eller i en figurförklaring.
  • limits: modifierar axlarnas intervall.

Axlar (x, y)

Vi fortsätter på föregående graf, där vi nu tar bort x-axelns och y-axelns skala. Detta görs genom att deklarera breaks=NULL, enligt följande:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = NULL) +
  scale_y_continuous(breaks = NULL)
Spridningsdiagram av displ mot hwy där skalmarkeringar, skalvärden och rutnät på x- och y-axeln har tagits bort

I första figuren såg vi att x-axeln går från 2 till 7 med intervaller på 1,0. Vi ändrar skalan så den går från 2 till 7 med med intervaller på 0,5. Detta görs genom att breaks får en sekvens (med funktionen seq()) från 2 till 7 med 0.5 mellanrum, enligt följande:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = seq(from=2, to=7, by=0.5))
Spridningsdiagram av displ mot hwy där x-axeln har brytpunkter med 0,5 enheters mellanrum från 2,0 till 7,0

I nästa exempel ändrar vi så att x-axelns begränsning utökas från 0 till 15:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = seq(from=2, to=7, by=.5),
                     limits = c(0, 10))
Spridningsdiagram av displ mot hwy där x-axelns gränser är utvidgade så att punkterna samlas i mitten av figuren

I nästa exempel begränsar vi x-axeln till intervallet 1 till 5 och vi ersätter siffrorna med nya labels, nämligen de första fem bokstäverna:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = seq(1, 5, by=1),
                     limits = c(1, 5),
                     labels = c("A", "B", "C", "D", "E"))
Spridningsdiagram av displ mot hwy där x-axelns skalvärden har ersatts med etiketterna A till E

Figurförklaringar (legends)

Som nämnt ovan har breaks och limits även effekt på figurförklaringar. Själva figurförklaringen skapas utifrån den estetiska mappningen. I nedanstående exempel används color=class i aes(). För att modifiera denna skalan använder vi funktionen scale_color_discrete(). Vi anger att breaks endast inenhåller "pickup" och den får labeln "Pickup car".

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_color_discrete(breaks=c("pickup"),
                       labels=c("Pickup car"))
Spridningsdiagram av displ mot hwy färgat efter bilklass där figurförklaringen bara visar en klass med etiketten Pickup car

På så vis kan även ordningen i figurförklaringen justeras.

Position på figurförklaring (figur legends)

Placeringen av figurförklaring påverkar inte data som presenteras i grafen. Sådana komponenter justeras med theme(). Figurförklaringen kan positioneras var som helst i figuren. Nedan följer flera exempel med justeringar av förklaringens position.

I första exemplet tar vi bort figurförklaringen med argumentet legend.position = "none".

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  theme(legend.position = "none")
Spridningsdiagram av displ mot hwy färgat efter bilklass där figurförklaringen har tagits bort helt

Argumentet legend.position accepterar även specifikationerna "bottom", "top", "right", "left". Detta demonstreras nu med "bottom" som val:

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  theme(legend.position = "bottom")
Spridningsdiagram av displ mot hwy färgat efter bilklass med figurförklaringen placerad under diagrammet i två rader

Andra alternative placeringar med textsträngar följer:

  • theme(legend.position = "top")
  • theme(legend.position = "bottom")
  • theme(legend.position = "left")
  • theme(legend.position = "right")

Du kan också positionera legends med koordinater, där både x- och y-axeln går från 0 till 1. För att få legends positionerad längst ner till höger är koordinaterna x=1 och y=0, vilket anges i en numerisk vektor (c(1, 1)).

Du kan också positionera legends med koordinater, där både x- och y-axeln går från 0 till 1. För att få legends positionerad längst upp till höger är koordinaterna x=1 och y=1, vilket anges i en numerisk vektor (c(1, 1)). I theme() har legend ytterligare argument (legend.justification, legend.margin, etc) som vi också kommer använda här nedan för att optimera läget på legend. I koden följer kommentarer som förklarar vad varje argument gör.

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  theme(
    # Legend positioneras högst upp till höger
    legend.position = c(1, 1),

    # Legend tillåts inte gå utanför grafens begränsning
    legend.justification = c("right", "top"),

    # Margin skapar en marginal mellan legend och dess omgivning.
    # 10 mm margin används på alla 4 kanter
    legend.margin = margin(10, 10, 10, 10),

    # Bakgrunden tas bort genom att specificera det som ett blankt element
    legend.background = element_blank())
Spridningsdiagram av displ mot hwy med figurförklaringen placerad inuti diagrammets övre högra hörn
Med guides() är det möjligt att justera enskilda legends i en figur. Låt oss justera läget och utseendet på legends för biltillverkare (manufacturer) ovan. Detta gör vi genom ett ändra antal rader (nrow) som legends presenteras på, samt storleken (size) på formerna i legends.
ggplot(mpg, aes(x=displ,
                y=hwy,
                color=manufacturer,
                shape=drv)) +
  geom_point(size=3) +

  # Placera legends ovanför grafen
  theme(legend.position = "top") +

  # Ändrar enskilda legends
  guides(colour = guide_legend(nrow = 3, #antal rader
                               override.aes = list(size = 4), # storlek på förklaringarna
                               order = 2), # ordningsföljden
         shape = guide_legend(nrow = 3,
                              override.aes = list(size = 4),
                              order = 1))
Spridningsdiagram av displ mot hwy med färg efter tillverkare och form efter drivning, figurförklaringar ovanför i tre rader

Vi kan använda guides() för att dölja en enskild legends. Här nedan döljer vi legends för shapes och vi byter label för legend för color till "Biltillverkare".

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=manufacturer,
                shape=drv)) +
  geom_point() +
  theme(legend.position = "top") +
  guides(colour = guide_legend(title="Biltillverkare",
                               nrow = 3,
                               override.aes = list(size = 5)),
         # Dölj legend för shape
         shape = "none")
Spridningsdiagram av displ mot hwy där bara figurförklaringen för tillverkare visas, med rubriken Biltillverkare och större symboler

Ersätta eller transformera en skala

En numerisk skala kan transformeras för att tydligare åskådliggöra samband i data. I nästa exempel använder vi data från gapminder för att visualisera hur befolkningsmängd (pop) och förväntad livslängd (lifeExp) korrelerar. Vi gör detta med och utan logaritmering av axlarna. För att placera figurerna bredvid varandra skickar vi ggplot()-objekten till två nya objekt (plot_1, plot_2) som vi sedan använder i plot_grid() från paketet cowplot.

library(gapminder)

## Utan logaritm
plot_1 <- ggplot(gapminder, aes(x=pop,
                                y=lifeExp,
                                color=year)) +
  geom_point() +
  labs(title="Utan logaritmerade axlar") +
  theme(legend.position = "bottom")

## Med logaritm
plot_2 <- ggplot(gapminder, aes(x=pop,
                                y=lifeExp,
                                color=year)) +
  geom_point() +
  scale_x_log10() +
  scale_y_log10() +
  labs(title="Med logaritmerade axlar") +
  theme(legend.position = "bottom")

library(cowplot)
plot_grid(plot_1, plot_2)
Två spridningsdiagram av befolkning mot förväntad livslängd i gapminder, utan respektive med logaritmerade axlar

Ändra färgskala och färgpalett

R Colorbrewer

Scale används också för att färga diskreta variabler. I ggplot finns inbyggda färgpaletter där färgerna valts med omsorg. Därutöver finns andra färgpaletter med mer specifika syften. Exempelvis finns R ColorBrewer som består av ett antal färgpaletter som är särskilt lämpliga för färgblinda. För att se alla färgpaletterna i R ColorBrewer skriver du följande kommando:

RColorBrewer::display.brewer.all()
Översikt av alla ColorBrewer-paletter i R: sekventiella, kvalitativa och divergerande färgskalor

Du kan använda dessa färgpaletter i ggplot genom funktionen scale_color_brewer(). Som framgår av ovanstående figur finns en färgpalette som heter "Set3". Nedan använder vi "Set3" i scale_color_brewer().

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_color_brewer(palette = "Set1")
Spridningsdiagram av displ mot hwy där bilklasserna är färgade med en kvalitativ ColorBrewer-palett

På https://colorbrewer2.org/ kan du läsa mer om ColorBrewer.

Viridis

I paketet viridis finns scale_color_viridis() och scale_fill_viridis() vilka kan användas både för kontinuerliga och diskreta variabler. För kontinuerliga variabler är viridis att föredra framför ColorBrewer.

library(viridis)

## Viridis standardfärger
ggplot(gapminder, aes(x=pop,
                      y=lifeExp,
                      color=year)) +
  geom_point() +
  scale_color_viridis_c()

## Viridis plasma
ggplot(gapminder, aes(x=pop,
                      y=lifeExp,
                      color=year)) +
  geom_point() +
  scale_color_viridis_c(option = "plasma")
Spridningsdiagram av befolkning mot förväntad livslängd där punkterna färgas efter år med den kontinuerliga viridis-skalan
Spridningsdiagram av befolkning mot förväntad livslängd där punkterna färgas efter år med viridis-paletten plasma

Manuella färgskalor

Om de inbyggda färgpaletterna och paletter i paket som exempelvis viridis inte passar kan du skapa färgpaletten manuellt. Detta görs med scale_colour_manual() eller scale_fill_manual(). Här följer ett exempel där scale_colour_manual() används för att manuellt skapa färger åt bilar baserat på class.

ggplot(gapminder, aes(x=pop,
                y=lifeExp,
                color=continent)) +
  geom_point() +
    scale_colour_manual(values = c(Africa="darkblue",
                                   Asia="pink",
                                   Europe="green",
                                   Oceania="purple",
                                   Americas="cyan"))
Spridningsdiagram av befolkning mot förväntad livslängd med manuellt valda färger för varje kontinent

Med funktionerna scale_fill_gradient2() och scale_colour_gradient2() kan kontinuerliga variabler få en färgradient med en mittpunkt. I exemplet nedan används scale_colour_gradient2() för att färga datapunkter efter år 1980 med svarta punkter och datapunkter innan 1980 med gula punkter, med en gradient från 1980 i båda fallen. Notera att även axlarna är logaritmerade.

ggplot(gapminder, aes(x=pop,
                      y=lifeExp,
                      color=year)) +
  geom_point() +
  scale_colour_gradient2(midpoint=1980,
                         high = "black",
                         low = "gold") +
  scale_x_log10() +
  scale_y_log10()
Spridningsdiagram av befolkning (logaritmerad) mot förväntad livslängd med en tregradig färggradient efter år, gult via vitt till svart