Barplot in R

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

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)
Przypisanie wykresu słupkowego wewnątrz zmiennej spowoduje zapisanie wartości osi odpowiadających środkowi każdego słupka.

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))
Wektor 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
Zauważ, że przez użycie argumentu 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

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.