09.07

2014

Wykresy słupkowe (kolumnowe) w R i w Excelu

Autor: artur

Dzisiaj kolejny gościnny wpis Sylwii Makary i Damiana Smuga. Tym razem o tworzeniu wykresów słupkowych (kolumnowych) w R. Punktem wyjścia jednak jest MS Excel: na podstawie możliwości tego narzędzia przyglądamy się, jak poszczególne rodzaje wykresów przygotować w R.

Wpis będzie przydatny dla każdego, kto już prezentuje dane w R. Będzie też przydatny dla osób pracujących w Excelu i chcących zautomatyzować pracę lub spróbować używać innego narzędzia.

Dzięki temu wpisowi nauczysz się przygotowywać najróżniejsze wersje wykresów słupkowych — odpowiednie do tego, co chcesz pokazać.

W R jest możliwe tworzenie zarówno prostych, jak i tych bardziej złożonych wykresów kolumnowych. Poniżej zostanie przedstawiony sposób generowania takiego prostego wykresu, a następnie stopniowego rozbudowywania go w sposób analogiczny, jak pozwala na to Excel (wersja: 2007). Wykresy z efektem trójwymiarowym zostaną pominięte. Użyta wersja R: 3.0.2.

Przygotowanie danych

Na wykresie kolumnowym można ukazać dane przedstawione w postaci macierzy. Do utworzenia takiej macierzy służy funkcja matrix. Nadając dodatkowo nazwy zmiennym (używając np. argumentu dimnames w funkcji matrix), możemy łatwo otrzymać odpowiednie podpisy pod kolumnami.

Do zaprezentowania wykresów kolumnowych posłużą dane pobrane z https://datamarket.com. Wybrane przykładowe dane to: Population by level of education in Poland, 2012. W R przygotowujemy je w następujący sposób:

data<-matrix(c(1051432,1109241,1306314,1367362,1344474,1397846),
             2, 3, dimnames = list(c("Female","Male"),
                                   c("Primary","Secondary","Tertiary")))

Podstawowe wykresy kolumnowe w R

Wykres kolumnowy w R tworzymy za pomocą funkcji barplot. Jednym z jej argumentów jest parametr logiczny beside, który służy do ustalenie czy wykres ma być grupowany (beside = TRUE) czy skumulowany (beside = FALSE) w przypadku kilku serii danych.

Wykres kolumnowy dla jednej serii danych.

barplot(data[1,]) #wykres dla jednej serii danych - Female
Wykres kolumnowy jednej serii danych.

Wykres kolumnowy jednej serii danych.

Wykresy kolumnowe dla kilku serii danych.

Wykres kolumnowy grupowany.
barplot(data, beside = TRUE)
Wykres kolumnowy grupowany.

Wykres kolumnowy grupowany.

Wykres kolumnowy skumulowany.
barplot(data) #beside = FALSE to domyślne ustawienie funkcji
Wykres kolumnowy skumulowany.

Wykres kolumnowy skumulowany.

Wykres kolumnowy skumulowany 100%.

Do utworzenia wykresu skumulowanego 100% należy na początek znormalizować dane do 100% w następujący sposób:

v1<-data[,1]/sum(data[,1])*100
v2<-data[,2]/sum(data[,2])*100
v3<-data[,3]/sum(data[,3])*100
data2<-matrix(c(v1, v2, v3), 2, 3,
              dimnames = list(c("Female","Male"),
                              c("Primary","Secondary","Tertiary")))

Następnie rysujemy zwykły wykres skumulowany, ale z "nowymi" danymi.

barplot(data2)
Wykres kolumnowy skumulowany 100%.

Wykres kolumnowy skumulowany 100%.

Zmiana porównywanych zmiennych

W Excelu jest dostępna opcja "Przełącz wiersz/kolumnę", dzięki której wygodnie i szybko można zmienić, które zmienne będą porównywane na wykresie kolumnowym (kolumny czy wiersze z tabeli danych). W R jest to równie łatwe. Wystarczy użyć funkcji transponującej macierz t() tak, jak jest to pokazane niżej.

par(mfrow=c(1,2))
barplot(data, beside = TRUE) # porównujemy dane względem płci
barplot(t(data), beside = TRUE) # porówujemy dane względem wykształcenia
Zmiana porównywanej zmiennej na wykresie.

Zmiana porównywanej zmiennej na wykresie.

Złożone wykresy kolumnowe w R

Styl wykresu

Kolory i tło wykresu ustawiamy za pomocą argumentów colbg odpowiednio. Możemy również ustalić kolor obramowania kolumn za pomocą argumentu border oraz zmienić styl linii (więcej na ten temat w opcje-w-R).

