Ini ialah aturaca membuat plot dan memasukkan table untuk informasi berkaitan plot menggunakan pakej ggplot2
. Table untuk informasi juga akan dibuat menggunakan ggplot2
yang kemudiannya digabungkan menggunakan pakej gridExtra
.
Untuk memastikan plot dan table akan sejajar, adalah penting untuk menggunakan skala yang sama. Skala ini boleh menggunakan nombor atau kumpulan (category). Bila menggunakan skala secara category adalah penting untuk menukarkan status kolom ke factor.
Contoh data:
library(data.table)
library(ggplot2)
navn <- c("Nama1", "Nama2 yang panjang", "Nama3")
N <- c(112, 210, 150)
N2 <- c(200, 250, 170)
dat <- data.table(navn, N, N2)
Untuk memastikan kedua-dua plot akan menggunakan skala yang sama, kita boleh buat dummy
untuk rujukkan skala. Disini rujukkan skala bermula dari nombor 1 ke nombor 3.
## create dummy reference
xrow <- nrow(dat)
dat[, ref := seq.int(xrow)]
Untuk membolehkan kita menambah perkataan contohnya Lokasi
atau Negara
, kita perlu tambah skala rujukkan. Bila guna fill=TRUE
di fungsi rbindlist
maka NA
akan dimasukkan di kolom yang kosong.
## create ref til extra text eg. N or Total
xref <- data.table(ref = xrow + 1) #locate at the end of the rows
dt <- rbindlist(list(dat, xref), fill = TRUE) #bind to the end rows
Untuk mengelakkan NA
akan dimasukkan diplot, maka kita perlu kosongkan NA
. Kemudian kolom yang akan dipakai untuk menamakan plot dan rujukkan plot ditukarkan ke factor.
## navn with NA blir tom
dt[is.na(navn), navn := ""]
## konvertere dt$navn og dt$ref as facor
dt[, `:=`(navn = as.factor(navn), ref = as.factor(ref))]
Setelah menukarkan kolom ke factor bolehlah mendapatkan kandungan kolom tersebut yang dipakai untuk menamakan plot dengan cara membuat vector menggunakan fungsi levels
. Untuk tidak memasukkan NA
diskala, hanya nama yang ada di vector sahaja yang dipakai.
## get levels for navn etter at den er konvertert til factor
pnavn <- levels(dt$navn)
dummyref <- factor(1:xrow) #brukes til scale_x_discrete for Γ₯ legge labels til aksen eksludert dummy linje 4 som skal brukes senere til N
Selepas itu bolehlah buat plot menggunakan rujukkan dummy
dan memastikan yang ref
dipakai secara factor.
## plot etter at "ref" og "navn" er konvertert til factor
(plotMain <- ggplot(dt, aes(factor(ref), N)) +
geom_bar(stat = "identity") +
coord_flip() +
scale_x_discrete(breaks = factor(dt$ref), labels = dt$navn) +
theme( #theme react on the current plot for x and y axis not before it's flip
#after flip then navn is current y-axis
axis.text.y = element_text(color = "blue", size = 10, hjust = 1),
axis.title.y = element_blank(),
axis.line.y = element_blank(), #ta bort linje pΓ₯ y-axis
axis.ticks.y = element_blank(),
axis.line.x = element_line(color = "black"),
panel.background = element_blank()
))
## plot tom ramme til tekst
(rpp <- ggplot(dt, aes(factor(ref))) +
scale_y_continuous(limits = c(0, 1)) +
coord_flip() +
theme(
axis.line = element_blank(),
axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
panel.background = element_blank()
))
## plot text figure
(plotText <- rpp +
annotate("text", x = factor(4), y = 0.25, label = "Local") +
annotate("text", x = factor(4), y = 0.75, label = "Nation") +
annotate("text", x = factor(dt$ref), y = 0.25, label = dt$N, hjust = 1) +
annotate("text", x = factor(dt$ref), y = 0.75, label = dt$N2, hjust = 1) +
geom_vline(xintercept = c(3.8, 4.2))
)
Untuk meletakkan plot dan table bersama boleh guna grid.arrange
dari pakej gridExtra
. Tetapi cara ini tidak memastikan yang y-aksis seragam.
library(gridExtra)
(plotpp <- grid.arrange(ggplotGrob(plotMain),
ggplotGrob(plotText),
ncol = 2, widths = unit(c(0.8, 0.2), "npc"))
)
Untuk meletakkan kedua-dua plot dan table bersama dan memastikan yang y-aksis seragam boleh menggunakan cara seperti di bawah. Guna heights
utk menyeragamkan aksis y manakala weights
untuk menyeragamkan aksis x. Contohnya unit.pmax(pp1$weights)
pp1 <- ggplotGrob(plotMain)
pp2 <- ggplotGrob(plotText)
maxHeight = unit.pmax(pp1$heights, pp2$heights)
pp1$heights <- maxHeight
pp2$heights <- maxHeight
grid.arrange(pp1, pp2, ncol = 2, widths = unit(c(0.8, 0.2), "npc"))
ggplot2::ggsave("plottable1.svg")
Selain cara ini, boleh juga menggunakan fungsi plot_grid
dari pakej Cowplot dan menggunakan align = "h"
untuk horizontal (sama y-aksis)
library(cowplot)
cplot <- plot_grid(plotMain, plotText, nrow = 1, align = "h", rel_widths = c(4, 1))
cowplot::save_plot("cowplot.svg", cplot, ncol = 2, base_aspect_ratio = 1.3)
cowplot::ggsave("cowplot2.svg", cplot)
Hasilnya ialah seperti ini: