R語(yǔ)言ggplot2:第五章 工具箱

第5章 工具箱

目錄

  • 5.1 簡(jiǎn)介
  • 5.2 圖層疊加的總體策略
  • 5.3 基本圖形類(lèi)型
  • 5.4 展示數(shù)據(jù)分布
  • 5.5 處理遮蓋問(wèn)題
  • 5.6 曲線(xiàn)圖
  • 5.7 繪制地圖
  • 5.8 揭示不確定性
  • 5.9 統(tǒng)計(jì)摘要
  • 5.10 添加圖形注釋
  • 5.11 含權(quán)數(shù)據(jù)

5.1 簡(jiǎn)介

混合使用ggplot2和qplot來(lái)概述基本的幾何對(duì)象和統(tǒng)計(jì)變換

5.2 圖層疊加的總體策略

圖層由三種用途:

  1. 用以展示數(shù)據(jù)本身
  2. 用以展示數(shù)據(jù)的統(tǒng)計(jì)摘要
  3. 用以添加額外的元數(shù)據(jù)(metadata)右蒲,上下文信息和注解洞拨。
library(ggplot2)

5.3 基本圖形類(lèi)型

面積圖色冀、條形圖坡倔、線(xiàn)條圖母债、散點(diǎn)圖、多邊形骚烧、添加標(biāo)簽血筑、色深圖(水平圖),以下代碼繪制了以上的幾何對(duì)象

df <- data.frame(
  x = c(3, 1, 5),
  y = c(2, 4, 6),
  label = c("a","b","c")
)
p <- ggplot(df, aes(x, y)) + xlab(NULL) + ylab(NULL)
p + geom_point() + labs(title = "geom_point")
p + geom_bar(stat = "identity") + labs(title = "geom_bar(stat = \"identity\")")
p + geom_line() + labs( title = "geom_line")
p + geom_area() + labs(title = "geom_area")
p + geom_path() + labs(title = "geom_path")
p + geom_text(aes(label = label)) + labs(title = "geom_text")
p + geom_tile() + labs(title = "geom_tile")
p + geom_polygon() + labs(title = "geom_polygon")

上面的元素比較簡(jiǎn)單消恍,不再貼圖了岂昭。

5.4 展示數(shù)據(jù)分布

例子:對(duì)于一維連續(xù)分布,最重要的是直方圖(默認(rèn)統(tǒng)計(jì)count)或者是頻率多邊形(默認(rèn)統(tǒng)計(jì)density)。永遠(yuǎn)不要奢望默認(rèn)的參數(shù)可以取得強(qiáng)有力的表現(xiàn)约啊。

這三幅圖均展示了一個(gè)有趣的模式:隨著鉆石質(zhì)量的提高邑遏,分布逐漸左偏移且愈發(fā)對(duì)稱(chēng)。

depth_dist <- ggplot(diamonds, aes(depth)) + xlim(58, 68)
depth_dist +
  geom_histogram(aes(y = ..density..), binwidth = 0.1) +
  facet_grid(cut ~.)
image.png
depth_dist + geom_histogram(aes(fill = cut), binwidth = 0.1, position = "fill")
image.png
depth_dist + geom_freqpoly(aes(y = ..density.., colour = cut), binwidth = 0.1)
image.png

例子:針對(duì)類(lèi)別性或連續(xù)性變量取條件所得到的的箱線(xiàn)圖

library(plyr)
qplot(cut, depth, data = diamonds, geom = "boxplot")
image.png
qplot(carat, depth, data = diamonds, geom = "boxplot", group = round_any(carat, 0.1, floor),xlim = c(0, 3))
image.png

例子:擾動(dòng)點(diǎn)圖通過(guò)在離散型分布上添加隨機(jī)噪聲以避免遮蓋繪制問(wèn)題恰矩,這是一種較為粗糙的方法

qplot(class, cty, data = mpg, geom = "jitter")
image.png
qplot(class, drv, data = mpg, geom = "jitter")
image.png

例子:密度圖记盒,必須是已知潛在的密度分布為平滑、連續(xù)且無(wú)界的時(shí)候使用這種密度圖

qplot(depth, data = diamonds, geom = "density", xlim = c(54, 70))
image.png
qplot(depth, data = diamonds, geom = "density", xlim = c(54, 70), fill = cut, alpha = I(0.2))
image.png

5.5 處理遮蓋問(wèn)題