par(mfrow=c(1,2))
par(bg = "aliceblue")
barplot(data, beside = TRUE, col = topo.colors(2)) # używamy tu palety kolorów topo.colors
par(lwd=2, lty=3) # grubość linii 2, styl - kropki
barplot(data, beside = TRUE, col = heat.colors(2), border=&#39;blue')
Ustawianie kolorów i obramowania.

Ustawianie kolorów i obramowania.

Przydatne również może być pomalowanie słupków innymi kolorami zależnie od dodatkowej zmiennej. Np. mając dane dla kolejnych miast, można pomalować słupki wg regionów lub użyć różnych kolorów dla pozytywnych i negatywnych wartości. Możemy to zrobić tworząc wektor z wartościami kolorów zależnymi od wartości danych.

par(mfrow=c(1,2))
#wykres z różnymi kolorami dla ujemnych i dodatnich wartości
data2<-c(4,11,2,-3,-10,-15,8,7,3,9,-6,-5,-14,-10,3,6)
colors2<-ifelse(data2<0, &#39;cyan', 'hotpink') # wektor kolorów
# cyan, gdy wartości data2 są ujemne, hotpink - gdy dodatnie
barplot(data2, col=colors2)
 
#wykres z różnymi kolorami w zależności od dodatkowej zmiennej
par(las=2) # prostopadłe do osi podpisy
data3<-data.frame(data=c(14,25,36,13,46,31,34,26,9,41), region=c(&#39;north','west','north','south','south','east','west','east','east','north'))
colors3<-rep(&#39;red', times=10) # tworzymy wektor kolorów na początku z jednym kolorem
colors3<-ifelse(data3[,2] == &#39;west', 'green', colors3)
# w zależności od zmiennej region zmieniamy kolory w wektorze na odpowiedni
colors3<-ifelse(data3[,2] == &#39;south', 'yellow', colors3)
colors3<-ifelse(data3[,2] == &#39;east', 'blue', colors3)
barplot(data3[,1], col=colors3, names.arg=data3[,2])
Uwarunkowanie kolorów słupków.

Uwarunkowanie kolorów słupków.

Alternatywną opcją do wypełniania kolorem słupków może być kreskowanie ich. Taki efekt można uzyskać dzięki argumentowi density, którego wartości liczbowe oznaczają intensywność kreskowania. Kąt, pod którym padają kreski, można ustawić za pomocą argumentu angle (domyślne ustawienie to 45).

barplot(t(data), beside = TRUE, col = &#39;blue', density=c(4,15,30), angle=c(0,45,90))
Kreskowanie.

Kreskowanie.

Układ wykresu

Tytuł wykresu.

Tytuł wykresu możemy ustawić za pomocą funkcji title lub jako argumentu funkcji barplot.

barplot(data, beside = TRUE)
title(main = list("Population by level of education in Poland, 2012.", font = 6, col = &#39;darkblue', cex = 1.1)) # parametry funkcji służą do ustawienia czcionki i koloru

Ustawianie tytułu wykresu. Więcej na temat ustawiania tytułu wykresu w opcje-w-R.Rmd .

Tytuły osi.

Dzięki podpisaniu kolumn i wierszy w macierzy danych, automatycznie wyświetlają się odpowiednie podpisy pod kolumnami lub grupami porównywanych kolumn. W przeciwnym wypadku dodać takie podpisy (lub zmienić istniejące) można za pomocą argumentu names.arg. Natomiast tytuł całej osi dodajemy tak, jak tytuł wykresu tylko za pomocą argumentów xlab oraz ylab (tytuły osi poziomej i pionowej odpowiednio).

barplot(data, beside = TRUE, names.arg = c("1", "2", "3"))
title(xlab = list("Level of education", font = 6, col = &#39;darkblue', cex = 1),
      ylab = list("Population", font = 6, col = &#39;darkblue', cex = 1))

Ustawianie tytułów osi. Więcej na temat ustawiania tytułów osi w opcje-w-R.Rmd .

Legenda.

Legendę ustawiamy za pomocą argumentu legend.

# ustawiamy xlim, aby zrobic miejsce na legende
barplot(data, beside = TRUE, xlim = c(0,13), args.legend = list(x = "right"), legend = rownames(data))

Ustawianie legendy. Więcej na temat ustawiania legendy w opcje-w-R.Rmd.

Etykiety danych.

Do dołączania etykiet danych posłużymy się funkcją text. Warto odnotować, iż funkcja barplot, oprócz rysowania wykresu, zwraca współrzędne środków kolejnych słupków.

bp = barplot(data, beside = TRUE, ylim=c(0,1500000)) #pod bp zapisujemy współrzędne środków kolumn
  #ustawiamy ylim, aby słupki nie wystawały poza wykres i żeby zmieścić etykiety
  #pos=3 przesuwa napisy nad wspołrzędne x,y
text(x=bp, y=matrix(data,6,1), pos=3, labels=matrix(data,6,1))
Etykiety danych.

Etykiety danych.

Przesuwanie etykietek nad słupek (pos=3) może okazać się niezbyt dobrym rozwiązaniem, gdy mamy do czynienia z danymi o wartościach ujemnych. Wtedy należy każdą współrzędną y zwiększyć lub zmniejszyć odpowiednio w zależności czy jest ona ujemna czy dodatnia.

data3<-matrix(c(4,8,-2,-6,3,-4), 2, 3)
x = barplot(data3, beside = TRUE, ylim=c(-10,10))
y = matrix(data3,6,1)
y2<-ifelse(y<0, y-1, y+1) # jeżeli współrzędna jest ujemna to przesuwamy ją o 1 w dół
#jeżeli nie - o 1 w górę. To o ile przesuwamy y jest uzależnione od rozpiętości danych
text(x, y2, labels=matrix(data3,6,1))
Etykiety danych z wartościami ujemnymi.

Etykiety danych z wartościami ujemnymi.

W przypadku długich etykietek można ustawić, aby napisy były skośne lub pionowe za pomocą argumentu srt opisującego pod jakim kątem od poziomu mają być napisy.

par(mfrow=c(1,2))
# etykietki pod kątem 45 stopni od poziomu
bp = barplot(data, beside = TRUE, ylim=c(0,1800000))
text(x=bp, y=matrix(data,6,1)+200000, labels=matrix(data,6,1), srt=45)
# zwiększamy ylim, żeby zrobić więcej miejsca na etykietki
 
# etykietki pionowe
bp = barplot(data, beside = TRUE, ylim=c(0,2000000))
text(x=bp, y=matrix(data,6,1)+300000, labels=matrix(data,6,1), srt=90)
Etykiety danych skośne i pionowe.

Etykiety danych skośne i pionowe.

Osie.

Za pomocą funkcji axis wprowadzamy zmiany w stylu opisów osi oraz dodajemy oś X.

barplot(data, beside = TRUE, ylim=c(0,1500000), axes=FALSE, cex.names=1)
#drugi parametr - pozycje znaczników, trzeci - pozycje opisów
#mimo, że w obu parametrach ustawiamy to samo, na wykresie nie będzie wszystkich
#wartości, bo się nie zmieszczą
axis(2, seq(0,1500000,250000), labels=seq(0,1500000,250000), font=4)
#dołożenie osi OX, bez opisów - gdyż już istnieją
axis(1, labels=FALSE, font=4)

Osie. Więcej na temat ustawiania osi w opcje-w-R.Rmd.

Linie siatki.

Dodajemy siatkę dla osi Y, aby móc porównywać wysokości słupków (przydatne w przypadku wielu słupków i braku miejsca na etykiety).

bp = barplot(data, beside = TRUE, ylim=c(0,1500000))
 
#nx, ny - liczba pól, na które linie siatki dzielą pole w danym kierunku
#nx=NA oznacza brak linii prostopadłych do osi X 
#lwd - szerokość linii
#lty - typ (1 ciągły, 2 przerywane)
grid(nx=NA, ny=6, lwd = 1, col = "black", lty=2)
Linie siatki.

Linie siatki.

Ostateczny wykres.

Po podsumowaniu wszystkich opcji z punktu 4.2. otrzymujemy następujący wykres.

par(bg = "aliceblue")
barplot(data, beside = TRUE, col = topo.colors(2),
        args.legend = list(x = 3, y=1500000), legend = rownames(data),
        ylim=c(0,1500000), cex.names=1.5, axes=FALSE) 
title(main = list("Population by level of education in Poland, 2012.", font = 6,
                  col = &#39;darkblue', cex = 1.7),
      xlab = list("Level of education", font = 6, col = &#39;darkblue', cex = 1.5),
      ylab = list("Population (in thousands)", font = 6, col = &#39;darkblue', cex = 1.5))
text(x=bp, y=matrix(data,6,1), labels=matrix(data,6,1),pos=3)
axis(2, seq(0,1500000,250000), labels=seq(0,1500,250), font=3, lty=1)
axis(1, labels=FALSE, font=4, lty=2)
grid(NA, 6, lwd = 1, col = "gray31", lty=2)
Ostateczny wykres w R.

Ostateczny wykres w R.

Wykres stworzony w Excel’u analogiczny do wykonanego w R

Wykres kolumnowy z Excel'a

Wykres kolumnowy z Excel’a

Źródła informacji

  1. Wykresy słupkowe – statmethods
  2. Własne eksperymenty i obserwacje
  3. Plik opcje-w-R
  4. Biecek Przemysław: Przewodnik po pakiecie R. Wydanie I, Wrocław: Oficyna Wydawnicza GiS, 2008
  5. Wykresy słupkowe – stat.ethz

Spróbuj ponownie