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()
= ggplot(data = df0sel, aes(x = PKB_na_osobe, y = Ocz_dl_zycia,
gt1 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)
= filter(df0sel, Populacja > 35000000, Populacja < 41000000)
df0selb +
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:
= data.frame(x1 = 65000, x2 = 3650, y1 = 60, y2 = 55)
arrows +
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.
?theme
Modyfikowanie 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
= ggplot(data = df0sel, aes(x = Ocz_dl_zycia, y = Plodnosc,
gg1 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
.
+ theme(legend.position = c(0.8, 0.9),
gg1 legend.direction = "horizontal",
legend.key.width = unit(1.25, "cm"))
Legendy można umiejscawaić także na zewnątrz wykresu.
+ theme(legend.position = "top",
gg1 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).
+ theme(panel.grid = element_line(color = "grey",
gg1 size = 1.5, linetype = 3))
+ theme(panel.grid.major = element_line(color = "grey",
gg1 size = 1.5, linetype = 3))
+ theme(panel.grid.major.x = element_line(color = "grey",
gg1 size = 1.5, linetype = 3))
+ theme(panel.grid.minor = element_line(color = "grey",
gg1 size = 1.5, linetype = 3))
Usunięcie siatki natomiast polega na podaniu funkcji element_blank()
jako argumentu.
+ theme(panel.grid = element_blank()) gg1
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.
+ scale_x_continuous(breaks = seq(51, 86, 5),
gg1 minor_breaks = seq(51, 85, 1))
+ scale_x_continuous(breaks = seq(51, 86, 5),
gg1 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
.
= function(x){
lata paste(x, "lat")
}+ scale_x_continuous(breaks = seq(51, 86, 5), label = lata) gg1
= gg1 + theme(plot.background = element_rect(color = "red", linewidth = 1))
gg2 gg2
?unit
+ theme(plot.margin = margin(1, 2, 3, 4, "cm")) #trbl gg2
library(showtext)
font_add_google("Roboto")
showtext_auto()
= function(){
theme_jn = "Roboto"
base_family = "#cccccc"
grid_col 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)
) }
+ theme_jn() gg1
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
$Grupa_pop = df0sel2$Populacja > 10000000
df0sel2ggplot(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)
= ggplot(data = df0sel, aes(x = Ocz_dl_zycia)) +
gg2 geom_histogram()
gg2
= ggplot(data = df0sel, aes(x = Plodnosc)) +
gg3 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))
= plot_grid(gg2, gg3, ncol = 2)
pg1 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)
g1dev.off()