Barplot in R

Când o variabilă ia câteva valori, este obișnuit să se rezume informația cu un tabel de frecvențe care poate fi reprezentat cu un barchart sau barplot în R. În acest articol vom explica elementele de bază ale creării graficelor de bare în R.

Funcția R barplot

Pentru a crea un barplot în R puteți utiliza funcția de bază R barplot. În acest exemplu, vom crea un barplot pornind de la un cadru de date. În mod specific, setul de date de exemplu este binecunoscutul mtcars. În primul rând, încărcați datele și creați un tabel pentru coloana cyl cu ajutorul funcției table.

# Load datadata(mtcars)attach(mtcars)# Frequency tablemy_table <- table(cyl)my_table
cyl 4 6 811 7 14

Reamintim că pentru a crea un barplot în R puteți utiliza funcția barplot setând ca parametru tabelul creat anterior pentru a afișa frecvența absolută a datelor. Cu toate acestea, dacă preferați un grafic de bare cu procente pe axa verticală (frecvența relativă), puteți utiliza funcția prop.table și înmulțiți rezultatul cu 100, după cum urmează:

# 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))

Rețineți că puteți crea un grafic de bare cu date factoriale și cu funcția plot.

plot(factor(mtcars$cyl), col = rainbow(3))

În plus, puteți afișa numere pe bare cu ajutorul funcției text, după cum urmează:

barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))text(barp, my_table + 0.5, labels = my_table)
Asignarea unui bar plot în interiorul unei variabile va stoca valorile axei corespunzătoare centrului fiecărei bare.

De asemenea, puteți adăuga o grilă în spatele barelor cu ajutorul funcției 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)

Parametrii grafici ai diagramei de bare: titlu, etichete de axe și culori

Ca și alte diagrame, puteți specifica o mare varietate de parametri grafici, cum ar fi etichete de axe, un titlu sau personalizarea axelor. În blocul de cod anterior am personalizat culorile barplotului cu ajutorul parametrului col. Puteți seta culorile pe care le preferați cu un vector sau puteți utiliza funcția rainbow cu numărul de bare ca parametru, așa cum am făcut noi, sau puteți utiliza alte funcții ale paletei de culori. De asemenea, puteți modifica culoarea marginii barelor cu ajutorul argumentului 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

Change group labels

Eticheta fiecărui grup poate fi modificată cu ajutorul argumentului names.arg. În exemplul nostru, grupurile sunt etichetate cu numere, dar le putem schimba tastând ceva de genul:

barplot(my_table, names.arg = c("four", "six", "eight")) 

Barplot width and space of bars

De asemenea, se poate modifica spațiul dintre bare sau lățimea barelor cu ajutorul argumentelor width și space. Pentru spațiul dintre grupe, consultați secțiunea corespunzătoare din acest tutorial.

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))
Vectorul space reprezintă spațiul barei față de cea anterioară, deci primul element nu va fi luat în considerare.

Barplot din cadru de date sau listă

În plus, puteți crea un barplot direct cu variabilele unui cadru de date sau chiar a unei matrice, dar rețineți că variabila trebuie să fie numărul unui eveniment sau al unei caracteristici. În exemplul următor, numărăm numărul de vehicule în funcție de culoare și le reprezentăm cu un grafic cu bare. Vom folosi fiecare culoare a mașinilor pentru a colora barele corespunzătoare.

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"))

Barplot pentru variabilă continuă

În cazul în care lucrați cu o variabilă continuă va trebui să folosiți funcția cut pentru a clasifica datele. În caz contrar, în cazul în care nu există egalități, veți avea atâtea bare cât lungimea vectorului dumneavoastră, iar înălțimea barelor va fi egală cu 1. În exemplul următor vom împărți datele noastre de la 0 la 45 cu pași de 5 cu ajutorul argumentului 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))))

Horizontal barplot

În mod implicit, barplot-urile din R sunt reprezentate pe verticală. Cu toate acestea, este obișnuit să se reprezinte diagrame de bare orizontale. Puteți roti cu 90º graficul și crea un grafic cu bare orizontale setând argumentul horiz la TRUE.

barplot(my_table, main = "Barchart", ylab = "Number of cylinders", xlab = "Frequency", horiz = TRUE) # Horizontal barplot

R barplot barplot legend

O legendă poate fi adăugată la un barplot în R cu ajutorul argumentului legend.text, unde puteți specifica numele pe care doriți să le adăugați la legendă. Rețineți că în RStudio graficul rezultat poate fi ușor diferit, deoarece fundalul legendei va fi alb în loc de transparent.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table)) # Legend
Rețineți că, prin utilizarea argumentului legend.text, legenda se poate suprapune peste barplot.

Cea mai simplă metodă de a rezolva această problemă în acest exemplu este de a muta legenda. Acest lucru poate fi realizat cu ajutorul argumentului args.legend, unde puteți seta parametrii grafici în cadrul unei liste. Puteți seta poziția la top, bottom, topleft, topright, bottomleft și bottomright.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), args.legend = list(x = "top"))

