Dariusz Brzeziński
Podczas pracy z danymi warto tworzyć sporo wykresów. Większość z nich nie będzie zdatna do prezentacji wyników analizy, ale pomoże sterować kierunkiem badań.
Warto eksperymentować z rożnymi sposobami prezentowania tych samych danych. Często dopiero zbiór kilku wykresów wyjaśnia co kryją dane.
Według Edwarda Tufty'ego:
Pokazuj porównania
Wyniki są interesujące jeśli można je do czegoś odnieść.
Pokazuj porównania
Wyniki są interesujące jeśli można je do czegoś odnieść.
Pokazuj zależności
Od czego mogą zależeć wyniki? Czy da się tę zależność pokazać?
Pokazuj wielowymiarowe dane
Staraj się pokazywać więcej niż dwa wymiary - świat jest wielowymiarowy.
Łącz różne formy wizualizacji
Dodaj tekst, liczby, obrazy
Bądź wiarygodny
Dobieraj odpowiednio wizualizacje, skale, opisuj osie
Skup się na danych
Dobra wizualizacja musi opierać się na dobrych danych
library(datasets)
data(cars)
with(cars, plot(speed, dist))
xyplot
, bwplot
, itd.)library(lattice)
state <- data.frame(state.x77, region = state.region)
xyplot(Life.Exp ~ Income | region, data = state, layout = c(4, 1))
library(ggplot2)
data(mpg)
qplot(displ, hwy, data = mpg)
W ggplot2 wykres tworzy się za pomocą funkcji ggplot()
. Wykres może mieć dowolną liczbę warstw. Warstwę można stworzyć za pomocą ogólnej funkcji layer()
lub jednej z wielu specjalizowanych funkcji, które wywołują layer()
(jak na przykład geom_point()
).
+
+
=
Oprócz listy warstw wykres ma wyspecyfikowane także układ współrzędnych, skale i panele. Te trzy elementy są wspólne dla wszystkich warstw. Wygląd tych elementów definiowany jest przez motyw.
Każda warstwa wykorzystuję jakąś statystykę, aby podsumować dane, rysuje określoną figurę geometryczną dla każdego (podsumowanego) elementu danych i wykorzystuje odpowiednie dopasowanie położenia, aby radzić sobie w sytuacjach, gdy elementy mogą nachodzić na siebie.
gg = Grammar of Graphics (Wilkinson, 1999)
plot: coord scale+ facet? layer+
layer: data mapping stat geom position?
p <- ggplot() +
coord_cartesian() +
scale_x_continuous()+
scale_y_continuous()+
scale_color_hue() +
facet_wrap(~cut) +
layer(data=diamonds,
mapping=aes(
x=carat,
y=price,
color=color),
stat="identity",
geom="point",
position=
position_jitter()
)
p + layer(
data=diamonds,
mapping=aes(
x=carat,
y=price),
stat="smooth",
params=list(
method="glm",
formula=
y~poly(x,2),
color="black"),
geom="smooth",
position=
position_identity()
)
Przedstawiona technika pozwala dowolnie modyfikować wizualizacje, jednak do typowych wykresów definicje mogą być znacznie krótsze. Kolejne przykłady pokażą bardziej zwięzłe formy definiowania wykresów.
Istnieje także funkcja qplot()
, która pozwala na jeszcze bardziej zwięzłe definicje wykresów. Ze względu
na ograniczoną liczbę opcji i trudniejsze modyfikowanie wykresów stworzonych za pomocą qplot()
nie
będziemy omawiać tej funkcji.
ggplot(
mpg,
aes(x=displ,
y=hwy,
color=factor(cyl)
)
) +
geom_point()
ggplot(
mpg,
aes(x=displ,
y=hwy,
color=factor(cyl)
)
) +
geom_line()
ggplot(
mpg,
aes(x=displ,
y=hwy,
color=factor(cyl)
)
) +
geom_point() +
geom_line()
ggplot(
mpg,
aes(x=displ,
y=hwy,
color=factor(cyl)
)
) +
geom_bar(
stat="identity",
position=
"identity")
ggplot(
mpg,
aes(x=displ,
y=hwy,
color=factor(cyl)
)
) +
geom_point() +
geom_smooth(
data=subset(
mpg,
cyl != 5),
method="lm")
ggplot(
mpg,
aes(x=displ,
y=hwy)
) +
geom_point() +
geom_smooth() +
facet_grid(. ~ year)
ggplot(mpg, aes(hwy, fill=drv)) +
geom_bar()
ggplot(mpg, aes(hwy, fill=drv,
alpha=0.25)) +
geom_density()
ggplot(mpg, aes(hwy, fill=drv,
alpha=0.25)) +
geom_density() + theme_bw()
Warto również zapoznać się z biblioteką ggthemes!
df=data.frame(x=1:10,y=factor(letters[1:5]))
ggplot(df, aes(x, x, size=x)) + geom_point()
df=data.frame(x=1:10,y=factor(letters[1:5]))
ggplot(df, aes(x, x, color=x))+geom_point()
df=data.frame(x=1:10,y=factor(letters[1:5]))
ggplot(df, aes(y, y, shape=y))+geom_point()
df=data.frame(x=1:10,y=factor(letters[1:5]))
ggplot(df, aes(y, y, color=y))+geom_point()
d=data.frame(height=c(1,2,2,3,4), weight=c(1,3,4,4,2))
p = ggplot() +
geom_line(data=d, mapping=aes(x=height, y=weight)) +
geom_point(data=d, mapping=aes(x=height, y=weight), size=8, fill="white", shape=21) +
geom_text(data=d,mapping=aes(x=height, y=weight, label=seq(1,nrow(d))))
p
p + coord_flip()
p + coord_trans(x="log10", y="log10")
p + coord_equal()
p + coord_polar(theta="x")
require(maps)
d = data.frame(map(database="italy", plot=F)[c("x", "y")])
ggplot() + coord_map() +
geom_polygon(data=d, mapping=aes(x=x, y=y), fill="red", color="black", size=0.2)
p <- ggplot(
data=mpg,
aes(x=displ,
y=hwy,
fill=factor(cyl))
) +
geom_bar(
stat="identity",
position=
"identity")
p
p + scale_fill_brewer()
p + scale_fill_brewer(
palette="Set1")
p + scale_fill_brewer(
palette="Spectral")
Ręcznie definiowane
p +
scale_fill_manual(
values=
c("red",
"blue",
"green",
"orange"))
Ręcznie definiowane
p +
scale_fill_manual(
values=
c("#CC6666",
"#9999CC",
"#66CC99",
"#ffa500"))
colorRamp
: paleta dla wartości od 0 do 1colorRampPalette
: paleta o zadanej liczbie kolorówpal <- colorRampPalette(c("red", "yellow"))
pal(2)
[1] "#FF0000" "#FFFF00"
pal(10)
[1] "#FF0000" "#FF1C00" "#FF3800" "#FF5500" "#FF7100" "#FF8D00" "#FFAA00"
[8] "#FFC600" "#FFE200" "#FFFF00"
Podsumowanie
p=qplot(displ,hwy,data=mpg,colour=factor(cyl))
summary(p)
Zapisanie obiektu wykresu
save(p, file = "plot.rdata")
load("plot.rdata")
Eksport do obrazka
ggsave("plot.png", width = 5, height = 5)
Wykres można ubarwić za pomocą bibliotek dostępnych pod adresami:
library(plotly)
dsamp <- diamonds[sample(nrow(diamonds),1000),]
p <- ggplot(dsamp, aes(carat, price,
color=clarity)) +
geom_point()
ggplotly(p)
Wykonaj następujące wykresy na zbiorze diamonds:
depth
cut
wpływa na histogram
price
(być może zmieniając wartości części parametrów)carat
i price
Czy jesteś w stanie wykonać wykresy podobne do tych zaproponowanych na poprzednim slajdzie?