A ggplot2 csomagot természetesen nem az efféle, pusztán a szórakozást szolgáló diagramok készítésére találták ki. De erre is jó. Merthogy itt technikailag egy diagramról van szó, amelynek létrehozása semmiben sem különbözik attól, mint ha egy tudományos munkákban megszokott ábrát készítenénk. Éppen ezért – a látszat ellenére – nem haszontalan dolog egy karácsonyfát imitáló diagram elkészítésére némi időt szánni, hiszen ezzel is gyakorolni lehet a ggplot2 használatát.

Hasonló dolgokkal egyébként már korábban is próbálkoztam. A furcsa diagramok sorozat keretei között tavaly decemberben ugyancsak egy karácsonyfát, idén júniusban pedig egy könyvespolcot készítettem. Lássuk tehát a karácsonyfa 2021-es verzióját!

Az alábbiakban R nyelven (v4.1.2) írt kódot használok a feladat végrehajtásához. A magyarázó szövegek közé ékelt fekete kódblokkok tartalmát az RStudio-ban egymás alá illesztve elvileg bárki által reprodukálható az itt bemutatott műveletsor. A kódblokkok # kezdetű sorai pusztán magyarázó funkcióval bírnak, ezekre a program futtatásakor nincs szükség.

Az ábra létrehozásakor az alábbi két csomagot használom:

  1. A ggplot2 segítségével hozzuk létre magát a diagramot.

  2. Az extrafont csomaggal a számítógépünkre feltelepített betűtípusok összességéből kiválaszthatjuk azt, amelyikkel feliratozni akarjuk a diagramunkat. (A ggplot2 alapértelmezés szerint egy minimalista sans-serif betűtípust használ.) Első használatkor a font_import() paranccsal kell indítani, aminek végrehajtása hosszú percekig is eltarthat. A későbbiekben azonban már csak a loadfonts(device = "win") parancsra van szükség a használatához.

Töltsük be ezeket a csomagokat és hozzunk létre egy munkakönyvtárat. Utóbbiba fog elmentődni a kész ábra.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# A szükséges csomagok betöltése.
# A legelső használat előtt az install.packages("...") utasítással telepíteni
# kell ezeket. A ... helyére az adott csomag neve írandó.
library(ggplot2)
library(extrafont)
#font_import() # Csak az első alkalommal futtatandó! Ekkor a # jelet ki kell venni a sor elejéről!
loadfonts(device = "win")

# Ide a saját munkakönyvtárunk elérését kell beírni!
setwd("C:/Munkakönyvtár")

Ha a betűtípusok importálása közben a No FontName. Skipping. hibaüzenetet látjuk, akkor a Stack Overflow ide belinkelt posztjában találunk segítséget.

Egy ggplot2-vel készült ábra felépítését annak analógiájára lehet elképzelni, mintha átlátszó fóliákra rajzolnánk vagy írnánk, majd ezeket a fóliákat egymásra rétegeznénk. Jelen esetben az annotate() függvénnyel három szöveges rétegből építjük fel a diagramot. Ennek első paramétere a “text” karakterlánc, a továbbiak pedig az alábbi táblában felsorolva szerepelnek.

Paraméter Magyarázat
x a szöveg elhelyezkedésének x koordinátája (numerikus érték)
y a szöveg elhelyezkedésének y koordinátája (numerikus érték)
label maga a szöveg (karakterlánc)
family a szöveg betűtípusa (karakterlánc)
size a szöveg mérete (numerikus érték)
color a szöveg színe (karakterlánc)

A family paraméternek csak akkor van hatása, ha az extrafont csomagot betöltöttük. Én a Script MT Bold és Arial Nova Light betűtípusokat használtam az ábra elkészítéséhez. Amennyiben ezek nem lennének feltelepítve a számítógépére, akkor értelemszerűen nem úgy jelenne meg az ábra, ahogy az alábbiakban látjuk.

Maga az algoritmus rövid és nem túl bonyolult. A további megjegyzéseket már közvetlenül a kódblokkba írom bele.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
ggplot() +
  # A fenyőfát imitáló ^ (unicode: 005e) karakterek hozzáadása.
  annotate("text", 
           label = "\u005e", 
           x = c(50,42.5,57.5,35,50,65,27.5,42.5,57.5,72.5), 
           y = c(50,43.5,43.5,37,37,37,30.5,30.5,30.5,30.5), 
           size = 50,
           color = "#cfdee3") +
  # A csillag (unicode: 2736) karakter hozzáadása.
  annotate("text",
           label = "\u2736",
           x = 50,
           y = 58,
           size = 30,
           color = "#ffff00") +
  # A szöveges részek hozzáadása.
  annotate("text",
           label = c("Boldog",
                     "Karácsonyt!",
                     "www.aprogramozotortenesz.hu"),
           x = 50,
           y = c(23,18,10),
           size = c(26,26,6),
           color = "#ffff00",
           family = c("Script MT Bold","Script MT Bold","Arial Nova Light")) +
  # A rajzterület méretének meghatározása.
  scale_y_continuous(limits = c(10,60)) +
  scale_x_continuous(limits = c(0,100)) +
  # A felesleges részek (diagram rácsozat, tengelyek) eltávolítása,
  # valamint a háttér zöldre és szürkére színezése.
  theme(panel.background = element_rect(fill = "#354a2f"),
        plot.background = element_rect(fill = "#cfdee3"),
        panel.grid = element_blank(),
        axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank())

# A diagram elmentése a munkakönyvtárba.
ggsave("karacsonyfa2021.png", device = "png", dpi = 300, width = 7, height = 9)

Ezek után nincs más hátra, minthogy kellemes ünnepeket kívánjak A programozó történész blog olvasóinak! 😍