Barplot in R

Wanneer een variabele een paar waarden heeft, is het gebruikelijk om de informatie samen te vatten met een frequentietabel die kan worden weergegeven met een barchart of barplot in R. In dit artikel gaan we de basisprincipes uitleggen van het maken van barplots in R.

De R barplot functie

Voor het maken van een barplot in R kunt u de basis R barplot functie gebruiken. In dit voorbeeld gaan we een barplot maken van een dataframe. De voorbeelddataset is de bekende mtcars. Laad eerst de gegevens en maak een tabel voor de kolom cyl met de functie table.

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

Om een barplot in R te maken, kunt u de functie barplot gebruiken door uw eerder gemaakte tabel als parameter in te stellen om de absolute frequentie van de gegevens weer te geven. Als u echter de voorkeur geeft aan een staafdiagram met percentages op de verticale as (de relatieve frequentie), kunt u de functie prop.table gebruiken en het resultaat als volgt met 100 vermenigvuldigen.

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

Merk op dat u ook een staafdiagram met factorgegevens kunt maken met de functie plot.

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

Daarnaast kunt u met de tekstfunctie als volgt getallen op staven weergeven:

barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))text(barp, my_table + 0.5, labels = my_table)
Door een staafdiagram in een variabele op te nemen, worden de aswaarden opgeslagen die met het middelpunt van elke staaf overeenkomen.

U kunt ook een raster achter de balken toevoegen met de functie 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)

Grafische parameters voor de barplot: titel, aslabels en kleuren

Net als bij andere plots kunt u een groot aantal grafische parameters opgeven, zoals aslabels, een titel of het aanpassen van de assen. In het vorige codeblok hebben we de kleuren van de barplot aangepast met de parameter col. U kunt de kleuren die u verkiest instellen met een vector of de functie rainbow gebruiken met het aantal balken als parameter zoals wij deden of andere kleurenpaletfuncties gebruiken. U kunt ook de kleur van de rand van de balken veranderen met het argument 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

Groepsetiketten wijzigen

Het etiket van elke groep kan worden gewijzigd met het argument names.arg. In ons voorbeeld zijn de groepen gelabeld met getallen, maar we kunnen ze veranderen door iets te typen als:

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

Barplotbreedte en ruimte van de balken

U kunt ook de ruimte tussen de balken of de breedte van de balken wijzigen met de width en space argumenten. Voor de ruimte tussen groepen, raadpleeg de overeenkomstige sectie van deze handleiding.

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))
De space vector vertegenwoordigt de ruimte van de staaf ten opzichte van de vorige, dus het eerste element wordt niet in rekening gebracht.

Barplot van dataframe of lijst

U kunt ook rechtstreeks een barplot maken met de variabelen van een dataframe of zelfs een matrix, maar merk op dat de variabele de telling van een gebeurtenis of kenmerk moet zijn. In het volgende voorbeeld tellen we het aantal voertuigen per kleur en zetten we ze uit met een staafdiagram. We zullen elke autokleur gebruiken voor het kleuren van de overeenkomstige balken.

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 voor continue variabele

In het geval dat u werkt met een continue variabele, moet u de functie cut gebruiken om de gegevens te categoriseren. Indien dit niet het geval is, in het geval dat er geen stropdassen zijn, hebt u evenveel staven als de lengte van uw vector en zijn de staafhoogten gelijk aan 1. In het volgende voorbeeld zullen we onze gegevens verdelen van 0 tot 45 in stappen van 5 met het argument 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))))

Horizontale barplot

Standaard worden barplots in R verticaal geplot. Het is echter gebruikelijk om horizontale barplots weer te geven. U kunt de plot 90º draaien en een horizontaal staafdiagram maken door het horiz-argument TRUE.

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

R barplot legenda

Een legende kan in R aan een barplot worden toegevoegd met het legend.text-argument, waarbij u de namen kunt opgeven die u aan de legenda wilt toevoegen. Merk op dat in RStudio de resulterende plot er iets anders kan uitzien, omdat de achtergrond van de legenda wit zal zijn in plaats van transparant.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table)) # Legend
Merk op dat, door het gebruik van het legend.text argument, de legenda de barplot kan overlappen.

De eenvoudigste methode om dit probleem in dit voorbeeld op te lossen is om de legenda te verplaatsen. Dit kan worden bereikt met het argument args.legend, waarmee u grafische parameters in een lijst kunt instellen. U kunt de positie instellen op top, bottom, topleft, topright, bottomleft en bottomright.

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

