Pokud proměnná nabývá několika hodnot, je běžné shrnout informace pomocí tabulky četností, kterou lze v R znázornit pomocí sloupcového grafu nebo sloupcového grafu. V tomto článku si vysvětlíme základy tvorby sloupcových grafů v R.
- Funkce barplot v R
- Grafické parametry sloupcového grafu: nadpis, popisky os a barvy
- Změnit popisky skupin
- Šířka sloupců a mezera mezi sloupci
- Sloupcový graf z datového rámce nebo seznamu
- Sloupcový graf pro spojitou proměnnou
- Horizontální sloupcový graf
- Legenda sloupcového grafu
- Seskupený sloupcový graf v R
- Mezera mezi skupinami
- Číselné hodnoty ve skupinách
- Sloupcový graf s chybovými sloupci v R
- Složený sloupcový graf v R
- Sloupcový graf v R: ggplot2
- Horizontální sloupcový graf ggplot2
Funkce barplot v R
Pro vytvoření sloupcového grafu v R můžete použít základní funkci R barplot
. V tomto příkladu vytvoříme sloupcový graf z datového rámce. Konkrétně je příkladem datový soubor známý mtcars
. Nejprve načtěte data a vytvořte tabulku pro sloupec cyl
pomocí funkce table
.
# Load datadata(mtcars)attach(mtcars)# Frequency tablemy_table <- table(cyl)my_table
cyl 4 6 811 7 14
Připomeňte si, že pro vytvoření sloupcového grafu v R můžete použít funkci barplot
, která jako parametr nastaví vaši dříve vytvořenou tabulku pro zobrazení absolutní četnosti dat. Pokud však dáváte přednost sloupcovému grafu s procenty na svislé ose (relativní četnost), můžete použít funkci prop.table
a výsledek vynásobit 100 takto:
# One row, two columnspar(mfrow = c(1, 2))# Absolute frequency barplotbarplot(my_table, main = "Absolute frequency", col = rainbow(3))# Relative frequency barplotbarplot(prop.table(my_table) * 100, main = "Relative frequency (%)", col = rainbow(3))par(mfrow = c(1, 1))
Poznamenejte, že sloupcový graf s faktorovými daty můžete vytvořit také pomocí funkce plot
.
plot(factor(mtcars$cyl), col = rainbow(3))
Dále můžete zobrazit čísla na sloupcích pomocí funkce text takto:
barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))text(barp, my_table + 0.5, labels = my_table)
Můžete také přidat mřížku za sloupce pomocí funkce grid
.
barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))grid(nx = NA, ny = NULL, lwd = 1, lty = 1, col = "gray")barplot(my_table, col = rainbow(3), ylim = c(0, 15), add = TRUE)
Grafické parametry sloupcového grafu: nadpis, popisky os a barvy
Stejně jako u jiných grafů můžete zadat celou řadu grafických parametrů, například popisky os, nadpis nebo přizpůsobit osy. V předchozím bloku kódu jsme přizpůsobili barvy sloupcového grafu pomocí parametru col
. Barvy, které preferujete, můžete nastavit pomocí vektoru nebo použít funkci rainbow
s počtem sloupců jako parametrem, jako jsme to udělali my, nebo použít jiné funkce barevné palety. Můžete také změnit barvu ohraničení sloupců pomocí argumentu border
.
barplot(my_table, # Data main = "Customized bar plot", # Title xlab = "Number of cylinders", # X-axis label ylab = "Frequency", # Y-axis label border = "black", # Bar border colors col = c("darkgrey", "darkblue", "red")) # Bar colors
Změnit popisky skupin
Popisky jednotlivých skupin lze změnit pomocí argumentu names.arg
. V našem příkladu jsou skupiny označeny čísly, ale můžeme je změnit zadáním něčeho podobného:
barplot(my_table, names.arg = c("four", "six", "eight"))
Šířka sloupců a mezera mezi sloupci
Můžete také změnit mezeru mezi sloupci nebo šířku sloupců pomocí argumentů width
a space
. Pro prostor mezi skupinami se podívejte do příslušné části tohoto návodu.
par(mfrow = c(1, 2))# Bar width (by default: width = 1)barplot(my_table, main = "Change bar width", col = rainbow(3), width = c(0.4, 0.2, 1))# Bar spacebarplot(my_table, main = "Change space between bars", col = rainbow(3), space = c(1, 1.1, 0.1))par(mfrow = c(1, 1))
space
představuje prostor sloupce vzhledem k předchozímu, takže první prvek nebude brán v úvahu.Sloupcový graf z datového rámce nebo seznamu
Dále můžete vytvořit sloupcový graf přímo s proměnnými datového rámce nebo dokonce matice, ale uvědomte si, že proměnnou by měl být počet nějakých událostí nebo charakteristik. V následujícím příkladu počítáme počet vozidel podle barev a vykreslujeme je pomocí sloupcového grafu. Každou barvu vozidla použijeme pro obarvení příslušných sloupců.
df <- data.frame(carColor = c("red", "green", "white", "blue"), count = c(3, 5, 9, 1))# df <- as.list(df) # Equivalentbarplot(height = df$count, names = df$carColor, col = c("red", "green", "white", "blue"))
Sloupcový graf pro spojitou proměnnou
V případě, že pracujete se spojitou proměnnou, budete muset použít funkci cut
pro kategorizaci dat. V opačném případě, tedy v případě, že nedojde k vazbě, budete mít tolik sloupců, kolik je délka vašeho vektoru, a výšky sloupců budou rovny 1. V následujícím příkladu rozdělíme naše data od 0 do 45 s krokem 5 pomocí argumentu breaks
.
x <- c(2.1, 8.6, 3.9, 4.4, 4.0, 3.7, 7.6, 3.1, 5.0, 5.5, 20.2, 1.7, 5.2, 33.7, 9.1, 1.6, 3.1, 5.6, 16.5, 15.8, 5.8, 6.8, 3.3, 40.6)barplot(table(cut(x, breaks = seq(0, 45, by = 5))))
Horizontální sloupcový graf
Ve výchozím nastavení jsou sloupcové grafy v R vykresleny vertikálně. Běžně se však znázorňují vodorovné sloupcové grafy. Graf můžete otočit o 90º a vytvořit vodorovný sloupcový graf nastavením argumentu horiz
na hodnotu TRUE
.
barplot(my_table, main = "Barchart", ylab = "Number of cylinders", xlab = "Frequency", horiz = TRUE) # Horizontal barplot
Legenda sloupcového grafu
Legendu lze k sloupcovému grafu v R přidat pomocí argumentu legend.text
, kde můžete zadat jména, která chcete do legendy přidat. Všimněte si, že v RStudiu může být výsledný graf mírně odlišný, protože pozadí legendy bude bílé místo průhledného.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table)) # Legend
legend.text
může legenda překrývat sloupcový graf.Nejjednodušší způsob řešení tohoto problému v tomto příkladu je přesunout legendu. Toho lze dosáhnout pomocí argumentu args.legend
, kde lze nastavit grafické parametry v rámci seznamu. Pozici můžete nastavit na top
, bottom
, topleft
, topright
, bottomleft
a bottomright
.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), args.legend = list(x = "top"))
Ekvivalentně můžete dosáhnout předchozího vykreslení s legendou pomocí funkce legend
takto s argumenty legend
a fill
.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3))legend("top", legend = rownames(my_table), fill = rainbow(3))
Tento přístup nicméně funguje dobře pouze v případě, že legenda nepřekrývá sloupce v těchto pozicích. Lepší přístup je přesunout legendu doprava, mimo sloupcový graf. To můžete provést nastavením argumentu inset
předaného jako prvek seznamu v rámci argumentu args.legend
takto:
par(mar = c(5, 5, 4, 10))barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), # Legend values args.legend = list(x = "topright", inset = c(-0.20, 0))) # Legend arguments
Mohli byste také změnit omezení os pomocí argumentů xlim
, respektive ylim
pro svislé a vodorovné sloupcové grafy, ale uvědomte si, že v tomto případě bude hodnota, kterou zadáte, záviset na počtu a šířce sloupců. Připomeňme, že pokud přiřadíte sloupcový graf proměnné, můžete uložit body osy, které odpovídají středu každého sloupce.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), xlim = c(0, 4.25))
Jinou alternativou přesunu legendy je její přesunutí pod sloupcový graf pomocí funkcí layout
, par
a plot.new
. Tento přístup je pokročilejší než ostatní a možná budete muset před provedením kódu vymazat grafické parametry, abyste získali správný graf, protože grafické parametry se změní.
# dev.off()# opar <- par(no.readonly = TRUE)plot.new()layout(rbind(1, 2), heights = c(10, 3))barplot(my_table, xlab = "Number of cylinders", col = rainbow(3))par(mar = c(0, 0, 0, 0))plot.new()legend("top", rownames(my_table), lty = 1, col = c("red", "green", "blue"), lwd = c(1, 2))# dev.off()# on.exit(par(opar))
Seskupený sloupcový graf v R
Seskupený sloupcový graf, známý také jako side by side bar plot nebo clustered bar chart, je sloupcový graf v R se dvěma nebo více proměnnými. Graf zobrazí sloupce pro každou z více proměnných.
# Variable am to factoram <- factor(am)# Change factor levelslevels(am) <- c("Automatic", "Manual")# Table cylinder - transmission typeother_table <- table(cyl, am)# other_table <- xtabs(~cyl + am , data = mtcars) # Equivalentbarplot(other_table, main = "Grouped barchart", xlab = "Transmission type", ylab = "Frequency", col = c("darkgrey", "darkblue", "red"), legend.text = rownames(other_table), beside = TRUE) # Grouped bars
Všimněte si, že kdybychom zadali table(am, cyl)
místo table(cyl, am)
, osa X by představovala počet válců místo typu převodovky.
Mezera mezi skupinami
Jak jsme si již dříve prošli, mezeru mezi sloupci můžete změnit. V případě několika skupin můžete nastavit dvouprvkový vektor, kde prvním prvkem je mezera mezi sloupci každé skupiny (0,4) a druhým mezera mezi skupinami (2,5).
barplot(other_table, main = "Grouped barchart space", xlab = "Transmission type", ylab = "Frequency", col = c("darkgrey", "darkblue", "red"), legend.text = rownames(other_table), beside = TRUE, space = c(0.4, 2.5)) # Space
Číselné hodnoty ve skupinách
Sloupcové grafy lze také použít k sumarizaci proměnné ve skupinách daných jedním nebo několika faktory. Uvažujme například, že chcete zobrazit počet válců a typ převodovky na základě průměru koňských sil automobilů. K vytvoření odpovídající tabulky můžete použít funkci tapply
:
summary_data <- tapply(mtcars$hp, list(cylinders = mtcars$cyl, transmission = mtcars$am), FUN = mean, na.rm = TRUE)summary_data
transmissioncylinders Automatic Manual 4 84.66667 81.8750 6 115.25000 131.6667 8 194.16667 299.5000
Nyní můžete v R vytvořit odpovídající sloupcový graf:
par(mar = c(5, 5, 4, 10))barplot(summary_data, xlab = "Transmission type", main = "Horsepower mean", col = rainbow(3), beside = TRUE, legend.text = rownames(summary_data), args.legend = list(title = "Cylinders", x = "topright", inset = c(-0.20, 0)))
Sloupcový graf s chybovými sloupci v R
Ve výchozím nastavení nelze vytvořit sloupcový graf s chybovými sloupci. Následující funkce vám však umožní vytvořit plně přizpůsobitelný sloupcový graf se standardními chybovými úsečkami.
# Arguments:# x: an unique factor object# y: a numeric vector object# ...: additional arguments to be passed to barplot functionbarplot.error <- function(x, y, ...){ mod <- lm(y ~ x) reps <- sqrt(length(y)/length(levels(x))) sem <- sigma(mod)/reps means <- tapply(y, x, mean) upper <- max(means) + sem lev <- levels(x) barpl <- barplot(means, ...) invisible(sapply(1:length(barpl), function(i) arrows(barpl, means + sem, barpl, means - sem, angle = 90, code = 3, length = 0.08)))}# Calling the functionbarplot.error(factor(mtcars$cyl), mtcars$hp, col = rainbow(3), ylim = c(0, 250))
I když můžete do sloupcového grafu přidat chybové úsečky, je třeba si uvědomit, že boxplot podle skupin by mohl být v tomto případě lepším přístupem k sumarizaci dat.
Složený sloupcový graf v R
Složený sloupcový graf je jako seskupený sloupcový graf, ale četnosti proměnných jsou složeny na sebe. Tento typ sloupcového grafu se vytvoří ve výchozím nastavení, pokud jako argument předáte tabulku se dvěma nebo více proměnnými, protože argument beside
je ve výchozím nastavení FALSE
.
barplot(other_table, main = "Stacked barchart", xlab = "Transmission type", ylab = "Frequency", col = c("darkgrey", "darkblue", "red"), legend.text = rownames(other_table), beside = FALSE) # Stacked bars (default)
V souvislosti se skládanými sloupcovými grafy existují podobné implementace, jako je páteřní graf a mozaikový graf. Tento typ grafů lze vytvořit pomocí funkcí spineplot
a mosaicplot
balíčku graphics
.
Mozaikový graf umožňuje vizualizovat data dvou nebo více kvantitativních proměnných, kde plocha každého obdélníku představuje podíl dané proměnné na každé skupině.
# install.packages("graphics")library(graphics)mosaicplot(other_table, main = "Mosaic plot")
Páteřní graf je speciálním případem mozaikového grafu a jeho zobecněním stacked barplot. V tomto případě se na rozdíl od stohovaných sloupcových grafů každý sloupec sčítá do jedné.
spineplot(other_table)
Všimněte si, že ve výchozím nastavení jsou osy zaměněny s ohledem na stohovaný sloupcový graf, který jste vytvořili v předchozí části. Ekvivalentní graf můžete vytvořit transponováním tabulky četností pomocí funkce t
.
spineplot(t(other_table))
Sloupcový graf v R: ggplot2
Knihovna ggplot2
je dobře známá grafická knihovna v R. Pomocí této knihovny můžete vytvořit sloupcový graf převedením dat do datového rámce a pomocí funkcí ggplot
a geom_bar
. V argumentu aes
musíte předat názvy proměnných vašeho datového rámce. V x
kategoriální proměnnou a v y
číselnou.
# install.packages("ggplot2")library(ggplot2)df <- as.data.frame(my_table)ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity")
Horizontální sloupcový graf ggplot2
Pokud chcete předchozí sloupcový graf otočit, použijte funkci coord_flip
takto:
ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity") + coord_flip() # Horizontal bar plot
.