散點(diǎn)圖是研究?jī)蓚€(gè)連續(xù)變量間關(guān)系的重要工具外傅。但是當(dāng)數(shù)據(jù)量很大時(shí)纪吮,這些點(diǎn)經(jīng)常會(huì)出現(xiàn)重疊現(xiàn)象,從而掩蓋真實(shí)的關(guān)系萎胰。根據(jù)這種圖形得到任何結(jié)論都是值得懷疑的碾盟,這種問(wèn)題被稱(chēng)為遮蓋繪制(overplotting)。

  1. 方法一:小規(guī)模的遮蓋繪制問(wèn)題可以通過(guò)繪制更小的點(diǎn)
df <- data.frame(x = rnorm(2000), y = rnorm(2000))
norm <- ggplot(df, aes(x, y))
norm + geom_point()
image.png
norm + geom_point(shape = 1)
image.png
norm + geom_point(shape = ".") ##點(diǎn)的大小為像素級(jí)
image.png
  1. 方法二:更大數(shù)據(jù)集技竟,調(diào)整透明度, R中最小為1/256
norm + geom_point(colour = "black", alpha = 1/3)
image.png
norm + geom_point(colour = "black", alpha = 1/5)
image.png
norm + geom_point(colour = "black", alpha = 1/10)
image.png
  1. 方法三:在點(diǎn)上增加隨機(jī)擾動(dòng)減輕重疊
td <- ggplot(diamonds, aes(table, depth)) + xlim(50, 70) + ylim(50, 70)
td + geom_point()
td + geom_jitter()
image.png
jit <- position_jitter(width = 0.5)
td + geom_jitter(position = jit)
image.png
td + geom_jitter(position = jit, colour = "black", alpha = 1/10)
image.png
td + geom_jitter(position = jit, colour = "black", alpha = 1/50)
image.png
td + geom_jitter(position = jit, colour = "black", alpha = 1/200)
image.png
  1. 方法四;借鑒二維核密度圖的思想冰肴,分箱統(tǒng)計(jì)其中的數(shù)據(jù),可視化該數(shù)值
d <- ggplot(diamonds, aes(carat, price)) + xlim(1,3) +theme(legend.position = "none")
d + stat_bin2d()
image.png
d + stat_bin2d(bins = 10)
image.png
d + stat_bin2d(binwidth = c(0.02, 200))
image.png
d + stat_binhex()
image.png
d + stat_binhex(bins = 10)
image.png
d + stat_binhex(binwidth = c(0.02, 200))
image.png
  1. 方法五:使用stat_density2d做二維密度估計(jì)榔组,并添加等高線(xiàn)或者是著色瓦片直接顯示密度熙尉,或者是大小院分布密度成比例的點(diǎn)
d <- ggplot(diamonds, aes(carat, price)) + xlim(1, 3) + theme(legend.position = "none")
d + geom_point() + geom_density2d()
image.png
d + stat_density2d(geom = "point", aes(size = ..density..), contour = F) + scale_size_area()
image.png
d + stat_density2d(geom = "tile", aes(fill = ..density..), contour = F) 
image.png
last_plot() + scale_fill_gradient(limits = c(1e-5, 8e-4))
image.png

5.6 曲線(xiàn)圖

常用工具:著色瓦片,等高線(xiàn)圖搓扯,氣泡圖

5.7 繪制地圖

maps包與ggplot2的結(jié)合十分方便检痰,使用地圖的原因,一是為了空間數(shù)據(jù)添加參考輪廓線(xiàn)锨推,一個(gè)是不同區(qū)域填充顏色構(gòu)建等值線(xiàn)圖

添加地圖邊界可以用borders()來(lái)完成攀细,以下是一個(gè)使用實(shí)例。

library(maps)
data(us.cities)
big_cities <- subset(us.cities, pop > 500000)
qplot(long, lat, data = big_cities) +borders("state", size = 0.5)
image.png
tx_cities <- subset(us.cities, country.etc == "TX")
ggplot(tx_cities, aes(long, lat))+
  borders("county", "texas", colour = "grey70") +
  geom_point(colour = "black", alpha = 0.5)
image.png

等值線(xiàn)圖:使用map_data()將地圖數(shù)據(jù)轉(zhuǎn)換為數(shù)據(jù)框爱态,此數(shù)據(jù)框之后可以通過(guò)merge()操作與數(shù)據(jù)融合,最后繪制等值線(xiàn)境钟,如下所示:

library(maps)
states <- map_data("state")
arrests <- USArrests
names(arrests) <- tolower(names(arrests))
arrests$region <- tolower(rownames(USArrests))

choro <- merge(states, arrests, by = "region")
choro <- choro[order(choro$order),]
qplot(long, lat, data = choro, group = group, fill = assault, geom = "polygon")
image.png
qplot(long, lat, data = choro, group = group, fill = assault / murder, geom = "polygon")
image.png

例子:對(duì)地圖數(shù)據(jù)進(jìn)行標(biāo)注

