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
- Sávdiagram grafikus paraméterei: cím, tengelycímkék és színek
- Csoportcímke módosítása
- Barplot width and space of bars
- Sávdiagram adatkeretből vagy listából
- Sávdiagram folyamatos változóhoz
- Horizontális barplot
- R barplot legend
- Grouped barplot in R
- A csoportok közötti tér
- Numerikus értékek csoportokban
- Hibasávos oszlopdiagram R-ben
- Stacked barplot in R
- Sávdiagram R-ben: ggplot2
- Horizontális oszlopdiagram ggplot2
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 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))
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
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
.