Poniższy raport prezentuje rozwiązania serii zadań z zakresu wizualizacji danych w środowisku R, łącząc kod generujący wykresy z ich szczegółową interpretacją.
W pierwszym zadaniu analizujemy różnice w działaniu trzech różnych podejść do grupowania danych na histogramie.
par(mai = c(1, 1, 1, 1), omi = c(0, 0, 0, 0))
xx <- c(9.20, 6.00, 6.00, 11.25, 11.00, 7.25, 9.7, 13.25, 14.00, 8.00)
par(mfrow=c(1,3)) # Ustawienie 3 wykresów obok siebie dla łatwego porównania
# Program a
hist(xx, breaks = c(6, 8, 10, 12, 14), main="Program A", xlab="Wartości", ylab="Częstość")
# Program b
hist(xx, breaks = c(6, 8, 10, 12, 14), right = F, main="Program B", xlab="Wartości", ylab="Częstość")
# Program c
br1 <- c(6, 8, 10, 12, 14, 16)
bw1 <- br1[2] - br1[1]
xxh <- floor(xx/bw1) * bw1 + 0.1 * bw1
hist(xxh, breaks = br1, right = F, main="Program C", xlab="Wartości (zmodyfikowane)", ylab="Częstość")
par(mfrow=c(1,1)) # Reset ustawień
Interpretacja:
Poniższy kod generuje oszacowanie gęstości jądrowej dla zbioru danych xx. Zgodnie z poleceniem, wykres uzupełniono o odpowiednie tytuły i opisy osi.
par(mai = c(1, 1, 1, 1), omi = c(0, 0, 0, 0))
xx <- c(1.92, 4.01, 6.51, 1.40, 1.67, 5.27, 1.42, 0.36,
3.18, 3.67, 7.48, 2.65, 7.86, 10.78, 2.30, 1.29, 0.31, 0.93, 2.34, 2.53)
d1 <- density(xx, bw = "SJ-ste")
ex <- d1$x
ey <- d1$y
plot(ex, ey, type = "n", xlab = "Wartość x", ylab = "Gęstość p(x)", main = "Oszacowanie Gęstości Jądrowej")
lines(ex, ey)
rug(xx, ticksize = 0.2, lwd = 1)
Kolejny wykres to tzw. stripchart z naniesionymi miarami tendencji centralnej i rozrzutu.
par(mai = c(1, 1, 1, 1), omi = c(0, 0, 0, 0))
set.seed(591)
xx1 <- rnorm(20, mean = 3, sd = 3.6)
xx2 <- rpois(40, lambda = 3.5)
xx3 <- rchisq(31, df = 5)
mean1 <- c(mean(xx1), mean(xx2), mean(xx3))
sd1 <- c(sd(xx1), sd(xx2), sd(xx3))
data1 <- list(xx1, xx2, xx3)
xmin1 <- min(xx1, xx2, xx3) - 1
xmax1 <- max(xx1, xx2, xx3) + 1
stripchart(data1, method = "jitter", jit = 0.3, vert = T,
pch = 1, cex = 0.4, ylim = c(xmin1, xmax1),
group.names = c("Group-1", "Group-2", "Group-3"),
main = "Wykres paskowy z wizualizacją średniej i odchylenia standardowego",
ylab = "Wartości")
arrows(1:3, mean1 + sd1, 1:3, mean1 - sd1, angle = 45, code = 3, length = 0.07)
arrows(1:3, mean1 + 2 * sd1, 1:3, mean1 - 2 * sd1, angle = 30, code = 3, length = 0.07)
arrows(1:3, mean1 + 0.01 * sd1, 1:3, mean1 - 0.01 * sd1, angle = 90, code = 3, length = 0.12)
Interpretacja:
Kod w tym zadaniu pokazuje rozmieszczenie pojedynczych punktów danych w trzech losowo wygenerowanych grupach: Group-1, Group-2 i Group-3. Dzięki zastosowaniu jittera punkty są lekko przesunięte poziomo, co pozwala lepiej zobaczyć ich zagęszczenie na osi pionowej. Strzałki umieszczone przy każdej grupie przedstawiają kluczowe statystyki opisowe: średnią, oraz odchylenie standardowe. Krótka pozioma kreska wskazuje wartość średniej, natomiast dłuższe strzałki wyznaczają zakres jednego i dwóch odchyleń standardowych od tej średniej. Taka wizualizacja umożliwia szybkie ocenienie tendencji i zmienności danych, a także ułatwia porównanie rozkładów między grupami.
par(mai = c(1, 1, 1, 1), omi = c(0, 0, 0, 0))
set.seed(591)
xx1 <- rnorm(20, mean = 3, sd = 3.6)
xx2 <- rpois(40, lambda = 3.5)
xx3 <- rchisq(31, df = 5, ncp = 0)
box1 <- boxplot(xx1, xx2, xx3,
names = c("Group-1", "Group-2", "Group-3"),
cex = 0.7,
main = "Porównanie Rozkładów Trzech Grup Danych (Boxplot)",
xlab = "Grupa Danych",
ylab = "Wartości Obserwacji",
col = "lightgray")
print("Wartości statystyk dla poszczególnych pudełek:")
## [1] "Wartości statystyk dla poszczególnych pudełek:"
print(box1$stats)
## [,1] [,2] [,3]
## [1,] -2.8580738 1.0 0.9967114
## [2,] 0.8986256 2.0 3.0599321
## [3,] 3.6043115 3.5 4.0441146
## [4,] 5.8154664 5.0 5.7286438
## [5,] 12.6367499 8.0 9.3837688
Interpretacja:
Wygenerowany wykres przedstawia trzy wykresy pudełkowe odpowiadające trzem różnym grupom danych losowych: jednej z rozkładu normalnego, jednej z Poissona i jednej z rozkładu chi-kwadrat. Każde pudełko pokazuje podstawowe dane o podanym zbiorze: w tym medianę jako linię wewnątrz pudełka oraz pierwszy i trzeci kwartyl jako jego krawędzie. Linie wychodzące z głównego pudełka rozciągają się od pudełka do najbardziej skrajnych obserwacji, które nie są uznawane za wartości odstające od naszych założeń. Punkty znajdujące się poza zasięgiem linii reprezentują wartości nie należące do naszych założeń. Taki wykres pozwala łatwo porównać różnice w rozkładzie, zmienności oraz centralnej tendencji między trzema grupami danych.
Poniższa technika rozwiązuje problem zestawienia ze sobą danych mierzonych w zupełnie innych skalach.
par(mai = c(1, 1, 1, 1), omi = c(0, 0, 0, 0))
# Wykres lewej osi
plot(c(-0.1, 2.1), c(0, 2.3), type = "n", xlab = "Wartości x", ylab = "Seria Danych y (Skala Lewa)", main = "Porównanie dwóch serii danych na wspólnej osi X")
xx <- c(0, 1, 2)
yy <- c(2, 0.8, 1.4)
lines(xx, yy, col = "blue")
points(xx, yy, pch = 0, col = "blue")
text(xx, yy + 0.2, labels = as.character(yy), col = "blue")
par(new = T) # Nałożenie kolejnego wykresu
# Wykres prawej osi
plot(c(-0.1, 2.1), c(100, 250), type = "n", xlab = "", ylab = "", axes = F)
axis(4, col = "red", col.axis="red")
mtext("Seria Danych y_2 (Skala Prawa)", side = 4, line = 2, col="red")
xx_2 <- c(0, 1, 2)
yy_2 <- c(110, 130, 165)
lines(xx_2, yy_2, col = "red")
points(xx_2, yy_2, pch = 16, col = "red")
text(xx_2, yy_2 + 10, labels = as.character(yy_2), col = "red")
# Legenda
legend("topleft", legend = c("Seria y (Skala Lewa)", "Seria y_2 (Skala Prawa)"), col = c("blue", "red"), pch = c(0, 16), lty = 1, cex = 0.8, bty="n")
Interpretacja:
Ten wykres pokazuje dwa różne zbiory danych jednocześnie, mimo że mają one bardzo różne wartości, czyli na pierwszy wykres został naniesiony drugi. Linia niebieska, z punktami, odczytywana jest z lewą skalą (wartości od 0 do 2), podczas gdy linia czerwona, z punktami, jest mierzona prawą skalą (wartości od 100 do 250). To nakładanie się na siebie pozwala użyć tej samej osi poziomej (x) dla obu grup. Dzięki temu można łatwo sprawdzić, czy obie grupy zmieniają się w ten sam sposób w miarę przesuwania się wzdłuż osi poziomej.
Ostatnie zadanie dotyczy nakładania na siebie dwóch wykresów kołowych z różnymi promieniami w celu uzyskania efektu hierarchii.
# Główne koło zewnętrzne
par(mai = c(1, 1, 1, 1), omi = c(0, 0, 0, 0))
yy <- c(50,30,40)
name1 <- c("data-a", "data-b", "data-c")
pie(yy, labels = name1, col = c("red","green","skyblue"), radius=1)
par(new = T) # Nałożenie wykresu
# Mniejsze koło wewnętrzne
par(mai=c(2, 2, 2, 2))
yy2 <- c(50, 20, 10, 20, 20)
name2 <- c("data-a1", "data-b1", "data-b2", "data-c1", "data-c2")
pie(yy2, labels = name2, col = c("pink", "gold", "blue", "gold", "blue"), radius=0.7)
Interpretacja:
Program tworzy pojedynczy, dwupoziomowy wykres kołowy przypominający tarczę, w której oba poziomy nachodzą na siebie. Zewnętrzny pierścień przedstawia wielkość trzech głównych sekcji A, B i C, pokazując ich udział w całości. Wewnątrz niego znajduje się mniejsze koło, narysowane na tym samym środku, które prezentuje podział każdej z głównych sekcji na bardziej szczegółowe części. Segmenty wewnętrznego koła odpowiadają więc elementom składowym poszczególnych grup, na przykład podziałowi sekcji B na B1 i B2. Dzięki temu cały wykres pozwala jednocześnie zobaczyć ogólny rozkład oraz wewnętrzną strukturę danych.