Kod
library(ggplot2)Kompozycja wizualna to sposób prezentacji danych, który ma na celu ułatwienie zrozumienia informacji. Obejmuje to odpowiedni dobór elementów do wizualizacji oraz ich układu. Mówiąc szerzej można taż rozważać wizualizacje danych jako nie tylko wykresy, ale także tabele, mapy, diagramy, a także ich połączenia. Kompozycja wizualna to umiejętność łączenia różnych elementów wizualizacji w spójną całość.
W tej części zajmiemy się tworzeniem kompozycji wizualnych w języku R z wykorzystaniem pakietu ggplot2.
library(ggplot2)Tekst na wizualizacjach danych może nie tylko służyć do przedstawienia informacji, ale także mieć aspekt estetyczny. Jest on reprezentowany poprzez fonty, czyli zestawy znaków o określonym stylu i rozmiarze. Grupy fontów o podobnym wyglądzie nazywane są rodzinami fontów (ang. font families), np. Arial, Calibri, Helvetica. W ramach tych grup możemy dalej wyróżnić różne style (ang. font faces), takie jak plain, bold, czy italic.

Poniżej można zobaczyć przykład dwóch wizualizacji przedstawiających te same dane, ale z różnymi fontami.
library(showtext)
font_add_google("Roboto")
showtext_auto()gt1 = ggplot(data = df0sel, aes(x = PKB_na_osobe, y = Ocz_dl_zycia,
color = Region)) +
geom_point(size = 1, alpha = 0.8) +
labs(y = "Oczekiwana długość życia", x = "PKB na osobę (USD)", color = NULL, title = "Relacje zmiennych", subtitle = "Dane z 2019 roku", caption = "Dane pochodzą z portalu gapminder.org")
gt1
gt1 +
theme(plot.title = element_text(family = "Roboto", size = 20, face = "bold"),
plot.subtitle = element_text(family = "Roboto", size = 16, face = "italic"),
axis.title = element_text(family = "Roboto", size = 14),
axis.text = element_text(family = "Roboto", size = 12),
legend.title = element_text(family = "Roboto", size = 14),
legend.text = element_text(family = "Roboto", size = 12))
W pakiecie ggplot2 elementy związane ze stylem tekstu są zaimplementowane jako funkcje element_text() czy ggtext::element_markdown().
# install.packages("ggtext")
library(ggtext)
gt1 +
theme(plot.title = element_markdown(family = "Roboto", size = 20, face = "bold"))
W przypadku wizualizacji danych tekst może pełnić wiele ról.
Zwrócenie uwagi odbiory na poszczególne elementy wizualizacji:
gt1 +
labs(title = "Relacje zmiennych dla krajów <i style='color:#F8766D;'>**afrykańskich**</i> w porównaniu do reszty świata") +
theme(plot.title = element_markdown(family = "Roboto", size = 20))
Dodanie informacji z danych lub jej podkreślenie:
library(ggrepel)
df0selb = filter(df0sel, Populacja > 35000000, Populacja < 41000000)
gt1 +
geom_text_repel(data = df0selb, aes(label = Kraj), min.segment.length = 0, size = 8)
Dodanie zewnętrznej informacji:
cor(df0sel$PKB_na_osobe, df0sel$Ocz_dl_zycia)[1] 0.6492043
gt1 +
annotate(geom = "richtext", x = 140000, y = 60, size = 14,
label = "r = 0,65", fill = NA, label.color = NA)
Dodanie komentarza:
arrows = data.frame(x1 = 65000, x2 = 3650, y1 = 60, y2 = 55)
gt1 +
annotate("rect", xmin = 0, xmax = 6000, ymin = 50, ymax = 68, alpha = .1) +
annotate("text", x = 110000, y = 65, label = "Kraje o niskim PKB na osobę\nmają duże zróżnicowanie wartości\noczekiwanej długości życia", size = 8) +
geom_curve(
data = arrows, aes(x = x1, y = y1, xend = x2, yend = y2),
arrow = arrow(length = unit(0.08, "inch")), size = 0.5,
color = "gray20", curvature = -0.3)
Styl wizualny wykresu jest definiowany przez zestaw parametrów, które można modyfikować. W ggplot2 można to zrobić za pomocą funkcji theme(), która pozwala na dostosowanie wyglądu wykresu.
?themeModyfikowanie stylu wizualnego wykresu opiera się na określeniu wybranych argumentów funkcji theme(). Większość z tych argumentów oczekuje jednej z poniższych funkcji:
element_line(): kwestie związane z liniami, takie jak kolor, grubość, typ liniielement_text(): kwestie związane z tekstem, takie jak kolor, rozmiar, rodzinę czy styl fontuelement_rect(): kwestie związane z prostokątami, takie jak kolor wypełnienia, kolor obramowania, grubość liniielement_blank(): ustala brak elementuNiektóre argumenty mogą natomiast oczekiwać wartości numerycznych, tekstowych, czy wartośći podanych jednostek.
Domyślnie legenda jest umieszczana w miejscu, które jest uznawane za najbardziej odpowiednie przez ggplot2.
df0sel# A tibble: 190 × 8
Kraj Rok Region Populacja PKB_na_osobe Ocz_dl_zycia CO2_na_osobe Plodnosc
<chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Austr… 2019 Azja 2.54e7 49400 82.9 NA 1.82
2 Brunei 2019 Azja 4.38e5 61400 74.4 NA 1.84
3 Kambo… 2019 Azja 1.62e7 4460 69.9 NA 2.47
4 Chiny 2019 Azja 1.42e9 16000 77.6 NA 1.64
5 Fidżi 2019 Azja 9.18e5 13200 68.4 NA 2.45
6 Hongk… 2019 Azja 7.5 e6 59600 84.5 NA 1.36
7 Indon… 2019 Azja 2.70e8 11900 71.4 NA 2.29
8 Japon… 2019 Azja 1.26e8 41700 84.8 NA 1.5
9 Kirib… 2019 Azja 1.24e5 1960 60.8 NA 3.53
10 Korea… 2019 Azja 2.58e7 1990 73.2 NA 1.88
# ℹ 180 more rows
gg1 = ggplot(data = df0sel, aes(x = Ocz_dl_zycia, y = Plodnosc,
color = PKB_na_osobe)) +
geom_point(size = 4)
gg1
Możemy jednak zmienić jej położenie za pomocą argumentu legend.position, jej ułożenie za pomocą legend.direction, a także szerokość za pomocą legend.key.width.
gg1 + theme(legend.position = c(0.8, 0.9),
legend.direction = "horizontal",
legend.key.width = unit(1.25, "cm"))
Legendy można umiejscawaić także na zewnątrz wykresu.
gg1 + theme(legend.position = "top",
legend.key.width = unit(2.5, "cm"))
Do usunięcia legendy można użyć theme(legend.position = "none").
Styl wizualny siatki można modyfikować za pomocą funkcji element_line() używając argumentów takich jak panel.grid (cała siatka), panel.grid.major (główne linie siatki), panel.grid.minor (pomocnicze linie siatki), panel.grid.major.x (główne linie siatki w osi x), panel.grid.major.y (główne linie siatki w osi y), panel.grid.minor.x (pomocnicze linie siatki w osi x), panel.grid.minor.y (pomocnicze linie siatki w osi y).
gg1 + theme(panel.grid = element_line(color = "grey",
size = 1.5, linetype = 3))
gg1 + theme(panel.grid.major = element_line(color = "grey",
size = 1.5, linetype = 3))
gg1 + theme(panel.grid.major.x = element_line(color = "grey",
size = 1.5, linetype = 3))
gg1 + theme(panel.grid.minor = element_line(color = "grey",
size = 1.5, linetype = 3))



