Sávdiagram az R-ben

Ha egy változó néhány értéket vesz fel, gyakori, hogy az információt egy gyakorisági táblázattal foglaljuk össze, amelyet egy oszlopdiagrammal vagy oszlopdiagrammal lehet ábrázolni az R-ben. Ebben a cikkben elmagyarázzuk a sávdiagramok készítésének alapjait R-ben.

Az R barplot függvény

A sávdiagram készítéséhez R-ben használhatjuk az R alap barplot függvényét. Ebben a példában egy adatkeretből fogunk barplotot létrehozni. Konkrétan a példa adatállománya a jól ismert mtcars. Először töltsük be az adatokat, és hozzunk létre egy táblázatot a cyl oszlophoz a table függvénnyel.

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

Memlékezzünk arra, hogy egy oszlopdiagram létrehozásához az R-ben használhatjuk a barplot függvényt, amely paraméterként beállítja a korábban létrehozott táblázatot az adatok abszolút gyakoriságának megjelenítéséhez. Ha azonban a függőleges tengelyen százalékos értékeket (a relatív gyakoriságot) tartalmazó oszlopdiagramot szeretne, akkor használhatja a prop.table függvényt, és az eredményt megszorozhatja 100-zal az alábbiak szerint:

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

Megjegyezzük, hogy a plot függvénnyel faktoradatokkal is készíthet oszlopdiagramot.

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

Mellett a szöveg függvénnyel számokat is megjeleníthet a sávokon az alábbiak szerint:

barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))text(barp, my_table + 0.5, labels = my_table)
A sávdiagram változón belüli hozzárendelése az egyes sávok középpontjának megfelelő tengelyértékeket tárolja.

A grid függvénnyel rácsot is adhat a sávok mögé.

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)

Sávdiagram grafikus paraméterei: cím, tengelycímkék és színek

A többi diagramhoz hasonlóan számos grafikus paramétert adhat meg, például tengelycímkéket, címet vagy testre szabhatja a tengelyeket. Az előző kódblokkban a col paraméterrel testre szabtuk a barplot színeit. Beállíthatja a kívánt színeket vektorral, vagy használhatja a rainbow függvényt a sávok számával mint paraméterrel, ahogy mi tettük, vagy használhat más színpalettafüggvényeket. A border argumentummal a sávok szegélyének színét is megváltoztathatja.

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

Csoportcímke módosítása

Az egyes csoportok címkéjét a names.arg argumentummal módosíthatja. Példánkban a csoportok címkézése számokkal történik, de megváltoztathatjuk őket valami hasonlót beírva:

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

Barplot width and space of bars

A width és space argumentumokkal a sávok közötti távolságot vagy a sávok szélességét is módosíthatjuk. A csoportok közötti térrel kapcsolatban olvassa el a jelen útmutató megfelelő részét.

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))
A space vektor a sávnak az előzőhöz viszonyított terét jelenti, így az első elemet nem veszi figyelembe.

Sávdiagram adatkeretből vagy listából

Az adatkeret vagy akár egy mátrix változóiból közvetlenül is készíthetünk oszlopdiagramot, de vegyük figyelembe, hogy a változónak valamilyen esemény vagy jellemző számának kell lennie. A következő példában a járművek számát számoljuk szín szerint, és egy oszlopdiagrammal ábrázoljuk. Az egyes autók színét fogjuk használni a megfelelő oszlopok színezéséhez.

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

Sávdiagram folyamatos változóhoz

Ha folyamatos változóval dolgozunk, akkor a cut függvényt kell használnunk az adatok kategorizálására. Ellenkező esetben, ha nincs kötöttség, akkor annyi sávod lesz, ahány hosszú a vektorod, és a sávok magassága egyenlő lesz 1-gyel. A következő példában az breaks argumentummal 0-tól 45-ig 5 lépésben osztjuk az adatainkat.

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ális barplot

A barplotok az R-ben alapértelmezés szerint függőlegesen ábrázolódnak. Gyakori azonban a vízszintes oszlopdiagramok ábrázolása. A horiz argumentumot TRUE-re állítva 90º-kal elforgathatja a plotot, és létrehozhat egy vízszintes oszlopdiagramot.

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

R barplot legend

A barplothoz az R-ben a legend.text argumentummal adhat legendát, ahol megadhatja a legendához hozzáadni kívánt neveket. Vegye figyelembe, hogy az RStudio-ban a kapott plot kissé eltérő lehet, mivel a legenda háttere átlátszó helyett fehér lesz.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table)) # Legend
Vegye figyelembe, hogy a legend.text argumentum használatával a legenda átfedheti a barplotot.

A legegyszerűbb módszer a probléma megoldására ebben a példában a legenda áthelyezése. Ezt a args.legend argumentummal érhetjük el, ahol a grafikus paramétereket egy listán belül állíthatjuk be. A pozíciót a top, bottom, topleft, topright, bottomleft és bottomright értékekre állíthatjuk be.

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

Egyenértékű módon a legend függvénnyel az előző ábrázolást a legendával a legend és fill argumentumokkal a következőképpen érhetjük el.

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

Ez a megközelítés azonban csak akkor működik jól, ha a legenda nem fedi át a sávokat ezeken a pozíciókban. Jobb megközelítés, ha a legendát jobbra, a sávdiagramon kívülre helyezzük. Ezt a inset argumentumnak a args.legend argumentumon belül egy lista elemeként átadott inset argumentum beállításával teheti meg a következőképpen:

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 tengelyhatárokat a xlim, illetve a ylim argumentummal is módosíthatja függőleges, illetve vízszintes oszlopdiagramok esetén, de vegye figyelembe, hogy ebben az esetben a megadandó érték a sávok számától és szélességétől függ. Emlékezzünk arra, hogy ha az oszlopdiagramot egy változóhoz rendeljük, akkor az egyes oszlopok középpontjának megfelelő tengelypontokat tárolhatjuk.

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

A legenda mozgatásának másik alternatívája, hogy a layout, par és plot.new függvényekkel az oszlopdiagram alá helyezzük. Ez a megközelítés fejlettebb, mint a többi, és előfordulhat, hogy a kód végrehajtása előtt törölnie kell a grafikus paramétereket, hogy a helyes ábrázolást kapja, mivel a grafikus paraméterek megváltoznak.

# 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

A csoportosított oszlopdiagram, más néven side by side bar plot vagy clustered bar chart egy oszlopdiagram az R-ben két vagy több változóval. Az ábra a több változó mindegyikének a sávjait jeleníti meg.

# 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

Megjegyezzük, hogy ha table(cyl, am) helyett table(am, cyl)-t adtunk volna meg, akkor az X tengely az erőátviteli típus helyett a hengerek számát ábrázolná.

A csoportok közötti tér

Amint korábban áttekintettük, módosíthatjuk a sávok közötti teret. Több csoport esetén beállíthatunk egy kételemű vektort, ahol az első elem az egyes csoportok sávjai közötti távolság (0,4), a második pedig a csoportok közötti távolság (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 

Numerikus értékek csoportokban

A barplots arra is használható, hogy egy változót egy vagy több tényező által adott csoportokban összegezzünk. Vegyük például, hogy az autók lóerejének átlaga alapján szeretné megjeleníteni a hengerek számát és a sebességváltó típusát. A tapply függvénnyel létrehozhatja a megfelelő táblázatot:

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

Most létrehozhatja a megfelelő oszlopdiagramot R-ben:

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

Hibasávos oszlopdiagram R-ben

Egy hibasávos oszlopdiagramot alapértelmezés szerint nem tud létrehozni. A következő függvénnyel azonban teljesen testreszabható barplotot hozhat létre standard hibasávokkal.

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

Még ha hibasávokat is adhat egy barplothoz, észre kell venni, hogy egy csoportonkénti boxplot jobb megközelítés lehet az adatok összegzésére ebben a forgatókönyvben.

Stacked barplot in R

A stacked bar diagram olyan, mint egy csoportosított oszlopdiagram, de a változók gyakorisága egymásra van rakva. Ez a típusú oszlopdiagram alapértelmezés szerint akkor jön létre, ha argumentumként egy két vagy több változót tartalmazó táblázatot adunk meg, mivel az beside argumentum alapértelmezés szerint 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)

A halmozott oszlopdiagramhoz kapcsolódóan léteznek hasonló megvalósítások, mint a gerincdiagram és a mozaikdiagram. Ilyen típusú ábrák a graphics csomag spineplot és mosaicplot függvényeivel hozhatók létre.

A mozaikplot lehetővé teszi két vagy több mennyiségi változó adatainak megjelenítését, ahol az egyes téglalapok területe az adott változó arányát jelenti az egyes csoportokban.

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

A gerincplot a mozaikplot speciális esete, és a halmozott oszlopplot általánosítása. Ebben az esetben, ellentétben a stacked barplotokkal, minden egyes sáv összege egy.

spineplot(other_table)

Megjegyezzük, hogy alapértelmezés szerint a tengelyek fel vannak cserélve az előző szakaszban létrehozott stacked barplothoz képest. A t függvénnyel létrehozhatja az ezzel egyenértékű, a gyakorisági táblázatot transzponáló ábrát.

spineplot(t(other_table))

Sávdiagram R-ben: ggplot2

A ggplot2 könyvtár egy jól ismert grafikus könyvtár az R-ben. Ezzel a könyvtárral az adatokat adatkeretbe konvertálva és a ggplot és geom_bar függvényekkel hozhat létre oszlopdiagramot. A aes argumentumban át kell adnod az adatkereted változóinak nevét. A x-ben a kategorikus változót, a y-ben pedig a numerikus változót.

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

Horizontális oszlopdiagram ggplot2

Ha az előző oszlopdiagramot el akarja forgatni, használja a coord_flip függvényt az alábbiak szerint.

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

.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.