R 數(shù)據(jù)可視化 —— ggplot 散點(diǎn)圖

前言

散點(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 之間的形狀才有 colourfill 屬性旺遮。所以當(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_jittergeom_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è)置較小的 widthheight 值來側(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è)置較大的 widthheight 完全消除離散性

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)
克利夫蘭點(diǎn)圖

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)蹂析。可用于展示:

  1. 同一時(shí)段內(nèi)兩個(gè)數(shù)據(jù)點(diǎn)的相對(duì)位置(誰多了誰少了)
  2. 比較兩個(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)朽寞,從圖中可以很方便的看出 19992008 之間的差別

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")
殘差分析圖
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末识窿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脑融,更是在濱河造成了極大的恐慌喻频,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肘迎,死亡現(xiàn)場(chǎng)離奇詭異甥温,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妓布,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門姻蚓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匣沼,你說我怎么就攤上這事狰挡。” “怎么了释涛?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵加叁,是天一觀的道長。 經(jīng)常有香客問我唇撬,道長它匕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任窖认,我火速辦了婚禮豫柬,結(jié)果婚禮上告希,老公的妹妹穿的比我還像新娘。我一直安慰自己烧给,他們只是感情好燕偶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著创夜,像睡著了一般杭跪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驰吓,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音系奉,去河邊找鬼檬贰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缺亮,可吹牛的內(nèi)容都是我干的翁涤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼萌踱,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼葵礼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起并鸵,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤鸳粉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后园担,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體届谈,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年弯汰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艰山。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咏闪,死狀恐怖曙搬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸽嫂,我是刑警寧澤纵装,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站溪胶,受9級(jí)特大地震影響搂擦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哗脖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一瀑踢、第九天 我趴在偏房一處隱蔽的房頂上張望扳还。 院中可真熱鬧,春花似錦橱夭、人聲如沸氨距。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俏让。三九已至,卻和暖如春茬暇,著一層夾襖步出監(jiān)牢的瞬間首昔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔫劣。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像赊颠,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劈彪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容