Usunięcie siatki natomiast polega na podaniu funkcji element_blank() jako argumentu.
gg1 + theme(panel.grid = element_blank())
Inny mechanizm modyfikowania siatek polega na zastosowaniu funkcji scale_x_continuous() lub scale_y_continuous() (w przypadku zmiennych ciągłych) lub scale_x_discrete() lub scale_y_discrete() (w przypadku zmiennych dyskretnych). Pozwalają one, między innymi, na określenie przedziałów siatki, jej wartości, czy też zakresów.
gg1 + scale_x_continuous(breaks = seq(51, 86, 5),
minor_breaks = seq(51, 85, 1))
gg1 + scale_x_continuous(breaks = seq(51, 86, 5),
minor_breaks = seq(51, 85, 1),
limits = c(60, 80))

Te funkcje dają także bardziej zaawansowane możliwości modyfikacji siatek, takie jak zmiana etykiet używając argumentu label.
lata = function(x){
paste(x, "lat")
}
gg1 + scale_x_continuous(breaks = seq(51, 86, 5), label = lata)
gg2 = gg1 + theme(plot.background = element_rect(color = "red", linewidth = 1))
gg2
?unit
gg2 + theme(plot.margin = margin(1, 2, 3, 4, "cm")) #trbl
library(showtext)
font_add_google("Roboto")
showtext_auto()theme_jn = function(){
base_family = "Roboto"
grid_col = "#cccccc"
theme(
panel.grid.major = element_line(color = grid_col, size = 0.4),
panel.grid.minor = element_line(color = grid_col, size = 0.12),
axis.ticks = element_line(size = 0.15),
text = element_text(family = base_family, size = 11.5),
panel.background = element_rect(fill = "white", color = NA)
)
}gg1 + theme_jn()
1D
ggplot(data = df0sel, aes(x = Ocz_dl_zycia)) +
geom_histogram()
2D
ggplot(data = df0sel, aes(x = Ocz_dl_zycia, y = Plodnosc)) +
geom_point()
3D
ggplot(data = df0sel, aes(x = Ocz_dl_zycia, y = Plodnosc, color = PKB_na_osobe)) +
geom_point()
4D
ggplot(data = df0sel, aes(x = Ocz_dl_zycia, y = Plodnosc, color = PKB_na_osobe, shape = Region)) +
geom_point()
5D
df0sel2$Grupa_pop = df0sel2$Populacja > 10000000
ggplot(data = df0sel2, aes(x = Ocz_dl_zycia, y = Plodnosc, color = PKB_na_osobe, shape = Region)) +
geom_point() +
facet_wrap(~ Grupa_pop)
6D
ggplot(data = df0sel2, aes(x = Ocz_dl_zycia, y = Plodnosc, color = PKB_na_osobe, shape = Region)) +
geom_point() +
facet_grid(Rok ~ Grupa_pop)
gg2 = ggplot(data = df0sel, aes(x = Ocz_dl_zycia)) +
geom_histogram()
gg2
gg3 = ggplot(data = df0sel, aes(x = Plodnosc)) +
geom_histogram()
gg3
library(cowplot)
plot_grid(gg2, gg3, ncol = 2)
plot_grid(gg2, gg3, nrow = 2, labels = "AUTO")
plot_grid(gg2, gg1, ncol = 2, rel_widths = c(1, 2))
pg1 = plot_grid(gg2, gg3, ncol = 2)
plot_grid(pg1, gg1, nrow = 2)
ggdraw(gg1) + draw_plot(gg2, 0.5, 0.65, 0.3, 0.3) 
ggsave("wykres.png", plot = g1, width = 10, height = 10, units = "cm", dpi = 300)
ggsave("wykres.tiff", plot = g1, width = 10, height = 10, units = "cm", dpi = 300)
ggsave("wykres.svg", plot = g1, width = 10, height = 10, units = "cm")png("wykres.png", width = 10, height = 10, units = "cm", res = 300)
g1
dev.off()