library(plyr)
ia <- map_data("county", "iowa")
mid_range <- function(x) mean(range(x, na.rm = TRUE))
centres <- ddply(ia, .(subregion), colwise(mid_range, .(lat, long)))
ggplot(ia, aes(long, lat))+
  geom_polygon(aes(group = group), fill = NA, colour = "grey60") +
  geom_text(aes(label = subregion), data = centres, size = 2, angle = 45)
image.png

5.8 揭示不確定性

在ggplot中锦担,對(duì)于不確定信息的可視化主要有四種幾何對(duì)象:
連續(xù)型X變量:geom_ribbon(僅展示區(qū)間),geom_smooth(stat = "identity")(同時(shí)展示區(qū)間和中間值)
離散型X變量:geom_errorbar(僅展示區(qū)間)慨削,geom_crossbar(同時(shí)展示區(qū)間和中間值)洞渔;geom_linerange(僅展示區(qū)間),geom_pointrange(同時(shí)展示區(qū)間和中間值)

對(duì)于線(xiàn)性模型缚态,effect包(Fox, 2008)非常適合提取這類(lèi)值磁椒。下面的例子擬合了一個(gè)雙因素含交互效應(yīng)回歸模型,并且展示了如何提取邊際效應(yīng)和條件效應(yīng)玫芦。

d <- subset(diamonds, carat <2.5 & rbinom(nrow(diamonds), 1, 0.2) == 1)
d$lcarat <- log10(d$carat)
d$lprice <- log10(d$price)

#剔除整體的線(xiàn)性趨勢(shì)
detrend <- lm(lprice ~ lcarat, data = d)
d$lprice2 <- resid(detrend)

mod <- lm(lprice2 ~ lcarat*color, data = d)

library(effects)
effectdf <- function(...){
  suppressWarnings(as.data.frame(effect(...)))
}
color <- effectdf("color", mod)
both1 <- effectdf("lcarat:color", mod)

carat <- effectdf("lcarat", mod, default.levels = 50)
both2 <- effectdf("lcarat:color", mod, default.leves = 3)

## 圖 進(jìn)行數(shù)據(jù)變換以移除顯而易見(jiàn)的效應(yīng)浆熔,1為對(duì)x軸和y軸的數(shù)據(jù)均以10對(duì)底的對(duì)數(shù)以剔除非線(xiàn)性, 2 為剔除了主要的線(xiàn)性趨勢(shì)
qplot(lcarat, lprice, data = d, colour = color)
image.png
qplot(lcarat, lprice2, data = d, colour = color)
image.png

## 圖 展示模型估計(jì)結(jié)果中變量color的不確定性桥帆,左圖為color的邊際效應(yīng)医增,有圖則是針對(duì)變量carat的不同水平慎皱,變量color的條件效應(yīng),誤差棒顯示了95%的逐點(diǎn)置信區(qū)間
fplot <- ggplot(mapping = aes(y = fit, ymin = lower, yamx = upper)) +
  ylim(range(both2$lower, both2$upper))
fplot %+% color + aes(x = color) + geom_point() + geom_errorbar(aes(ymin = lower, ymax = upper))
image.png
fplot %+% both2 +
  aes(x = color, colour = lcarat, group = interaction(color, lcarat)) +
  geom_errorbar(aes(ymin = lower, ymax = upper)) +
  geom_line(aes(group = lcarat)) +
  scale_colour_gradient()
image.png

## 圖 展示模型估計(jì)結(jié)果中變量carat的不確定性
fplot %+% carat + aes(x = lcarat) + geom_smooth(stat = "identity", se = TRUE)
image.png
ends <- subset(both1, lcarat == max(lcarat))
fplot %+% both1 + aes(x = lcarat, colour = color)+
  geom_smooth(stat = "identity", se = TRUE) +
  scale_colour_hue() +
  theme(legend.position = "none")+
  geom_text(aes(label = color, x = lcarat +0.02),ends)
image.png

5.9 統(tǒng)計(jì)摘要

stat_summary():對(duì)于每個(gè)x取值叶骨,計(jì)算對(duì)應(yīng)y值的統(tǒng)計(jì)摘要

5.9.1 單獨(dú)的摘要計(jì)算函數(shù)

midm <- function(x) mean(x, trim = 0.5)
m2 + stat_summary(aes(colour = "trimmed"), fun.y = midm, geom = "point") +
stat_summary(aes(colour = "raw"), fun.y = mean, geom = "point") +
scale_colour_hue("Mean")

5.9.2 統(tǒng)一的摘要計(jì)算函數(shù)

fun.data可以支持更復(fù)雜的函數(shù)茫多,比如來(lái)自Hmisc包的摘要計(jì)算函數(shù)。

