Barplot in R

NÀr en variabel har ett fÄtal vÀrden Àr det vanligt att sammanfatta informationen med en frekvenstabell som kan representeras med ett stapeldiagram eller barplot i R. I den hÀr artikeln kommer vi att förklara grunderna för att skapa stapeldiagram i R.

R:s stapeldiagramfunktion

För att skapa ett stapeldiagram i R kan du anvÀnda basfunktionen R barplot. I det hÀr exemplet ska vi skapa en stapeldiagram frÄn en dataruta. Specifikt Àr exempeldatamÀngden den vÀlkÀnda mtcars. Ladda först in data och skapa en tabell för kolumnen cyl med funktionen table.

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

HÄll dig i minnet att för att skapa en stapeldiagram i R kan du anvÀnda barplot-funktionens instÀllning som en parameter din tidigare skapade tabell för att visa den absoluta frekvensen av data. Om du dock föredrar en stapeldiagram med procentsatser pÄ den vertikala axeln (den relativa frekvensen) kan du anvÀnda funktionen prop.table och multiplicera resultatet med 100 enligt följande:

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

Notera att du Àven kan skapa ett stapeldiagram med faktordata med funktionen plot.

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

Det gÄr dessutom att visa siffror pÄ staplarna med textfunktionen enligt följande:

barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))text(barp, my_table + 0.5, labels = my_table)
Om du tilldelar ett stapeldiagram inne i en variabel kommer du att lagra axelvÀrdena som motsvarar mitten av varje stapel.

Du kan ocksÄ lÀgga till ett rutnÀt bakom staplarna med funktionen 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)

Grafiska parametrar för barplot: titel, axeletiketter och fÀrger

Likt andra plottar kan du ange ett stort antal grafiska parametrar, till exempel axeletiketter, en titel eller anpassa axlarna. I det föregÄende kodblocket anpassade vi fÀrgerna för stapeldiagrammet med parametern col. Du kan stÀlla in de fÀrger du föredrar med en vektor eller anvÀnda funktionen rainbow med antalet staplar som parameter som vi gjorde eller anvÀnda andra fÀrgpalettfunktioner. Du kan ocksÄ Àndra fÀrg pÄ staplarnas ramar med argumentet 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

Ändra etiketter för grupper

Etiketten för varje grupp kan Àndras med argumentet names.arg. I vÄrt exempel Àr grupperna mÀrkta med siffror, men vi kan Àndra dem genom att skriva nÄgot i stil med:

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

Breddning av staplar och avstÄnd mellan staplarna

Du kan ocksÄ Àndra utrymmet mellan staplarna eller bredden pÄ staplarna med argumenten width och space. För utrymmet mellan grupper, se motsvarande avsnitt i denna handledning.

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-vektorn representerar utrymmet mellan staplarna i förhÄllande till den föregÄende, sÄ det första elementet kommer inte att beaktas.

Barplot frÄn dataruta eller lista

Det gÄr dessutom att skapa ett barplot direkt med variablerna i en dataruta eller till och med i en matris, men observera att variabeln bör vara antalet av nÄgon hÀndelse eller egenskap. I följande exempel rÀknar vi antalet fordon per fÀrg och plottar dem med ett stapeldiagram. Vi kommer att anvÀnda varje bilfÀrg för att fÀrga motsvarande staplar.

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 för kontinuerlig variabel

Om du arbetar med en kontinuerlig variabel mÄste du anvÀnda cut-funktionen för att kategorisera data. Om inte, om det inte finns nÄgra band, kommer du att ha lika mÄnga staplar som lÀngden pÄ din vektor och stapelhöjden kommer att vara lika med 1. I följande exempel kommer vi att dela upp vÄra data frÄn 0 till 45 i steg om 5 med breaks-argumentet.

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

Horisontell stapelplott

Som standard plottas stapelplottar i R vertikalt. Det Ă€r dock vanligt att representera horisontella stapeldiagram. Du kan rotera plotten 90Âș och skapa ett horisontellt stapeldiagram genom att stĂ€lla in horiz-argumentet pĂ„ TRUE.

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

R barplot legend

En legend kan lÀggas till en stapeldiagram i R med legend.text-argumentet, dÀr du kan ange de namn som du vill lÀgga till i legenden. Observera att i RStudio kan den resulterande plotten se nÄgot annorlunda ut, eftersom bakgrunden för legenden kommer att vara vit i stÀllet för transparent.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table)) # Legend
Observera att legenden, genom att anvÀnda legend.text-argumentet, kan överlappa stapeldiagrammet.

Den enklaste metoden för att lösa detta problem i det hÀr exemplet Àr att flytta legenden. Detta kan Ästadkommas med argumentet args.legend, dÀr du kan stÀlla in grafiska parametrar inom en lista. Du kan stÀlla in positionen till top, bottom, topleft, topright, bottomleft och bottomright.

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

Ekvivalent kan du Ästadkomma den tidigare plotten med legenden med legend-funktionen pÄ följande sÀtt med argumenten legend och fill.

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