Echivalent, puteți realiza graficul anterior cu legenda cu ajutorul funcției legend, după cum urmează cu argumentele legend și fill.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3))legend("top", legend = rownames(my_table), fill = rainbow(3))

Cu toate acestea, această abordare funcționează bine numai dacă legenda nu se suprapune peste barele din pozițiile respective. O abordare mai bună este de a muta legenda în dreapta, în afara barplotului. Puteți face acest lucru setând argumentul inset trecut ca element al unei liste în cadrul argumentului args.legend, după cum urmează:

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

Ați putea, de asemenea, să modificați limitele axelor cu argumentele xlim sau ylim pentru diagramele cu bare verticale și, respectiv, orizontale, dar rețineți că, în acest caz, valoarea care trebuie specificată va depinde de numărul și lățimea barelor. Reamintim că, dacă atribuiți un barplot unei variabile, puteți stoca punctele axei care corespund centrului fiecărei bare.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), xlim = c(0, 4.25))

O altă alternativă pentru a muta legenda este de a o muta sub graficul cu bare cu ajutorul funcțiilor layout, par și plot.new. Această abordare este mai avansată decât celelalte și este posibil să fie necesar să ștergeți parametrii grafici înainte de executarea codului pentru a obține graficul corect, deoarece parametrii grafici vor fi modificați.

# 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))

Grouped barplot in R

Un barplot grupat, cunoscut și sub numele de grafic cu bare alăturate sau grafic cu bare grupate este un barplot în R cu două sau mai multe variabile. Graficul va afișa barele pentru fiecare dintre cele mai multe variabile.

# 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

Rețineți că dacă am fi specificat table(am, cyl) în loc de table(cyl, am), axa X ar reprezenta numărul de cilindri în loc de tipul de transmisie.

Spațiu între grupuri

După cum am analizat anterior, puteți modifica spațiul dintre bare. În cazul mai multor grupuri, puteți seta un vector cu două elemente în care primul element este spațiul dintre barele fiecărui grup (0,4), iar al doilea este spațiul dintre grupuri (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 

Valori numerice în grupuri

Barigramele pot fi, de asemenea, utilizate pentru a rezuma o variabilă în grupuri date de unul sau mai mulți factori. Să considerăm, de exemplu, că doriți să afișați numărul de cilindri și tipul de transmisie în funcție de media numărului de cai putere ai mașinilor. Ați putea folosi funcția tapply pentru a crea tabelul corespunzător:

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

Acum, puteți crea barplotul corespunzător în R:

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)))

Barplot cu bare de eroare în R

În mod implicit, nu puteți crea un barplot cu bare de eroare. Cu toate acestea, funcția următoare vă va permite să creați un barplot complet personalizabil cu bare de eroare standard.

# 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))

Chiar dacă puteți adăuga bare de eroare la un barplot, trebuie remarcat faptul că un boxplot pe grupuri ar putea fi o abordare mai bună pentru a rezuma datele în acest scenariu.

Stacked barplot in R

Un grafic cu bare stivuite este ca un grafic cu bare grupate, dar frecvența variabilelor este stivuită. Acest tip de barplot va fi creat în mod implicit atunci când se trece ca argument un tabel cu două sau mai multe variabile, deoarece argumentul beside este implicit 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)

În legătură cu graficele cu bare suprapuse, există implementări similare, cum ar fi graficul cu coloană vertebrală și graficul mozaic. Acest tip de diagrame pot fi create cu ajutorul funcțiilor spineplot și mosaicplot din pachetul graphics.

Plotul mozaic vă permite să vizualizați datele a două sau mai multe variabile cantitative, unde aria fiecărui dreptunghi reprezintă proporția acelei variabile pe fiecare grup.

# install.packages("graphics")library(graphics)mosaicplot(other_table, main = "Mosaic plot")

Plotul de coloană vertebrală este un caz special al plotului mozaic, și este o generalizare a plotului de bare stivuite. În acest caz, spre deosebire de graficele cu bare suprapuse, fiecare bară însumează unu.

spineplot(other_table)

Rețineți că, în mod implicit, axele sunt interschimbate în raport cu graficul cu bare suprapuse pe care l-ați creat în secțiunea anterioară. Puteți crea graficul echivalent transpunând tabelul de frecvențe cu funcția t.

spineplot(t(other_table))

Barplot în R: ggplot2

Biblioteca ggplot2 este o bibliotecă grafică bine cunoscută în R. Puteți crea un grafic cu bare cu această bibliotecă convertind datele în cadru de date și cu funcțiile ggplot și geom_bar. În argumentul aes trebuie să treceți numele variabilelor din cadrul de date. În x variabila categorială și în y cea numerică.

# install.packages("ggplot2")library(ggplot2)df <- as.data.frame(my_table)ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity")

Horizontal barplot ggplot2

Dacă doriți să rotiți barplot-ul anterior folosiți funcția coord_flip după cum urmează.

ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity") + coord_flip() # Horizontal bar plot

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.