Gdy zmienna przyjmuje kilka wartości, często podsumowuje się informacje za pomocą tabeli częstości, którą można przedstawić za pomocą barchart lub barplot w R. W tym artykule wyjaśnimy podstawy tworzenia wykresów słupkowych w R.
- Funkcja barplot w R
- Parametry graficzne wykresu słupkowego: tytuł, etykiety osi i kolory
- Zmiana etykiet grup
- Szerokość wykresu i odstępy między słupkami
- Barplot z ramki danych lub listy
- Wykres słupkowy dla zmiennej ciągłej
- Horyzontalny wykres słupkowy
- Legenda barplotu
- Grouped barplot in R
- Odstęp między grupami
- Wartości liczbowe w grupach
- Wykres słupkowy z paskami błędów w R
- Stacked barplot in R
- Wykres słupkowy w R: ggplot2
- Horyzontalny wykres słupkowy ggplot2
Funkcja barplot w R
Do tworzenia wykresów słupkowych w R można użyć bazowej funkcji R barplot
. W tym przykładzie utworzymy wykres słupkowy z ramki danych. Konkretnie, przykładowym zbiorem danych jest dobrze znany mtcars
. Najpierw wczytaj dane i utwórz tabelę dla kolumny cyl
za pomocą funkcji table
.
# Load datadata(mtcars)attach(mtcars)# Frequency tablemy_table <- table(cyl)my_table
cyl 4 6 811 7 14
Przypomnij, że aby utworzyć wykres słupkowy w R, możesz użyć funkcji barplot
ustawiając jako parametr swoją wcześniej utworzoną tabelę, aby wyświetlić bezwzględną częstotliwość danych. Jeśli jednak wolisz wykres słupkowy z procentami na osi pionowej (częstotliwość względna), możesz użyć funkcji prop.table
i pomnożyć wynik przez 100 w następujący sposób.
# 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))

Zauważ, że możesz również utworzyć wykres słupkowy z danymi współczynnikowymi za pomocą funkcji plot
.
plot(factor(mtcars$cyl), col = rainbow(3))

Dodatkowo można pokazać liczby na słupkach za pomocą funkcji tekstowej w następujący sposób:
barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))text(barp, my_table + 0.5, labels = my_table)

Możesz również dodać siatkę za słupkami za pomocą funkcji 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)

Parametry graficzne wykresu słupkowego: tytuł, etykiety osi i kolory
Tak jak w przypadku innych wykresów, możesz określić wiele różnych parametrów graficznych, takich jak etykiety osi, tytuł lub dostosować osie. W poprzednim bloku kodu dostosowaliśmy kolory wykresu słupkowego za pomocą parametru col
. Możesz ustawić kolory, które preferujesz za pomocą wektora lub użyć funkcji rainbow
z liczbą słupków jako parametrem, tak jak my to zrobiliśmy, lub użyć innych funkcji palety kolorów. Można również zmienić kolor obramowania słupków za pomocą argumentu 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

Zmiana etykiet grup
Etykietę każdej grupy można zmienić za pomocą argumentu names.arg
. W naszym przykładzie grupy są oznaczone liczbami, ale możemy je zmienić, wpisując coś w rodzaju:
barplot(my_table, names.arg = c("four", "six", "eight"))

Szerokość wykresu i odstępy między słupkami
Można również zmienić odstępy między słupkami lub szerokość słupków za pomocą argumentów width
i space
. Aby uzyskać informacje na temat przestrzeni między grupami, zapoznaj się z odpowiednią sekcją tego samouczka.
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
reprezentuje przestrzeń paska względem poprzedniego, więc pierwszy element nie będzie brany pod uwagę.Barplot z ramki danych lub listy
Dodatkowo można utworzyć barplot bezpośrednio ze zmiennych ramki danych lub nawet macierzy, ale należy pamiętać, że zmienna powinna być zliczaniem jakiegoś zdarzenia lub cechy. W poniższym przykładzie liczymy liczbę pojazdów według kolorów i tworzymy wykres słupkowy. Każdy kolor samochodu posłuży nam do pokolorowania odpowiednich słupków.
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"))

Wykres słupkowy dla zmiennej ciągłej
W przypadku pracy ze zmienną ciągłą będziesz musiał użyć funkcji cut
do skategoryzowania danych. W przeciwnym razie, w przypadku braku remisów, będziesz miał tyle słupków, ile wynosi długość twojego wektora, a wysokości słupków będą równe 1. W poniższym przykładzie podzielimy nasze dane od 0 do 45 w krokach co 5 za pomocą argumentu 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))))

Horyzontalny wykres słupkowy
Domyślnie wykresy słupkowe w R są wykreślane pionowo. Jednak często spotykane jest reprezentowanie poziomych wykresów słupkowych. Można obrócić działkę o 90º i utworzyć poziomy wykres słupkowy, ustawiając argument horiz
na TRUE
.
barplot(my_table, main = "Barchart", ylab = "Number of cylinders", xlab = "Frequency", horiz = TRUE) # Horizontal barplot

Legenda barplotu
Legenda może być dodana do barplotu w R za pomocą argumentu legend.text
, gdzie można określić nazwy, które mają być dodane do legendy. Zauważ, że w RStudio wynikowy wykres może być nieco inny, ponieważ tło legendy będzie białe zamiast przezroczystego.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table)) # Legend