Equivalent kunt u de vorige plot met de legenda bereiken met de legend functie, als volgt met de legend en fill argumenten.

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

Deze aanpak werkt echter alleen goed als de legenda de staven op die posities niet overlapt. Een betere aanpak is om de legenda naar rechts te verplaatsen, buiten de barplot. U kunt dit doen door het inset-argument door te geven als een element van een lijst binnen het args.legend-argument, als volgt.

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

U kunt ook de aslimieten wijzigen met de xlim of ylim argumenten voor respectievelijk verticale en horizontale staafdiagrammen, maar merk op dat in dit geval de op te geven waarde afhangt van het aantal en de breedte van de staven. Herinner u dat als u een staafdiagram toewijst aan een variabele, u de aspunten kunt opslaan die corresponderen met het middelpunt van elke staaf.

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

Een ander alternatief om de legenda te verplaatsen is om deze onder het staafdiagram te plaatsen met de layout, par en plot.new functies. Deze aanpak is geavanceerder dan de andere en het is mogelijk dat u de grafische parameters moet wissen voordat u de code uitvoert om de juiste plot te krijgen, omdat de grafische parameters worden gewijzigd.

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

Gegroepeerde barplot in R

Een gegroepeerde barplot, ook wel bekend als side by side bar plot of clustered bar chart is een barplot in R met twee of meer variabelen. De grafiek toont de balken voor elk van de meerdere variabelen.

# 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

Merk op dat als we table(am, cyl) hadden opgegeven in plaats van table(cyl, am) de X-as het aantal cilinders zou weergeven in plaats van het type transmissie.

Ruimte tussen groepen

Zoals we eerder hebben besproken, kunt u de ruimte tussen de balken wijzigen. In het geval van meerdere groepen kunt u een vector met twee elementen instellen waarbij het eerste element de ruimte tussen de balken van elke groep is (0,4) en het tweede element de ruimte tussen de groepen (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 

Numerieke waarden in groepen

Barplots kunnen ook worden gebruikt om een variabele samen te vatten in groepen die door een of meer factoren worden gegeven. Stel bijvoorbeeld dat u het aantal cilinders en het type overbrenging wilt weergeven op basis van het gemiddelde van het paardenvermogen van de auto’s. U zou de functie tapply kunnen gebruiken om de overeenkomstige tabel te maken:

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

Nu kunt u de overeenkomstige barplot in R maken:

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 met foutenbalken in R

Zorgelijk kunt u geen barplot met foutenbalken maken. Met de volgende functie kunt u echter een volledig aanpasbare barplot met standaardfoutbalken maken.

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

Zelfs als u foutbalken aan een barplot kunt toevoegen, moet u opmerken dat een boxplot per groep een betere aanpak zou kunnen zijn om de gegevens in dit scenario samen te vatten.

Gestapelde barplot in R

Een gestapeld staafdiagram is als een gegroepeerd staafdiagram, maar de frequentie van de variabelen zijn gestapeld. Dit type staafdiagram wordt standaard gemaakt wanneer een tabel met twee of meer variabelen als argument wordt doorgegeven, aangezien het argument beside standaard FALSE is.

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)

Vergeleken met gestapelde staafdiagrammen bestaan er soortgelijke implementaties, zoals de spine plot en de mosaic plot. Dit soort plots kan worden gemaakt met de functies spineplot en mosaicplot van het pakket graphics.

Met de mozaïekplot kunt u gegevens van twee of meer kwantitatieve variabelen visualiseren, waarbij de oppervlakte van elke rechthoek de proportie van die variabele in elke groep weergeeft.

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

De spineplot is een speciaal geval van een mozaïekplot, en is een veralgemening van de stacked barplot. In dit geval wordt, in tegenstelling tot een gestapelde barplot, elke staaf opgeteld tot één.

spineplot(other_table)

Merk op dat de assen standaard worden verwisseld ten opzichte van de gestapelde barplot die u in het vorige gedeelte hebt gemaakt. U kunt een gelijkwaardige plot maken door de frequentietabel te transponeren met de functie t.

spineplot(t(other_table))

Barplot in R: ggplot2

De bibliotheek ggplot2 is een bekende grafische bibliotheek in R. U kunt met deze bibliotheek een barplot maken door de gegevens om te zetten in een dataframe en met de functies ggplot en geom_bar. In het aes argument moet u de variabele namen van uw dataframe doorgeven. In x de categorische variabele en in y de numerieke.

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

Horizontale barplot ggplot2

Als u de vorige barplot wilt roteren, gebruikt u de functie coord_flip als volgt.

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

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.