iqr <- function(x,...) {
qs <- quantile(as.numberic(x), c(0.25,0.75), na.rm = T)
names(qs) <- c("ymin", "ymax")
qs
}
m + stat_summary(fun.data = "iqr", geom = "ribbon")

5.10 添加圖形注解

這些注解僅僅是額外的數(shù)據(jù)而已忽刽。有逐個(gè)添加或者是批量添加兩種方式天揖。

下面的例子:向經(jīng)濟(jì)數(shù)據(jù)中添加有關(guān)美國(guó)總統(tǒng)的信息

繪制原始失業(yè)率曲線(xiàn)

(unemp <- qplot(date, unemploy, data = economics, geom = "line", xlab = "", ylab = "No. unemployed (1000s)"))
image.png
# 添加總統(tǒng)就職時(shí)間豎線(xiàn)
presidential <- presidential[-(1:3),]

yrng <- range(economics$unemploy)
xrng <- range(economics$date)
unemp + geom_vline(aes(xintercept = as.numeric(start)), data = presidential)
image.png
library(scales)
unemp + geom_rect(aes(NULL, NULL, xmin = start, xmax = end, fill = party), ymin = yrng[1], ymax = yrng[2], data = presidential, alpha = 0.2)+
  scale_fill_manual(values = c("blue","red"))
image.png
last_plot() + geom_text(aes(x = start, y = yrng[1],label = name), data = presidential, size = 3, hjust = 0, vjust = 0)
image.png
caption <- paste(strwrap("Unemployment rates in the US have varied a lot over the years", 40), collapse = "\n")
unemp + geom_text(aes(x, y, label = caption), data = data.frame(x = xrng[2], y = yrng[2]), hjust = 1, vjust = 1, size = 4)
image.png
highest <- subset(economics, unemploy == max(unemploy))
unemp + geom_point(data = highest, size = 3, colour = "red", alpha = 0.5)
image.png

5.11 含權(quán)數(shù)據(jù)

例子:使用點(diǎn)的大小來(lái)表達(dá)權(quán)重

qplot(percwhite, percbelowpoverty, data = midwest)
image.png
qplot(percwhite, percbelowpoverty, data = midwest, size = poptotal / 1e6) +
  scale_size_area("Population\n(millions)", breaks = c(0.5, 1, 2, 4))
image.png
qplot(percwhite, percbelowpoverty, data = midwest, size = area) +
  scale_size_area()
image.png

例子:將人口密度作為權(quán)重,觀察白種人比例和貧困線(xiàn)以下人口比例的關(guān)系

lm_smooth <- geom_smooth(method = lm, size = 1)
qplot(percwhite, percbelowpoverty, data = midwest) + lm_smooth
image.png
qplot(percwhite, percbelowpoverty, data = midwest, weight = popdensity, size = popdensity) +lm_smooth

image.png

例子:不含權(quán)重的直方圖展示了郡的數(shù)量跪帝,含權(quán)重信息的直方圖展示了人口數(shù)量

qplot(percbelowpoverty, data = midwest, binwidth = 1)
image.png
qplot(percbelowpoverty, data = midwest, weight = poptotal, binwidth = 1) +ylab("population")
image.png

本章完結(jié)今膊,撒花~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市歉甚,隨后出現(xiàn)的幾起案子万细,更是在濱河造成了極大的恐慌,老刑警劉巖纸泄,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赖钞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡聘裁,警方通過(guò)查閱死者的電腦和手機(jī)雪营,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)衡便,“玉大人献起,你說(shuō)我怎么就攤上這事×蜕拢” “怎么了谴餐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)呆抑。 經(jīng)常有香客問(wèn)我岂嗓,道長(zhǎng),這世上最難降的妖魔是什么鹊碍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任厌殉,我火速辦了婚禮,結(jié)果婚禮上侈咕,老公的妹妹穿的比我還像新娘公罕。我一直安慰自己,他們只是感情好耀销,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布楼眷。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摩桶。 梳的紋絲不亂的頭發(fā)上桥状,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音硝清,去河邊找鬼辅斟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芦拿,可吹牛的內(nèi)容都是我干的士飒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蔗崎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酵幕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缓苛,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芳撒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后未桥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體笔刹,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年冬耿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舌菜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亦镶,死狀恐怖日月,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缤骨,我是刑警寧澤爱咬,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站绊起,受9級(jí)特大地震影響台颠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜勒庄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘫里。 院中可真熱鬧实蔽,春花似錦、人聲如沸谨读。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至铐尚,卻和暖如春拨脉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宣增。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工玫膀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爹脾。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓帖旨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親灵妨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子解阅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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