Kun muuttuja ottaa muutamia arvoja, on tavallista tiivistää tiedot frekvenssitaulukkoon, joka voidaan esittää pylväsdiagrammin tai pylväsdiagrammin avulla R:ssä. Tässä artikkelissa kerromme pylväsdiagrammien luomisen perusteet R:ssä.
- R:n pylväsdiagrammifunktio
- Pylväsdiagrammin graafiset parametrit: otsikko, akselien merkinnät ja värit
- Ryhmien etikettien muuttaminen
- Palkkien leveys ja väli
- Pylväsdiagrammi datakehyksestä tai listasta
- Palkkikaavio jatkuvalle muuttujalle
- Vaakasuora pylväsdiagrammi
- R-pylväsdiagrammin legenda
- Ryhmitetty pylväsdiagrammi R:ssä
- Ryhmien väli
- Numeeriset arvot ryhmissä
- Virhepalkkeja sisältävä pylväsdiagrammi R:ssä
- Pinotettu pylväsdiagrammi R:ssä
- Pylväsdiagrammi R:ssä: ggplot2
- Vaakasuora pylväsdiagrammi ggplot2
R:n pylväsdiagrammifunktio
Pylväsdiagrammin luomiseen R:ssä voit käyttää R:n perusfunktiota barplot
. Tässä esimerkissä luomme pylväsdiagrammin datakehyksestä. Tarkemmin sanottuna esimerkkitietokanta on tunnettu mtcars
. Lataa ensin tiedot ja luo cyl
-sarakkeelle taulukko table
-funktiolla.
# Load datadata(mtcars)attach(mtcars)# Frequency tablemy_table <- table(cyl)my_table
cyl 4 6 811 7 14
Muista, että luodaksesi pylväsdiagrammin R:ssä voit käyttää barplot
-funktiota, joka asettaa parametriksi aiemmin luodun taulukkosi näyttämään tietojen absoluuttisen frekvenssin. Jos haluat kuitenkin mieluummin pylväsdiagrammin, jonka pystyakselilla on prosentteja (suhteellinen frekvenssi), voit käyttää prop.table
-funktiota ja kertoa tuloksen 100:lla seuraavasti:
# 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))
Huomaa, että voit luoda pylväsdiagrammin myös faktoridatan avulla plot
-funktiolla.
plot(factor(mtcars$cyl), col = rainbow(3))
Lisäksi voit näyttää pylväissä numeroita tekstifunktiolla seuraavasti:
barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))text(barp, my_table + 0.5, labels = my_table)
Palkkien taakse voi myös lisätä ruudukon grid
-funktiolla.
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)
Pylväsdiagrammin graafiset parametrit: otsikko, akselien merkinnät ja värit
Kuten muitakin piirtoalueita, myös palkkidiagrammeja varten voi määritellä monenlaisia graafisia parametreja, kuten akselien merkinnät ja otsikon, tai muokata akseleita. Edellisessä koodilohkossa muokkasimme barplotin värejä col
-parametrilla. Voit määrittää haluamasi värit vektorilla tai käyttää rainbow
-funktiota, jonka parametrina on palkkien lukumäärä, kuten me teimme, tai käyttää muita väripalettitoimintoja. Voit myös muuttaa palkkien reunaväriä border
-argumentilla.
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
Ryhmien etikettien muuttaminen
Kunkin ryhmän etiketti voidaan muuttaa names.arg
-argumentilla. Esimerkissämme ryhmät on merkitty numeroilla, mutta voimme muuttaa niitä kirjoittamalla jotain seuraavanlaista:
barplot(my_table, names.arg = c("four", "six", "eight"))
Palkkien leveys ja väli
Palkkien välejä ja välejä
Palkkien välejä tai palkkien leveyttä voi muuttaa myös argumenteilla width
ja space
. Ryhmien välisen tilan osalta tutustu tämän ohjeen vastaavaan osaan.
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
edustaa palkin tilaa edelliseen nähden, joten ensimmäistä elementtiä ei oteta huomioon.Pylväsdiagrammi datakehyksestä tai listasta
Lisäksi voit luoda pylväsdiagrammin suoraan datakehyksen tai jopa matriisin muuttujista, mutta huomaa, että muuttujan tulee olla jonkin tapahtuman tai ominaisuuden laskenta. Seuraavassa esimerkissä laskemme ajoneuvojen määrän värin mukaan ja kuvaamme ne pylväsdiagrammilla. Käytämme kunkin auton väriä vastaavien palkkien värittämiseen.
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"))
Palkkikaavio jatkuvalle muuttujalle
Työskennellessäsi jatkuvan muuttujan kanssa sinun on käytettävä cut
-funktiota tietojen luokitteluun. Muuten, jos ei ole yhtäläisyyksiä, sinulla on yhtä monta palkkia kuin vektorisi pituus ja palkkien korkeudet ovat yhtä suuret kuin 1. Seuraavassa esimerkissä jaamme datamme 0:sta 45:een 5:n askelin argumentilla 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))))
Vaakasuora pylväsdiagrammi
Oletusarvoisesti pylväsdiagrammit R:ssä piirretään pystysuoraan. On kuitenkin yleistä esittää vaakasuoria pylväsdiagrammeja. Voit kääntää kuvaajaa 90º ja luoda vaakasuuntaisen pylväsdiagrammin asettamalla horiz
-argumentin arvoksi TRUE
.
barplot(my_table, main = "Barchart", ylab = "Number of cylinders", xlab = "Frequency", horiz = TRUE) # Horizontal barplot
R-pylväsdiagrammin legenda
R:n pylväsdiagrammiin voidaan lisätä legenda legend.text
-argumentilla, jossa määritetään nimiä, jotka halutaan lisätä legendaan. Huomaa, että RStudiossa tuloksena saatava kuvaaja voi olla hieman erilainen, sillä legendan tausta on valkoinen eikä läpinäkyvä.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table)) # Legend
legend.text
-argumenttia legenda voi mennä päällekkäin pylväsdiagrammin kanssa.Helppoimmin tämän ongelman ratkaisee tässä esimerkissä legendan siirtäminen. Tämä voidaan toteuttaa args.legend
-argumentilla, jossa voit asettaa graafisia parametreja luettelon sisällä. Voit asettaa sijainniksi top
, bottom
, topleft
, topright
, bottomleft
ja bottomright
.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), args.legend = list(x = "top"))
Yhtälailla saat aikaiseksi edellisen piirroksen, jossa legenda on legend
-funktiolla legend
, seuraavasti legend
– ja fill
-argumenteilla.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3))legend("top", legend = rownames(my_table), fill = rainbow(3))
Tämä lähestymistapa toimii kuitenkin hyvin vain, jos legenda ei ole päällekkäin palkkien kanssa kyseisissä paikoissa. Parempi lähestymistapa on siirtää legenda oikealle, pois pylväsdiagrammista. Voit tehdä tämän asettamalla inset
-argumentin, joka välitetään args.legend
-argumentin sisällä olevan luettelon elementtinä, seuraavasti:
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
Voisit myös muuttaa akselien raja-arvoja xlim
– tai ylim
-argumenteilla pystysuuntaisia ja vaakasuuntaisia pylväsdiagrammeja varten, mutta huomioi, että tällöin määritettävä arvo riippuu palkkien lukumäärästä ja leveydestä. Muista, että jos osoitat pylväsdiagrammin muuttujalle, voit tallentaa kunkin pylvään keskipistettä vastaavat akselipisteet.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), xlim = c(0, 4.25))
Vaihtoehto legendan siirtämiseen on myös siirtää se pylväsdiagrammin alle layout
-, par
– ja plot.new
-funktioilla. Tämä lähestymistapa on edistyneempi kuin muut, ja sinun on ehkä tyhjennettävä graafiset parametrit ennen koodin suorittamista, jotta saat oikean kuvaajan, koska graafiset parametrit muuttuvat.
# 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))
Ryhmitetty pylväsdiagrammi R:ssä
Ryhmitetty pylväsdiagrammi, joka tunnetaan myös nimellä side-by-side-pylväsdiagrammi (side-by-side bar plot) tai klusteroitu pylväsdiagrammi (clustered bar chart) on R:ssä laadittu pylväsdiagrammi, jossa on kaksi tai useampi muuttuja. Kaavio näyttää kunkin useamman muuttujan pylväät.
# 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
Huomaa, että jos olisimme määritelleet table(cyl, am)
:n sijasta table(am, cyl)
, X-akseli kuvaisi sylinterien lukumäärää vaihteistotyypin sijasta.
Ryhmien väli
Kuten aiemmin tarkastelimme, pylväiden välejä voi muuttaa. Jos ryhmiä on useita, voit asettaa kaksielementtisen vektorin, jonka ensimmäinen elementti on kunkin ryhmän palkkien väli (0,4) ja toinen ryhmien välinen väli (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
Numeeriset arvot ryhmissä
Palkkikaavioita voidaan käyttää myös muuttujan yhteenvedon tekemiseen ryhmittäin, jotka on annettu yhdellä tai useammalla tekijällä. Ajatellaan esimerkiksi, että halutaan näyttää sylinterien lukumäärä ja voimansiirtotyyppi autojen hevosvoimien keskiarvon perusteella. Voit käyttää tapply
-funktiota vastaavan taulukon luomiseen:
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
Nyt voit luoda vastaavan pylväsdiagrammin R:ssä:
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)))
Virhepalkkeja sisältävä pylväsdiagrammi R:ssä
Oletusarvoisesti pylväsdiagrammia, jossa on virhepalkkeja, ei voi luoda. Seuraavalla funktiolla voit kuitenkin luoda täysin mukautettavan pylväsdiagrammin, jossa on vakiovirhepalkit.
# 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))
Vaikka pylväsdiagrammiin voikin lisätä virhepalkkeja, on syytä huomioida, että laatikkodiagrammi ryhmittäin saattaisi olla tässä skenaariossa parempi lähestymistapa tietojen yhteenvetoon.
Pinotettu pylväsdiagrammi R:ssä
Pinotettu pylväsdiagrammi on kuin ryhmitelty pylväsdiagrammi, mutta muuttujien frekvenssit on pinottu. Tämäntyyppinen pylväsdiagrammi luodaan oletusarvoisesti, kun argumenttina annetaan taulukko, jossa on kaksi tai useampia muuttujia, sillä argumentin beside
oletusarvo on 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)
Pinotetuille pylväsdiagrammeille on olemassa samankaltaisia toteutustapoja, kuten selkärangan piirto (spine plot) ja mosaiikkidiagrammi. Tällaisia plotteja voidaan luoda graphics
-paketin spineplot
– ja mosaicplot
-funktioilla.
Mosaiikkiplotin avulla voidaan visualisoida kahden tai useamman kvantitatiivisen muuttujan tietoja, joissa kunkin suorakulmion pinta-ala edustaa kyseisen muuttujan osuutta kussakin ryhmässä.
# install.packages("graphics")library(graphics)mosaicplot(other_table, main = "Mosaic plot")
Selkärankapiirros on mosaiikkiplotin erikoistapaus, ja se on pinotun pylväspiirroksen (stacked barplot) yleistys. Tässä tapauksessa, toisin kuin pinotuissa pylväsdiagrammeissa, jokainen pylväs laskee yhteen.
spineplot(other_table)
Huomaa, että oletusarvoisesti akselit on vaihdettu keskenään edellisessä kappaleessa luomasi pinotun pylväsdiagrammin suhteen. Voit luoda vastaavan pylväsdiagrammin transponoimalla frekvenssitaulukon t
-funktiolla.
spineplot(t(other_table))
Pylväsdiagrammi R:ssä: ggplot2
ggplot2
-kirjasto on tunnettu grafiikkakirjasto R:ssä. Voit luoda pylväsdiagrammin tällä kirjastolla muuntamalla datan datakehykseksi ja ggplot
– ja geom_bar
-funktioilla. Argumentissa aes
sinun on välitettävä datakehyksen muuttujien nimet. Kohdassa x
kategorinen muuttuja ja kohdassa y
numeerinen muuttuja.
# install.packages("ggplot2")library(ggplot2)df <- as.data.frame(my_table)ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity")
Vaakasuora pylväsdiagrammi ggplot2
Jos haluat kääntää edellistä pylväsdiagrammia, käytä coord_flip
-funktiota seuraavasti.
ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity") + coord_flip() # Horizontal bar plot