legend.text
legenda może nachodzić na barplot.Najprostszą metodą rozwiązania tego problemu w tym przykładzie jest przesunięcie legendy. Można to osiągnąć za pomocą argumentu args.legend
, w którym można ustawić parametry graficzne w ramach listy. Można ustawić pozycję na top
, bottom
, topleft
, topright
, bottomleft
i bottomright
.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), args.legend = list(x = "top"))

Równoważnie, można osiągnąć poprzedni wykres z legendą za pomocą funkcji legend
w następujący sposób z argumentami legend
i fill
.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3))legend("top", legend = rownames(my_table), fill = rainbow(3))
Niemniej jednak to podejście działa dobrze tylko wtedy, gdy legenda nie zachodzi na słupki w tych pozycjach. Lepszym podejściem jest przesunięcie legendy w prawo, poza barplot. Można to zrobić, ustawiając argument inset
przekazany jako element listy wewnątrz argumentu args.legend
w następujący sposób.
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

Można również zmienić granice osi za pomocą argumentów xlim
lub ylim
odpowiednio dla pionowych i poziomych wykresów słupkowych, ale należy pamiętać, że w tym przypadku wartość, którą należy podać, będzie zależała od liczby i szerokości słupków. Przypomnij sobie, że jeśli przypiszesz wykres słupkowy do zmiennej, możesz przechowywać punkty osi odpowiadające środkom każdego słupka.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), xlim = c(0, 4.25))
Inną alternatywą przesunięcia legendy jest przesunięcie jej pod wykres słupkowy za pomocą funkcji layout
, par
i plot.new
. To podejście jest bardziej zaawansowane niż pozostałe i może być konieczne wyczyszczenie parametrów graficznych przed wykonaniem kodu, aby uzyskać prawidłowy wykres, ponieważ parametry graficzne zostaną zmienione.
# 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
Grouped barplot, znany również jako side by side bar plot lub clustered bar chart to wykres słupkowy w R z dwoma lub więcej zmiennymi. Na wykresie będą wyświetlane słupki dla każdej z wielu zmiennych.
# 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

Zauważ, że gdybyśmy podali table(am, cyl)
zamiast table(cyl, am)
, oś X przedstawiałaby liczbę cylindrów zamiast typu skrzyni biegów.
Odstęp między grupami
Jak już wcześniej pisaliśmy, można zmienić odstęp między słupkami. W przypadku kilku grup można ustawić wektor dwuelementowy, w którym pierwszy element jest odstępem między słupkami każdej grupy (0,4), a drugi odstępem między grupami (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

Wartości liczbowe w grupach
Wykresy słupkowe mogą być również używane do podsumowania zmiennej w grupach określonych przez jeden lub kilka czynników. Rozważmy na przykład, że chcesz wyświetlić liczbę cylindrów i typ skrzyni biegów na podstawie średniej mocy koni mechanicznych samochodów. Możesz użyć funkcji tapply
do utworzenia odpowiedniej tabeli:
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
Teraz możesz utworzyć odpowiedni wykres słupkowy w 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)))

Wykres słupkowy z paskami błędów w R
Domyślnie nie można utworzyć wykresu słupkowego z paskami błędów. Jednak poniższa funkcja umożliwi utworzenie w pełni konfigurowalnego barplotu ze standardowymi paskami błędów.
# 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))

Nawet jeśli można dodać paski błędów do barplotu, należy zauważyć, że boxplot według grupy może być lepszym podejściem do podsumowania danych w tym scenariuszu.
Stacked barplot in R
Stacked barplot jest jak pogrupowany wykres słupkowy, ale częstotliwości zmiennych są ułożone w stos. Ten typ wykresu słupkowego zostanie utworzony domyślnie, gdy jako argument podamy tablicę z dwiema lub więcej zmiennymi, jako że argument beside
ma wartość domyślną 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)

W odniesieniu do wykresów słupkowych istnieją podobne implementacje, takie jak spine plot i mosaic plot. Tego typu wykresy można tworzyć za pomocą funkcji spineplot
i mosaicplot
pakietu graphics
.
Plot mozaikowy pozwala na wizualizację danych dwóch lub więcej zmiennych ilościowych, gdzie obszar każdego prostokąta reprezentuje proporcje tej zmiennej w każdej grupie.
# install.packages("graphics")library(graphics)mosaicplot(other_table, main = "Mosaic plot")

Spineplot jest specjalnym przypadkiem plotu mozaikowego i jego uogólnieniem stacked barplot. W tym przypadku, w przeciwieństwie do wykresów słupkowych, każdy słupek sumuje się do jednego.
spineplot(other_table)

Zauważ, że domyślnie osie są zamienione w stosunku do wykresu słupkowego utworzonego w poprzedniej sekcji. Możesz utworzyć równoważny wykres transponujący tabelę częstości za pomocą funkcji t
.
spineplot(t(other_table))

Wykres słupkowy w R: ggplot2
Biblioteka ggplot2
jest dobrze znaną biblioteką graficzną w R. Możesz utworzyć wykres słupkowy za pomocą tej biblioteki, konwertując dane do ramki danych oraz za pomocą funkcji ggplot
i geom_bar
. W argumencie aes
musisz przekazać nazwy zmiennych swojej ramki danych. W x
zmienną kategoryczną, a w y
numeryczną.
# install.packages("ggplot2")library(ggplot2)df <- as.data.frame(my_table)ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity")

Horyzontalny wykres słupkowy ggplot2
Jeżeli chcesz obrócić poprzedni wykres słupkowy, użyj funkcji coord_flip
w następujący sposób.
ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity") + coord_flip() # Horizontal bar plot

.