Det hÀr tillvÀgagÄngssÀttet fungerar dock bara bra om legenden inte överlappar staplarna i dessa positioner. Ett bÀttre tillvÀgagÄngssÀtt Àr att flytta legenden till höger, utanför stapeldiagrammet. Du kan göra detta genom att stÀlla in inset-argumentet som överlÀmnats som ett element i en lista inom args.legend-argumentet enligt följande:

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

Du kan ocksĂ„ Ă€ndra axelgrĂ€nserna med xlim– eller ylim-argumentet för vertikala respektive horisontella stapeldiagram, men observera att det vĂ€rde som du ska ange i det hĂ€r fallet kommer att bero pĂ„ antalet staplar och staplarnas bredd. Kom ihĂ„g att om du tilldelar ett stapeldiagram till en variabel kan du lagra de axelpunkter som motsvarar mitten av varje stapel.

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

Ett annat alternativ till att flytta legenden Àr att flytta den under stapeldiagrammet med funktionerna layout, par och plot.new. Detta tillvÀgagÄngssÀtt Àr mer avancerat Àn de andra och du kan behöva rensa de grafiska parametrarna innan koden exekveras för att fÄ en korrekt plott, eftersom de grafiska parametrarna kommer att Àndras.

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

Grupperad stapeldiagram i R

Ett grupperat stapeldiagram, Àven kallat stapeldiagram sida vid sida eller klustrad stapeldiagram, Àr ett stapeldiagram i R med tvÄ eller flera variabler. Diagrammet visar staplarna för var och en av de flera variablerna.

# 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

Observera att om vi hade angett table(am, cyl) i stÀllet för table(cyl, am) skulle X-axeln representera antalet cylindrar i stÀllet för överföringstypen.

AvstÄnd mellan grupperna

Som vi gick igenom tidigare kan du Àndra avstÄndet mellan staplarna. NÀr det gÀller flera grupper kan du stÀlla in en vektor med tvÄ element dÀr det första elementet Àr utrymmet mellan staplarna i varje grupp (0,4) och det andra utrymmet mellan grupperna (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 

NumervÀrden i grupper

Barplots kan ocksÄ anvÀndas för att sammanfatta en variabel i grupper som ges av en eller flera faktorer. TÀnk till exempel pÄ att du vill visa antalet cylindrar och överföringstyp baserat pÄ medelvÀrdet av bilarnas hÀstkrafter. Du kan anvÀnda funktionen tapply för att skapa motsvarande tabell:

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 kan du skapa motsvarande stapeldiagram i 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)))

Stapeldiagram med felstaplar i R

Som standard kan du inte skapa ett stapeldiagram med felstaplar. Med följande funktion kan du dock skapa en helt anpassningsbar stapeldiagram med standardiserade felstaplar.

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

Även om du kan lĂ€gga till felstaplar i ett stapeldiagram bör det noteras att en boxplot per grupp kan vara ett bĂ€ttre tillvĂ€gagĂ„ngssĂ€tt för att sammanfatta data i det hĂ€r scenariot.

Stacked barplot in R

Ett staplat stapeldiagram Àr som ett grupperat stapeldiagram, men frekvensen av variablerna Àr staplade. Den hÀr typen av stapeldiagram skapas som standard nÀr man som argument överlÀmnar en tabell med tvÄ eller flera variabler, eftersom argumentet beside som standard Àr 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)

Relaterat till staplade stapeldiagram finns det liknande implementeringar, som spine plot och mosaic plot. Denna typ av diagram kan skapas med funktionerna spineplot och mosaicplot i paketet graphics.

Med mosaikplotten kan du visualisera data för tvÄ eller flera kvantitativa variabler, dÀr arean av varje rektangel representerar andelen av variabeln i varje grupp.

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

Spineplot Àr ett specialfall av mosaikplot, och Àr en generalisering av staplade staplot. I det hÀr fallet, till skillnad frÄn staplade stapeldiagram, summerar varje stapel till ett.

spineplot(other_table)

BemÀrk att axlarna som standard Àr utbytta med avseende pÄ det staplade stapeldiagram som du skapade i föregÄende avsnitt. Du kan skapa motsvarande plott genom att transponera frekvenstabellen med funktionen t.

spineplot(t(other_table))

Barplot i R: ggplot2

Biblioteket ggplot2 Àr ett vÀlkÀnt grafikbibliotek i R. Du kan skapa en stapeldiagram med det hÀr biblioteket genom att omvandla data till dataram och med funktionerna ggplot och geom_bar. I aes-argumentet mÄste du lÀmna över variabelnamnen för din dataframe. I x den kategoriska variabeln och i y den numeriska.

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

Horisontell stapeldiagram ggplot2

Om du vill rotera det föregÄende stapeldiagrammet anvÀnder du coord_flip-funktionen pÄ följande sÀtt:

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

.

LĂ€mna ett svar

Din e-postadress kommer inte publiceras.