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
- Grafische parameters voor de barplot: titel, aslabels en kleuren
- Groepsetiketten wijzigen
- Barplotbreedte en ruimte van de balken
- Barplot van dataframe of lijst
- Barplot voor continue variabele
- Horizontale barplot
- R barplot legenda
- Gegroepeerde barplot in R
- Ruimte tussen groepen
- Numerieke waarden in groepen
- Barplot met foutenbalken in R
- Gestapelde barplot in R
- Barplot in R: ggplot2
- Horizontale barplot ggplot2
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)
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))
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
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