Sloupcový graf v R

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

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)
Přiřazením sloupcového grafu uvnitř proměnné se uloží hodnoty osy odpovídající středu každého sloupce.

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))
Vektor 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
Všimněte si, že při použití argumentu 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

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.