前言
散點(diǎn)圖在顯示兩個(gè)變量之間的關(guān)系時(shí)非常有用怠李。
ggplot2
提供了 geom_point
函數(shù)蚜锨,以及它的變體:geom_jitter()
瓷蛙、geom_count()
和 geom_bin2d()
來繪制點(diǎn)圖焚志。
下面我們來看看如何繪制點(diǎn)圖
示例
1. geom_point
常用參數(shù):
-
alpha
:透明度 -
colour
:點(diǎn)顏色 -
fill
:填充色 -
group
:分組變量 -
shape
:形狀 -
size
:大小 -
stroke
:邊框大小
來一個(gè)超級(jí)簡單的例子
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point()
世界不只黑白嘱腥,給它點(diǎn)顏色瞧瞧
p + geom_point(aes(colour = factor(cyl)))
都太圓滑了录别,來點(diǎn)棱角
p + geom_point(aes(colour = factor(cyl), shape = factor(cyl)))
太小了,費(fèi)眼睛邻吞,不行,要大點(diǎn)
p + geom_point(aes(colour = factor(cyl), shape = factor(cyl),
size = qsec))
哦葫男,這個(gè)叫泡泡圖抱冷。但是這個(gè)泡泡圖看起來不太好看,我們來更改一下參數(shù)
p <- ggplot(mtcars, aes(wt, mpg))
p1 <- p + geom_point(aes(fill = disp, size = disp))
p2 <- p + geom_point(aes(fill = disp, size = disp), shape = 21)
p3 <- p1 + scale_fill_gradient2(low = "#d8b365", high = "#5ab4ac",
limits = c(0, max(mtcars$disp)),
midpoint = mean(mtcars$disp))
p4 <- p2 + scale_size_area(max_size = 10) +
geom_text(aes(label=disp), size = 2)
plot_grid(p1, p2, p3, p4, labels = LETTERS[1:4], nrow = 2)
注意:圖 A
為什么是黑色的呢梢褐?因?yàn)橹挥?21-25
之間的形狀才有 colour
和 fill
屬性旺遮。所以當(dāng)我們?cè)O(shè)置 shape = 21
之后,點(diǎn)的填充色變成了藍(lán)色漸變色盈咳。
當(dāng)然耿眉,也可以固定顏色或大小
p + geom_point(colour = "#5ab4ac", size = 3, alpha = 0.6)
再增加點(diǎn)透明度
增加外框線的寬度,并設(shè)置不同的填充色和邊框顏色
ggplot(mtcars, aes(wt, mpg)) +
geom_point(shape = 21, colour = "#d8b365", fill = "white", size = 5, stroke = 2)
使用多個(gè)大小不同的 geom_point
對(duì)象鱼响,也可以達(dá)到上面的效果
p <- ggplot(mtcars, aes(mpg, wt, shape = factor(cyl)))
p + geom_point(aes(colour = factor(cyl)), size = 4) +
geom_point(colour = "grey90", size = 1.5)
先繪制更大的點(diǎn)鸣剪,然后繪制小的點(diǎn)
再來一個(gè)例子
p + geom_point(colour = "black", size = 4.5) +
geom_point(colour = "pink", size = 4) +
geom_point(aes(shape = factor(cyl)))
由于形狀是在最后設(shè)置的,所以所有的點(diǎn)的形狀都改變了丈积。
再來看看下面一個(gè)有趣的例子
p + geom_point(aes(colour = factor(cyl)), size = 4, shape=1) +
geom_point(aes(shape = factor(cyl)), colour = "#5ab4ac", size = 1.5)
我們第一次繪制了圓形的點(diǎn)筐骇,然后又繪制了三種不同形狀的點(diǎn),組合出來了不同的形狀和顏色
2. geom_jitter
geom_jitter
是 geom_point(position = "jitter")
的快捷函數(shù)江滨,它為每個(gè)點(diǎn)的位置增加了少量的隨機(jī)變化铛纬,能夠處理點(diǎn)相互重疊的問題
例如,對(duì)于分類變量的散點(diǎn)圖
p <- ggplot(mpg, aes(cyl, hwy))
p + geom_point()
看起來似乎只有這么些相互分隔開的點(diǎn)唬滑,讓我們看看下面這張圖
p + geom_jitter()
好像一下子就冒出了很多點(diǎn)了告唆,其實(shí)是由于點(diǎn)的坐標(biāo)值一樣而相互覆蓋,通過使用 geom_jitter
為每個(gè)點(diǎn)添加少量的隨機(jī)變化晶密,盡量避免點(diǎn)之間的重疊問題
設(shè)置較小的 width
或 height
值來側(cè)重于每個(gè)類別
p1 <- ggplot(mpg, aes(cyl, hwy)) + geom_jitter()
p2 <- ggplot(mpg, aes(cyl, hwy)) + geom_jitter(width = 0.25)
plot_grid(p1, p2, labels = LETTERS[1:2], ncol = 2)
設(shè)置較大的 width
或 height
完全消除離散性
p3 <- ggplot(mpg, aes(cty, hwy)) + geom_jitter()
p4 <- ggplot(mpg, aes(cty, hwy)) + geom_jitter(width = 0.5, height = 0.5)
plot_grid(p3, p4, labels = LETTERS[1:2], ncol = 2)
3. geom_count
也是 geom_point()
的一個(gè)變體擒悬,用來計(jì)算每個(gè)位置的觀測(cè)值數(shù)目,然后將該值映射到點(diǎn)區(qū)域惹挟。
當(dāng)你的坐標(biāo)值都是離散的數(shù)據(jù)且有很多重疊的點(diǎn)時(shí)茄螃,它很有用
例如,對(duì)于如下點(diǎn)
ggplot(mpg, aes(cty, hwy)) +
geom_point()
使用 geom_count
繪制時(shí)连锯,將每個(gè)位置的點(diǎn)的數(shù)目映射到點(diǎn)的大小
ggplot(mpg, aes(cty, hwy)) +
geom_count()
最好配合 scale_size_area
一起使用归苍,以確保觀測(cè)值數(shù)目為 0
的點(diǎn)映射的大小為 0
。最小的觀測(cè)數(shù)目的點(diǎn)的大小已經(jīng)很接近 0
了
ggplot(mpg, aes(cty, hwy)) +
geom_count() +
scale_size_area()
那如果我們想要設(shè)置點(diǎn)的大小為觀測(cè)值數(shù)目所占比例运怖,該怎么辦拼弃?
我們知道,geom_count
會(huì)對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)變換摇展,即計(jì)算觀測(cè)值的數(shù)目吻氧,并且會(huì)生成一個(gè)新的名為 prop
的變量,記錄的是某一位置的觀測(cè)值的比例
那我們可以這樣
d <- ggplot(diamonds, aes(x = cut, y = clarity))
d + geom_count(aes(size = after_stat(prop)))
什么?為什么點(diǎn)的大小都是一樣的呢盯孙?
geom_count
設(shè)置大小要起作用鲁森,必須設(shè)置 group
參數(shù)的值
d + geom_count(aes(group = 1, size = after_stat(prop)))
這樣就可以了。
在上面的示例中振惰,我們使用了 after_stat
函數(shù)來引用統(tǒng)計(jì)變換后的變量歌溉,替換之前使用的 ..
包裹變量的方式
或者我們按行/列進(jìn)行分組,使得每行或每列的值之和為 1
d1 <- d + geom_count(aes(size = after_stat(prop), group = cut)) +
scale_size_area(max_size = 10)
d2 <- d + geom_count(aes(size = after_stat(prop), group = clarity)) +
scale_size_area(max_size = 10)
plot_grid(d1, d2, labels = LETTERS[1:2], ncol = 2)
樣式
1. 克利夫蘭點(diǎn)圖
也就是滑珠散點(diǎn)圖骑晶,一般 Y
軸為分類變量
group_by(mpg, manufacturer) %>%
summarise(displ = max(displ)) %>%
ggplot(aes(displ, manufacturer)) +
geom_point(shape = 21, colour = "black", fill="#dd3497", size = 3)
2. 棒棒糖圖
在克利夫蘭點(diǎn)圖的基礎(chǔ)上添加了一條連接 Y
軸的線段痛垛,類似于水平的條形圖,只是將矩形轉(zhuǎn)變?yōu)榱司€條桶蛔,能夠有效較少空間匙头,將重點(diǎn)放在數(shù)據(jù)點(diǎn)上。
group_by(mpg, manufacturer) %>%
summarise(displ = max(displ)) %>%
ggplot(aes(displ, manufacturer)) +
geom_segment(aes(x = 0, xend = displ,
y = manufacturer, yend = manufacturer)) +
geom_point(shape = 21, colour = "black", fill="#dd3497", size = 3)
3. 啞鈴圖
可以看成多組克利夫蘭點(diǎn)圖仔雷,只是使用線段連接兩個(gè)分組數(shù)據(jù)點(diǎn)蹂析。可用于展示:
- 同一時(shí)段內(nèi)兩個(gè)數(shù)據(jù)點(diǎn)的相對(duì)位置(誰多了誰少了)
- 比較兩個(gè)類別變量之間的差別
group_by(mpg, manufacturer, year) %>%
summarise(displ = max(displ)) %>%
ggplot(aes(displ, manufacturer)) +
geom_line(aes(group = manufacturer)) +
geom_point(aes(fill = factor(year)), shape = 21, colour = "black", size = 3)
我們使用 geom_line
來連接兩個(gè)分類點(diǎn)朽寞,從圖中可以很方便的看出 1999
和 2008
之間的差別
4. 殘差分析圖
ggplot(dsamp, aes(carat, price)) +
geom_segment(aes(xend = carat, yend = predicted), alpha = 0.2) +
geom_point(aes(fill = abs_rd, size = abs_rd), shape = 21, colour = "black") +
geom_smooth(method = "lm", se = FALSE, colour = "lightgrey") +
geom_point(aes(y = predicted), shape = 1) +
scale_fill_continuous(low = "#fb9a99", high = "#b2df8a")