分析數(shù)據(jù)要做的第一件事情,就是觀察它。對(duì)于每個(gè)變量,哪些值是最常見的?值域是大是???是否有異常觀測(cè)?
ggplot2圖形之基本語法:
ggplot2的核心理念是將繪圖與數(shù)據(jù)分離,數(shù)據(jù)相關(guān)的繪圖與數(shù)據(jù)無關(guān)的繪圖分離 ggplot2是按圖層作圖 ggplot2保有命令式作圖的調(diào)整函數(shù),使其更具靈活性 ggplot2將常見的統(tǒng)計(jì)變換融入到了繪圖中。 ggplot的繪圖有以下幾個(gè)特點(diǎn):第一,有明確的起始(以ggplot函數(shù)開始)與終止(一句語句一幅圖);其二,圖層之間的疊加是靠“+”號(hào)實(shí)現(xiàn)的,越后面其圖層越高。 ggplot圖的元素可以主要可以概括如下:最大的是plot(指整張圖,包括background和title),其次是axis(包括stick,text,title和stick)、legend(包括backgroud、text、title)、facet這是第二層次,其中facet可以分為外部strip部分(包括backgroud和text)和內(nèi)部panel部分(包括backgroud、boder和網(wǎng)格線grid,其中粗的叫g(shù)rid.major,細(xì)的叫g(shù)rid.minor)。 ggplot2里的所有函數(shù)可以分為以下幾類: 用于運(yùn)算(我們?cè)诖瞬恢v,如fortify_,mean_等) 初始化、展示繪圖等命令(ggplot,plot,print等) 按變量組圖(facet_等) 真正的繪圖命令(stat_,geom_,annotate),這三類就是實(shí)現(xiàn)一個(gè)函數(shù)一個(gè)圖層的核心函數(shù)。 微調(diào)圖型:嚴(yán)格意義上說,這一類函數(shù)不是再實(shí)現(xiàn)圖層,而是在做局部調(diào)整。 aes : 同樣適用于修改geom_XXX() aes參數(shù)控制了對(duì)哪些變量進(jìn)行圖形映射,以及映射方式 圖形屬性(aes) 橫縱坐標(biāo)、點(diǎn)的大小、顏色,填充色等
完整公式總結(jié):
ggplot(data = , aes(x = , y = )) + geom_XXX(...) + ... + stat_XXX(...) + ... + annotate(...) + ... + labs(...) + scale_XXX(...) + coord_XXX(...) + guides(...) + theme(...) + facet_XXX(...) #完整ggplot2繪圖示意: library(ggplot2) attach(iris) p <- ggplot(data=iris,aes(x = Sepal.Length,y = Sepal.Width)) p + geom_point(aes(colour = Species)) + stat_smooth() + labs(title = "Iris of Sepal.length \n According to the Sepal.Width") + theme_classic() + theme_bw() +annotate("text",x=7,y=4,parse = T,label = "x[1]==x[2]",size=6, family="serif",fontface="italic", colour="darkred")
geom :表示幾何對(duì)象,它是ggplot中重要的圖層控制對(duì)象,因?yàn)樗?fù)責(zé)圖形渲染的類型。 幾何對(duì)象(geom_) 上面指定的圖形屬性需要呈現(xiàn)在一定的幾何對(duì)象上才能被我們看到,這些承載圖形屬性的對(duì)象可能是點(diǎn),可能是線,可能是bar
stat :統(tǒng)計(jì)變換 比如求均值,求方差等,當(dāng)我們需要展示出某個(gè)變量的某種統(tǒng)計(jì)特征的時(shí)候,需要用到統(tǒng)計(jì)變換
annotate:添加注釋 #由于設(shè)置的文本會(huì)覆蓋原來的圖中對(duì)應(yīng)的位置,可以改變文本的透明度或者顏色 例: annotate(geom='text')會(huì)向圖形添加一個(gè)單獨(dú)的文本對(duì)象 annotate("text",x=23,y=200,parse=T,label = "x[1]==x[2]")
labs : labs(x = "這是 X 軸", y = "這是 Y 軸", title = "這是標(biāo)題") ## 修改文字
scale_: 標(biāo)度是一種函數(shù),它控制了數(shù)學(xué)空間到圖形元素空間的映射。一組連續(xù)數(shù)據(jù)可以映射到X軸坐標(biāo),也可以映射到一組連續(xù)的漸變色彩。一組分類數(shù)據(jù)可以映射成為不同的形狀,也可以映射成為不同的大小,這就是與aes內(nèi)的各種美學(xué)(shape、color、fill、alpha)調(diào)整有關(guān)的函數(shù)。
coord_:調(diào)整坐標(biāo),控制了圖形的坐標(biāo)軸并影響所有圖形元素. 調(diào)整坐標(biāo) coord_flip()來翻轉(zhuǎn)坐標(biāo)軸。使用xlim()和ylim()來設(shè)置連續(xù)型坐標(biāo)軸的最小值和最大值 coord_cartesian(xlim=c(0,100),ylim=c(0,100))
guides:調(diào)整所有的text。
theme:調(diào)整不與數(shù)據(jù)有關(guān)的圖的元素的函數(shù)。theme函數(shù)采用了四個(gè)簡(jiǎn)單地函數(shù)來調(diào)整所有的主題特征:element_text調(diào)整字體,element_line調(diào)整主題內(nèi)的所有線,element_rect調(diào)整所有的塊,element_blank清空。theme(panel.grid =element_blank()) ## 刪去網(wǎng)格線
facet :控制分組繪圖的方法和排列形式 # 不指定數(shù)據(jù)集時(shí),data = NULL 一個(gè)圖形對(duì)象就是一個(gè)包含數(shù)據(jù),映射,圖層,標(biāo)度,坐標(biāo)和分面的列表,外加組件options ggplot(數(shù)據(jù), 映射) geom_xxx(映射, 數(shù)據(jù)) stat_xxx(映射, 數(shù)據(jù))
# 通過“+”實(shí)現(xiàn)不同圖層的相應(yīng)累加,且越往后的圖層表現(xiàn)在上方 點(diǎn)(point, text):往往只有x、y指定位置,有shape但沒有fill 線(line,vline,abline,hline,stat_function等):一般是基于函數(shù)來處理位置 射(segment):特征是指定位置有xend和yend,表示射線方向 面(tile, rect):這類一般有xmax,xmin,ymax,ymin指定位置 棒(boxplot,bin,bar,histogram):往往是二維或一維變量,具有width屬性 帶(ribbon,smooth):透明是特征是透明的fill 補(bǔ):包括rug圖,誤差棒(errorbar,errorbarh) 然后,就是按照你的需要一步步加圖層了(使用“+”)。
*********************
基本語法:
數(shù)據(jù)(data):將要展示的數(shù)據(jù);
映射(mapping):數(shù)據(jù)中的變量到圖形成分的映射;
幾何對(duì)象(geom):用來展示數(shù)據(jù)的幾何對(duì)象,如geom_point,geom_bar,geom_abline;
圖形屬性(aes):圖形屬性決定了圖形的外觀,如字體大小、標(biāo)簽位置及刻度線;
標(biāo)度(scale):決定了變量如何被映射到圖形屬性上;
坐標(biāo)(coordinate):數(shù)據(jù)如何被映射到圖中。如coord_cartesian:笛卡爾坐標(biāo)、coord_polar:極坐標(biāo)、coord_map:地理投影;
統(tǒng)計(jì)變換(stat):對(duì)數(shù)據(jù)進(jìn)行匯總,如箱線圖:stat_boxplot、線圖:stat_abline、直方圖:stat_bin
分面(facet):用來描述數(shù)據(jù)如何被拆分為子集,以及對(duì)不同子集是如何繪制的。
位置調(diào)整(position):對(duì)圖形位置做精細(xì)控制。
創(chuàng)建ggplot對(duì)象:使用ggplot函數(shù):
ggplot(data,mapping=aes(),...,environment=globalenv())
參數(shù) |
描述 |
默認(rèn)值 |
data |
要繪圖的數(shù)據(jù)框 |
|
mapping |
一系列圖形屬性的映射 |
aes() |
environment |
圖形屬性參數(shù)所在的環(huán)境 |
globalenv() |
... |
|
|
幾何對(duì)象:
為了指定圖形類型,必須加入圖層,可采用layer()函數(shù)??梢允褂谩皃oint”等短名稱來指定幾何對(duì)象。layer函數(shù)允許將幾何對(duì)象作為名稱和值的配對(duì),這樣就不需要指出函數(shù)全名,而只需要geom_后面的部分。幾何對(duì)象如下:
幾何對(duì)象函數(shù) |
描述 |
geom_abline |
線圖,由斜率和截距指定 |
geom_area |
面積圖(即連續(xù)的條形圖) |
geom_bar |
條形圖 |
geom_bin2d |
二維封箱的熱圖 |
geom_blank |
空的幾何對(duì)象,什么也不畫 |
geom_boxplot |
箱線圖 |
geom_contour |
等高線圖 |
geom_crossbar |
crossbar圖(類似于箱線圖,但沒有觸須和極值點(diǎn)) |
geom_density |
密度圖 |
geom_density2d |
二維密度圖 |
geom_errorbar |
誤差線(通常添加到其他圖形上,比如柱狀圖、點(diǎn)圖、線圖等) |
geom_errorbarh |
水平誤差線 |
geom_freqpoly |
頻率多邊形(類似于直方圖) |
geom_hex |
六邊形圖(通常用于六邊形封箱) |
geom_histogram |
直方圖 |
geom_hline |
水平線 |
geom_jitter |
點(diǎn)、自動(dòng)添加了擾動(dòng) |
geom_line |
線 |
geom_linerange |
區(qū)間,用豎直線來表示 |
geom_path |
幾何路徑,由一組點(diǎn)按順序連接 |
geom_point |
點(diǎn) |
geom_pointrange |
一條垂直線,線的中間有一個(gè)點(diǎn)(與Crossbar圖和箱線圖相關(guān),可以用來表示線的范圍) |
geom_polygon |
多邊形 |
geom_quantile |
一組分位數(shù)線(來自分位數(shù)回歸) |
geom_rect |
二維的長(zhǎng)方形 |
geom_ribbon |
彩虹圖(在連續(xù)的x值上表示y的范圍,例如Tufte著名的拿破侖遠(yuǎn)征圖) |
geom_rug |
觸須 |
geom_segment |
線段 |
geom_smooth |
平滑的條件均值 |
geom_step |
階梯圖 |
geom_text |
文本 |
geom_tile |
瓦片(即一個(gè)個(gè)的小長(zhǎng)方形或多邊形) |
geom_vline |
豎直線 |
統(tǒng)計(jì)變換
統(tǒng)計(jì)變換函數(shù) |
描述 |
stat_abline |
添加線條,用斜率和截距表示 |
stat_bin |
分割數(shù)據(jù),然后繪制直方圖 |
stat_bin2d |
二維密度圖,用矩陣表示 |
stat_binhex |
二維密度圖,用六邊形表示 |
stat_boxplot |
繪制帶觸須的箱線圖 |
stat_contour |
繪制三維數(shù)據(jù)的等高線圖 |
stat_density |
繪制密度圖 |
stat_density2d |
繪制二維密度圖 |
stat_function |
添加函數(shù)曲線 |
stat_hline |
添加水平線 |
stat_identity |
繪制原始數(shù)據(jù),不進(jìn)行統(tǒng)計(jì)變換 |
stat_qq |
繪制Q-Q圖 |
stat_quantile |
連續(xù)的分位線 |
stat_smooth |
添加平滑曲線 |
stat_spoke |
繪制有方向的數(shù)據(jù)點(diǎn)(由x和y指定位置,angle指定角度) |
stat_sum |
繪制不重復(fù)的取值之和(通常用在三點(diǎn)圖上) |
stat_summary |
繪制匯總數(shù)據(jù) |
stat_unique |
繪制不同的數(shù)值,去掉重復(fù)的數(shù)值 |
stat_vline |
繪制豎直線 |
標(biāo)度函數(shù)
標(biāo)度函數(shù) |
描述 |
scale_alpha |
alpha通道值(灰度) |
scale_brewer |
調(diào)色板,來自colorbrewer.org網(wǎng)站展示的顏色標(biāo)度 |
scale_continuous |
連續(xù)標(biāo)度 |
scale_data |
日期 |
scale_datetime |
日期和時(shí)間 |
scale_discrete |
離散值 |
scale_gradient |
兩種顏色構(gòu)建的漸變色 |
scale_gradient2 |
3中顏色構(gòu)建的漸變色 |
scale_gradientn |
n種顏色構(gòu)建的漸變色 |
scale_grey |
灰度顏色 |
scale_hue |
均勻色調(diào) |
scale_identity |
直接使用指定的取值,不進(jìn)行標(biāo)度轉(zhuǎn)換 |
scale_linetype |
用線條模式來展示不同 |
scale_manual |
手動(dòng)指定離散標(biāo)度 |
scale_shape |
用不同的形狀來展示不同的數(shù)值 |
scale_size |
用不同大小的對(duì)象來展示不同的數(shù)值 |
坐標(biāo)系
坐標(biāo)函數(shù) |
描述 |
coord_cartesian |
笛卡兒坐標(biāo) |
coord_equal |
等尺度坐標(biāo)(斜率為1) |
coord_flip |
翻轉(zhuǎn)笛卡兒坐標(biāo) |
coord_map |
地圖投影 |
coord_polar |
極坐標(biāo)投影 |
coord_trans |
變換笛卡兒坐標(biāo) |
分面
分面函數(shù) |
描述 |
facet_grid |
將分面放置在二維網(wǎng)格中 |
facet_wrap |
將一維的分面按二維排列 |
位置
定位函數(shù) |
描述 |
position_dodge |
并列 |
position_fill |
填充 |
position_identity |
不對(duì)位置進(jìn)行處理 |
position_jitter |
擾動(dòng)處理 |
position_stack |
堆疊處理 |
Chap1. R 基礎(chǔ)
## 加載文件
- 默認(rèn)情況下,數(shù)據(jù)集中的字符串(String)會(huì)被視為因子(Factor)處理,此時(shí)可以設(shè)置
stringAsFactors = FALSE ,將文本變量視為字符串表示。
- 讀取xlsx和xls文件:package
xlsx (Java)和gdata (Perl)
foreign :read.spss;read.octave;read.systat;read.xport;read.dta
Chap2. 快速探索數(shù)據(jù)(略)
## 概述 qplot() 函數(shù)的語法與基礎(chǔ)繪圖系統(tǒng)類似,簡(jiǎn)短易輸入,通常用于探索性數(shù)據(jù)分析。qplot(x,y,data,geom=c(xx,xx))
條形圖
barplot() 第一個(gè)向量用來設(shè)定條形的高度,第二個(gè)向量用來設(shè)定每個(gè)條形對(duì)應(yīng)的標(biāo)簽(可選)。
變量值條形圖 : 兩個(gè)輸入變量,x為分類變量,y表示變量值
頻數(shù)條形圖 :一個(gè)輸入變量,需要注意連續(xù)x軸和離散x軸的差異。
直方圖
與條形圖不同的地方在于,x為連續(xù)型變量
箱線圖
- 需要傳遞兩個(gè)向量:x和y
- 在x軸上引入兩變量的交互:
interaction()
- Question:基礎(chǔ)繪圖系統(tǒng)和ggplot2的箱線圖略有不同。
繪制函數(shù)圖像
ggplot(data.frame(x=c(0,20)), aes(x=x)) + stat_function(fun=myfun, geom = "line")
Chap3. 條形圖
重要細(xì)節(jié):條形圖的高度表示的是數(shù)據(jù)集中變量的頻數(shù),還是表示變量取值本身
## 概述 條形圖通常用來展示不同的分類下(x軸)某個(gè)數(shù)值型變量的取值(y軸),其條形高度既可以表示數(shù)據(jù)集中變量的頻數(shù),也可以表示變量取值本身。
參數(shù)
fill :改變條形圖的填充色;colour :添加邊框線;position :改變條形圖的類型;linetype :線型
scale_fill_brewer() 和scale_fill_manual() 設(shè)置顏色
scale_fill_brewer(palette="Pastell")
條形圖
- 頻數(shù)條形圖:只需要一個(gè)輸入變量,當(dāng)變量為連續(xù)型變量時(shí),等價(jià)于直方圖。
- 顏色映射在
aes() 內(nèi)部完成,而顏色的重新設(shè)定在aes() 外部完成。
- 排序:
ggplot(upc, aes=(x=reorder(Abb, Change)), y =Change, fill = Region)
- 正負(fù)條形圖著色:首先,創(chuàng)建一個(gè)對(duì)取值正負(fù)情況進(jìn)行標(biāo)示的變量,然后參數(shù)設(shè)定為
position='identity' ,這可以避免系統(tǒng)因?qū)ω?fù)值繪制堆積條形而發(fā)出的警告信息。
guide=FALSE 刪除圖例
width 調(diào)整條形圖的條形寬度;position_dodge(0.7) 調(diào)整條形間距(中心距離)
- 堆積條形圖:
geom_bar(stat='identity') 默認(rèn)情況
- 更改圖例顏色順序:
guides(fill = guide_legend(reverse=TRUE))
- 調(diào)用調(diào)色板
scale_fill_brewer(palette='Pastell') 和手動(dòng):scale_fill_manual()
- 百分比堆積圖:首先利用plyr包種的ddply()轉(zhuǎn)化數(shù)據(jù),然后再繪圖.
- 添加 數(shù)據(jù)標(biāo)簽:
geom_text(aes(y = label_y, label=Weight),vjust=xxx) 其中y用來控制標(biāo)簽的位置
- 繪制Cleveland點(diǎn)圖:通常都會(huì)設(shè)置成根據(jù)x軸對(duì)應(yīng)的連續(xù)變量的大小取值對(duì)數(shù)據(jù)進(jìn)行排序。
reorder(x,y) :先將x轉(zhuǎn)化為因子,然后根據(jù)y對(duì)其進(jìn)行排序。
- 主題系統(tǒng)(Theming System):
theme(panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())
匯總好的數(shù)據(jù)集繪制條形圖:
x <- c('A','B','C','D','E')
y <- c(13,22,16,31,8)
df <- data.frame(x= x, y = y)
ggplot(data = df, mapping = aes(x = x, y = y)) + geom_bar(stat= 'identity')
對(duì)于條形圖的y軸就是數(shù)據(jù)框中原本的數(shù)值時(shí),必須將geom_bar()函數(shù)中stat(統(tǒng)計(jì)轉(zhuǎn)換)參數(shù)設(shè)置為’identity’,即對(duì)原始數(shù)據(jù)集不作任何統(tǒng)計(jì)變換,而該參數(shù)的默認(rèn)值為’count’,即觀測(cè)數(shù)量。
使用明細(xì)數(shù)據(jù)集繪制條形圖:
-
set.seed(1234) x <- sample(c('A','B','C','D'), size = 1000, replace= TRUE, prob = c(0.2,0.3,0.3,0.2)) y <- rnorm(1000) * 1000 df = data.frame(x= x, y = y) ggplot(data = x = x, mapping = aes(x = factor(x), y = ..count..))+ geom_bar(stat = 'count')
數(shù)據(jù)集本身是明細(xì)數(shù)據(jù),而對(duì)于統(tǒng)計(jì)某個(gè)離散變量出現(xiàn)的頻次時(shí),geom_bar()函數(shù)中stat(統(tǒng)計(jì)轉(zhuǎn)換)參數(shù)只能設(shè)置為默認(rèn),即’count’。
當(dāng)然,如果需要對(duì)明細(xì)數(shù)據(jù)中的某個(gè)離散變量進(jìn)行聚合(均值、求和、最大、最小、方差等)后再繪制條形圖的話,建議先使用dplyr包中的group_by()函數(shù)和summarize()函數(shù)實(shí)現(xiàn)數(shù)據(jù)匯總,具體可參見:
http://mp.weixin.qq.com/s?__biz=MzIxNjA2ODUzNg==&mid=402687811&idx=1&sn=fb4ada05aef7bf34b9fc35f97221d55f#rd
從x軸的數(shù)據(jù)類型來看:有字符型的x值也有數(shù)值型的x值
上面的兩幅圖對(duì)應(yīng)的x軸均為離散的字符型值,如果x值是數(shù)值型時(shí),該如何正確繪制條形圖?
set.seed(1234)
x <- sample(c(1,2,4,6,7), size = 1000, replace = TRUE,prob = c(0.1,0.2,0.2,0.3,0.2))
ggplot(data = data.frame(x = x), mapping= aes(x = x, y = ..count..)) + geom_bar(stat = 'count')
如果直接使用數(shù)值型變量作為條形圖的x軸,我們會(huì)發(fā)現(xiàn)條形圖之間產(chǎn)生空缺,這個(gè)空缺其實(shí)對(duì)應(yīng)的是3和5兩個(gè)值,這樣的圖形并不美觀。為了能夠使條形圖之間不存在類似的空缺,需要將數(shù)值型的x轉(zhuǎn)換為因子,即factor(x),如下圖所示:
ggplot(data = data.frame(x = x), mapping = aes(x = factor(x), y = ..count..))+ geom_bar(stat = 'count')
上面幾幅圖的顏色均為灰色的,顯得并不是那么亮眼,為了使顏色更加豐富多彩,可以在geom_bar()函數(shù)內(nèi)通過fill參數(shù)可colour參數(shù)設(shè)置條形圖的填充色和邊框色,例如:
ggplot(data = data.frame(x = x), mapping = aes(x = factor(x), y = ..count..))+ geom_bar(stat = 'count', fill = 'steelblue', colour = 'darkred')
關(guān)于顏色的選擇可以在R控制臺(tái)中輸入colours(),將返回657種顏色的字符。如果想查看所有含紅色的顏色值,可以輸入colours()[grep(‘red’, colours())]返回27種紅色。
繪制簇條形圖
以上繪制的條形圖均是基于一個(gè)離散變量作為x軸,如果想繪制兩個(gè)離散變量的條形圖即簇條形圖該如何處理呢?具體見下方例子:
x <- rep(1:5, each = 3)
y <- rep(c('A','B','C'),times = 5)
set.seed(1234)
z <- round(runif(min = 10, max = 20, n = 15)) df <- data.frame(x= x, y = y, z = z)
ggplot(data = df, mapping = aes(x = factor(x), y = z,fill = y)) + geom_bar(stat = 'identity', position = 'dodge')
對(duì)于簇條形圖只需在ggplot()函數(shù)的aes()參數(shù)中將其他離散變量賦給fill參數(shù)即可。這里的position參數(shù)表示條形圖的擺放形式,默認(rèn)為堆疊式(stack),還可以是百分比的堆疊式。下面分別設(shè)置這兩種參數(shù),查看一下條形圖的擺放形式。
堆疊式:
ggplot(data = df, mapping = aes(x = factor(x), y = z, fill = y)) + geom_bar(stat= 'identity', position = 'stack')
發(fā)現(xiàn)一個(gè)問題,條形圖的堆疊順序(A,B,C)與圖例順序(C,B,A)恰好相反,這個(gè)問題該如何處理呢?很簡(jiǎn)單,只需再添加guides()函數(shù)進(jìn)行設(shè)置即可,如下所示:
ggplot(data = df, mapping = aes(x = factor(x), y = z, fill = y)) + geom_bar(stat= 'identity', position = 'stack') + guides(fill = guide_legend(reverse= TRUE))
guides()函數(shù)將圖例引到fill屬性中,再使圖例反轉(zhuǎn)即可。
百分比堆疊式:
ggplot(data = df, mapping = aes(x = factor(x), y = z, fill = y)) + geom_bar(stat= 'identity', position = 'fill')
顏色配置:
同樣,如果覺得R自動(dòng)配置的填充色不好看,還可以根據(jù)自定義的形式更改條形圖的填充色,具體使用scale_fill_brewer()和scale_fill_manual()函數(shù)進(jìn)行顏色設(shè)置。
scale_fill_brewer()函數(shù)使用R自帶的ColorBrewer畫板
ggplot(data = df, mapping = aes(x = factor(x), y = z, fill = y)) + geom_bar(stat= 'identity', position = 'dodge') + scale_fill_brewer(palette = 'Accent')
具體的調(diào)色板顏色可以查看scale_fill_brewer()函數(shù)的幫助。
scale_fill_manual()函數(shù)允許用戶給指定的分類水平設(shè)置響應(yīng)的色彩,個(gè)人覺得這個(gè)比較方便
col <- c('darkred','skyblue','purple')
ggplot(data = df, mapping =aes(x = factor(x), y = z, fill = y)) + geom_bar(stat = 'identity', colour= 'black', position = 'dodge') + scale_fill_manual(values = col, limits= c('B','C','A')) + xlab('x')
a <- ggplot(mpg, aes(x=hwy))
a + stat_bin(aes(fill=..count.., color=-1*..ndensity..), binwidth = 1)
統(tǒng)計(jì)方法有輸入,有輸出。通常輸入為x和y。輸出值會(huì)以例的形式追加到當(dāng)前操作的數(shù)據(jù)拷貝中。比如上例中的stat_bin函數(shù),就會(huì)生成四列新數(shù)據(jù),分別為count, density, ncount以及ndensity。在訪問這些新列的時(shí)候,使用..name..的方式。
該如何繪制有序的條形圖?
#不經(jīng)排序的條形圖,默認(rèn)按x值的順序產(chǎn)生條形圖
x <- c('A','B','C','D','E','F','G')
y <-c('xx','yy','yy','xx','xx','xx','yy')
z <- c(10,33,12,9,16,23,11)
df<- data.frame(x = x, y = y, z = z)
ggplot(data = df, mapping = aes(x= x, y = z, fill = y)) + geom_bar(stat = 'identity')
按z值的大小,重新排列條形圖的順序,只需將aes()中x的屬性用reorder()函數(shù)更改即可。
ggplot(data = df, mapping = aes(x = reorder(x, z), y = z, fill = y)) +geom_bar(stat = 'identity') + xlab('x')
關(guān)于條形圖的微調(diào)
如何y軸的正負(fù)值區(qū)分開來,并去除圖例
-
set.seed(12) x <- 1980 + 1:35 y <- round(100*rnorm(35)) df <- data.frame(x = x,y = y) # 判斷y是否為正值 df <- transform(df,judge = ifelse(y>0,"YES","NO")) # 去除圖例用theme()主題函數(shù) ggplot(df,aes(x = x,y = y,fill = judge))+ geom_bar(stat = "identity")+ theme(legend.position= "")+ xlab("Year")+ scale_fill_manual(values = c("darkred","blue"))
stat參數(shù)和position參數(shù)均設(shè)置為identity,目的是圖形繪制不要求對(duì)原始數(shù)據(jù)做任何的變換,包括統(tǒng)計(jì)變換和圖形變換,排除圖例可以通過scale_fill_manual()函數(shù)將參數(shù)guide設(shè)置為FALSE,同時(shí)該函數(shù)還可以自定義填充色,一舉兩得。
ggplot(data = df, mapping = aes(x = x, y = y, fill = judge))+ geom_bar(stat = 'identity', position = 'identity')+ scale_fill_manual(values = c('blue','red'), guide = FALSE)+ xlab('Year')
調(diào)整條形圖的條形寬度和條形間距
geom_bar()函數(shù)可以非常靈活的將條形圖的條形寬度進(jìn)行變寬或變窄設(shè)置,具體通過函數(shù)的width參數(shù)實(shí)現(xiàn),width的最大值為1,默認(rèn)為0.9。
x <- c("A","B","C","D","E") y <- c(10,20,15,22,18) df <- data.frame(x = x,y = y) # 不作任何條形寬度的調(diào)整 ggplot(df,aes(x = x,y = y))+ geom_bar(stat = "identity",fill = "steelblue",colour = "black")
# 使條形寬度變寬 ggplot(df,aes(x = x,y = y))+geom_bar(stat = "identity",fill = "steelblue",colour = "black",width = 1)
對(duì)于簇條形圖來說,還可以調(diào)整條形之間的距離,默認(rèn)情況下,條形圖的組內(nèi)條形間隔為0,具體可通過函數(shù)的position_dodge參數(shù)實(shí)現(xiàn)條形距離的調(diào)整,為了美觀,一般將條形距離設(shè)置的比條形寬度大一點(diǎn)。
-
x <- rep(1:5,each = 3) y <- rep(c("A","B","C"),times = 5) set.seed(12) z <- round(runif(min = 10,max = 20,n = 15)) df <- data.frame(x = x,y = y,z = z) # 不做任何條形寬度和條形距離的調(diào)整 ggplot(df,aes(x = factor(x),y = z,fill = y))+ geom_bar(stat = "identity",position = "dodge")
調(diào)整條形寬度和條形距離
ggplot(data = df, mapping = aes(x = factor(x), y = z, fill = y)) + geom_bar(stat= 'identity', width = 0.5, position = position_dodge(0.7))
添加數(shù)據(jù)標(biāo)簽
geom_text()函數(shù)可以方便的在圖形中添加數(shù)值標(biāo)簽,具體微調(diào)從幾個(gè)案例開始:
-
# 添加標(biāo)簽 ggplot(df,aes(x = interaction(x,y),y = z,fill = y))+ geom_bar(stat = "identity")+ geom_text(aes(label = z))
除此之外,還可以調(diào)整標(biāo)簽的大小、顏色、位置等。
ggplot(data = df, mapping = aes(x = interaction(x,y), y = z, fill = y))+ geom_bar(stat = 'identity') + ylim(0,max(z)+1) + geom_text(mapping =aes(label = z), size = 8, colour = 'orange', vjust = 1)
ylim設(shè)置條形圖中y軸的范圍;size調(diào)整標(biāo)簽字體大小,默認(rèn)值為5號(hào);colour更換標(biāo)簽顏色;vjust調(diào)整標(biāo)簽位置,1為分界線,越大于1,標(biāo)簽越在條形圖上界下方,反之則越在條形圖上上界上方。
# vjust 調(diào)整標(biāo)簽豎直位置,越大,標(biāo)簽越在條形圖的上界下方;0.5時(shí),則在中間。 # hjust 調(diào)整標(biāo)簽水平位置,越大,標(biāo)簽越在條形圖的上界左邊;0.5時(shí),則在中間。
對(duì)于水平交錯(cuò)的簇條形圖,必須通過geom_text()函數(shù)中的position_dodge()參數(shù)來調(diào)整標(biāo)簽位置,hjust=0.5將標(biāo)簽水平居中放置。
ggplot(data = df, mapping = aes(x = x, y = z, fill = y)) + geom_bar(stat
= 'identity', position = 'dodge') + geom_text(mapping = aes(label = z),
size = 5, colour = 'black', vjust = 1, hjust = .5, position = position_dodge(0.9))
這里的圖形位置與標(biāo)簽位置擺放必須一致,即圖形位置geom_bar()函數(shù)中的position = 'dodge'參數(shù),標(biāo)簽位置geom_text()函數(shù)中的position = position_dodge(0.9)參數(shù)。
對(duì)于堆疊的簇條形圖,必須通過geom_text()函數(shù)中的position_stack()參數(shù)來調(diào)整標(biāo)簽位置,hjust將標(biāo)簽水平居中放置。
ggplot(data = df, mapping = aes(x = x, y = z, fill = y)) + geom_bar(stat
= 'identity', position = 'stack') + geom_text(mapping = aes(label = z),
size = 5, colour = 'black', vjust = 3.5, hjust = .5, position = position_stack())
這里的圖形位置與標(biāo)簽位置擺放必須一致,即圖形位置geom_bar()函數(shù)中的position = 'stack'參數(shù),標(biāo)簽位置geom_text()函數(shù)中的position = position_stack()參數(shù)。
補(bǔ)充:統(tǒng)計(jì)變換 若x軸變量為連續(xù)的,則用sta = bin; 若離散型的,可用stat = “count”或stat = “identity”
參考資料
R數(shù)據(jù)可視化手冊(cè)
R語言_ggplot2:數(shù)據(jù)分析與圖形藝術(shù)
Chap4. 折線圖
概述
折線圖可以反映某種現(xiàn)象的趨勢(shì)。通常折線圖的橫坐標(biāo)是時(shí)間變量,縱坐標(biāo)則是一般的數(shù)值型變量。當(dāng)然,折線圖也允許橫縱坐標(biāo)為離散型和數(shù)值型。
折線圖通常用來對(duì)兩個(gè)連續(xù)變量之間的相互依存關(guān)系進(jìn)行可視化。其中x也可以是因子型變量。
簡(jiǎn)單折線圖
- 對(duì)于因子型變量,必須使用
aes(group=1) 以確保ggplot() 知道這些數(shù)據(jù)點(diǎn)屬于同一個(gè)分組,從而應(yīng)該用一條折線連在一起。
- 數(shù)據(jù)標(biāo)記相互重疊:需要相應(yīng)地左移或者右移連接線以避免點(diǎn)線偏離。
geom_line(position=position_dodge(0.2))
- 參數(shù):線型(linetype),線寬(size),顏色(colour):邊框線
- 在
aes() 函數(shù)外部設(shè)定顏色、線寬、線型和點(diǎn)型等參數(shù)會(huì)將所有目標(biāo)對(duì)象設(shè)定為同樣的參數(shù)值。
- 面積圖:
geom_area() ,alpha調(diào)節(jié)透明度
- 堆積面積圖:
geom_area() 基礎(chǔ)上,映射一個(gè)因子型比那里給填充色(fill)即可
- 添加置信域:
geom_ribbon() ,然后分貝映射一個(gè)變量給ymin和ymax。geom_ribbon(aes(ymin=xx,ymax=xx), alpha = 0.2)
一、繪制單條折線圖
library(ggplot2) library(lubridate) #處理日期時(shí)間相關(guān)的R包,非常有用,強(qiáng)烈推薦 Year <- year(seq(from = as.Date('2006-01-01'), to = as.Date('2015-01-01'), by = 'year')) Weight <- c(23,35,43,57,60,62,63,66,61,62) df <- data.frame(Year = Year, Weight = Weight) ggplot(data = df, mapping = aes(x = factor(Year), y = Weight, group = 1)) + geom_line() + xlab('Year')
有關(guān)離散變量的折線圖
type <- c('A','B','C','D','E') quanlity <- c(1,1.1,2.1,1.5,1.7) df <- data.frame(type = type, quanlity = quanlity) ggplot(data = df, mapping = aes(x = type, y = quanlity, group = 1)) + geom_line()
有關(guān)連續(xù)變量的折線圖
set.seed(1234)
times <- 1:15
value <- runif(15,min = 5,max = 15)
df <- data.frame(times = times, value = value)
ggplot(data = df, mapping = aes(x = times, y = value)) + geom_line()
善于發(fā)現(xiàn)的你,可能會(huì)注意到上面三段代碼有一個(gè)重要的不同之處,那就是第一段和第二段代碼中含有‘group = 1’的設(shè)置。這樣做是因?yàn)闄M坐標(biāo)的屬性設(shè)置為了因子,即將連續(xù)型的年份和離散型的字符轉(zhuǎn)換為因子,如果不添加‘group = 1’這樣的條件,繪圖將會(huì)報(bào)錯(cuò)。故務(wù)必需要記住這里的易犯錯(cuò)誤的點(diǎn)!
往折線圖中添加標(biāo)記(點(diǎn)) 當(dāng)數(shù)據(jù)點(diǎn)密度比較小或采集分布(間隔)不均勻時(shí),為折線圖做上標(biāo)記將會(huì)產(chǎn)生非常好的效果。處理的方法非常簡(jiǎn)單,只需在折線圖的基礎(chǔ)上再加上geom_point()函數(shù)即可。
set.seed(1234)
year <- c(1990,1995,2000,2003,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015)
value <- runif(15, min = 10, max = 50)
df <- data.frame(year = year, value = vlaue)
ggplot(data = df, mapping = aes(x = year, y = value)) + geom_line() + geom_point()
從圖中就可以非常明顯的看出,剛開始采集的點(diǎn)分布非常散,而后面采集的點(diǎn)就比較密集,這也有助于對(duì)圖的理解和應(yīng)用。
二、繪制多條折線圖 上面繪制的都是單條這折線圖,對(duì)于兩個(gè)或兩個(gè)以上的折線圖該如何繪制呢?也很簡(jiǎn)單,只需將其他離散變量賦給諸如colour(線條顏色)和linetype(線條形狀)的屬性即可,具體參見下文例子。
基于顏色的多條折線圖
set.seed(1234) year <- rep(1990:2015, times = 2) type <- rep(c('A','B'),each = 26) value <- c(runif(26),runif(26, min = 1,max = 1.5)) df <- data.frame(year = year, type = type, value = value) ggplot(data = df, mapping = aes(x = year, y = value, colour = type)) + geom_line()
基于形狀的多條折線圖
ggplot(data = df, mapping = aes(x = year, y = value, linetype= type)) + geom_line()
同樣需要注意的是,在繪制多條折線圖時(shí),如果橫坐標(biāo)為因子,必須還得加上‘group=分組變量’的參數(shù),否則報(bào)錯(cuò)或繪制出錯(cuò)誤的圖形。
以上繪制的折線圖,均采用默認(rèn)格式,不論是顏色、形狀、大小還是透明度,均沒有給出自定義的格式。其實(shí)ggplot2包也是允許用戶根據(jù)自己的想法設(shè)置這些屬性的。
自定義線條或點(diǎn)的顏色—scale_color_manual()
自定義線條類型—scale_linetype_manual()
自定義點(diǎn)的形狀—scale_shape__manual()
自定義點(diǎn)的大小或線條的寬度—scale_size__manual()
自定義透明度—scale_alpha__manual()
綜合的例子:
ggplot(data = df, mapping = aes(x = year, y = value, linetype = type, colour = type, shape = type, fill = type))
+ geom_line() + geom_point() #繪制線圖和點(diǎn)圖
+ scale_linetype_manual(values = c(1,2)) #自定義線條類型
+ scale_color_manual(values = c('steelblue','darkred')) #自定義顏色
+ scale_shape_manual(values = c(21,23)) #自定義點(diǎn)形狀
+ scale_fill_manual(values = c('red','black')) #自定義點(diǎn)的填充色
雖然這幅圖畫的優(yōu)點(diǎn)夸張,目的是想說明可以通過自定義的方式,想怎么改就可以怎么改。前提是aes()屬性的內(nèi)容與自定義的內(nèi)容對(duì)應(yīng)上。
三、繪制堆積面積圖
繪制堆疊的面積圖只需要geom_area()函數(shù)再加上一個(gè)離散變量映射到fill就可以輕松實(shí)現(xiàn),先忙咱小試牛刀一下。
set.seed(1234) year <- rep(1990:2015, times = 2) type <- rep(c('A','B'),each = 26) value <- c(runif(26),runif(26, min = 1,max = 1.5)) df <- data.frame(year = year, type = type, value = value) ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area()
一幅堆疊的面積圖就輕松繪制成功,但我們發(fā)現(xiàn),堆疊的順序與圖例的順序恰好相反,不用急,只需要加一句命令即可:
ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area() + guides(fill = guide_legend(reverse = TRUE))
如果需要為每一塊面積圖的頂部加上一條直線,可以通過如下兩種方式:
ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(colour = 'black', size =1, alpha = .7) + guides(fill = guide_legend(reverse = TRUE))
其中,colour設(shè)置面積圖邊框的顏色;size設(shè)置邊框線的粗細(xì);alpha設(shè)置面積圖和邊框線的透明度。
ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(alpha = 0.6) + geom_line(colour = 'black', size = 1, position = 'stack', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))
該方法是通過添加堆疊線條(必須設(shè)置geom_line()中position參數(shù)為‘stack’,否則只是添加了兩條線,無法與面積圖的頂部重合)。這兩幅圖的區(qū)別在于第二種方式?jīng)]有繪制面積圖左右邊框和底邊框。在實(shí)際應(yīng)用中,建議不要在面積圖中繪制邊框線,因?yàn)檫吙虻拇嬖诳赡墚a(chǎn)生誤導(dǎo)。
四、繪制百分比堆積面積圖
在面積圖中,也可以方便快捷的繪制出百分比堆積面積圖,具體操作如下:
set.seed(1234) year <- rep(1990:2015, times = 4) type <- rep(c('A','B','C','D'),each = 26) value <- c(runif(26),runif(26, min = 1,max = 1.5), runif(26, min = 1.5,max = 2), runif(26, min = 2,max = 2.5)) df <- data.frame(year = year, type = type, value = value) ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(position = 'fill', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))
但通過這種方式(設(shè)置面積圖的positon='fill')存在一點(diǎn)點(diǎn)小缺陷,即無法繪制出百分比堆積面積圖頂部的線條,該如何實(shí)現(xiàn)呢?這里只需要對(duì)原始數(shù)據(jù)集做一步匯總工作,讓后按部就班的繪制面積圖即可。
library(dplyr)
df_by_type <- group_by(.data = df, year)
df_summarize <- mutate(.data = df_by_type, value2 = value/sum(value))
有關(guān)dplyr包的用法可參考:
強(qiáng)大的dplyr包實(shí)現(xiàn)數(shù)據(jù)預(yù)處理
ggplot(data = df_summarize, mapping = aes(x = year, y = value2, fill = type)) + geom_area(alpha = 0.6) + geom_line(colour = 'black', size = 1, position = 'stack', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))
哈哈,大功告成,就這么簡(jiǎn)單。
Chap5. 散點(diǎn)圖
概述
散點(diǎn)圖通常用來刻畫兩個(gè)連續(xù)型變量之間的關(guān)系。
散點(diǎn)圖
- 參數(shù)值:
shape() ,size=2 ,colour()
- 更改配色與點(diǎn)形:
scale_colour/shape_brewer/manual()
- 盡量將不需要高精度的變量映射給圖形的大小和顏色屬性。
- 調(diào)用
scale_size_area() 函數(shù)使數(shù)據(jù)點(diǎn)的面積正比于變量值。
- 處理圖形重疊問題(overplotting):
- 使用半透明的點(diǎn)
- 將數(shù)據(jù)分箱(bin),并用矩形表示(適用于量化分析)
stat_bin2d()
- 將數(shù)據(jù)分箱(bin),并用六邊形表示
stat_binhex (packages:”hexbin”)
- 使用箱線圖
- 離散x:調(diào)用
geom_point(position_jitter()) 函數(shù)給數(shù)據(jù)點(diǎn)增加隨機(jī)擾動(dòng)。
- 添加回歸模型擬合線:
stat_smooth(method=lm,level=0.95)
- 添加自己構(gòu)建的模型擬合線:
geom_line(data=predicted,size=1)
dlply() 和ldply() 函數(shù):切分?jǐn)?shù)據(jù),對(duì)各個(gè)部分執(zhí)行某一函數(shù),并對(duì)執(zhí)行結(jié)果進(jìn)行重組。
- 散點(diǎn)圖中添加模型系數(shù):
+ annotate(parse = TRUE) 函數(shù)添加文本。利用expression() 檢驗(yàn)輸出結(jié)果
- 添加邊際地毯(Marginal rugs):
geom_rug()
- 添加標(biāo)簽:
geom_text(aes(label=xxx),size=xx,x=xx+0.1)
vjust=1 :標(biāo)簽文本的頂部與數(shù)據(jù)點(diǎn)對(duì)齊
vjust=0 :標(biāo)簽文本的底部與數(shù)據(jù)點(diǎn)對(duì)齊
hjust=1/0 :右對(duì)齊/左對(duì)齊
- 通常先設(shè)定
hjust() 和vjust() 的值為0或1,然后再調(diào)整x或y的值來調(diào)整文本標(biāo)簽的位置.
- 對(duì)數(shù)坐標(biāo)軸:需令x或者y乘以一個(gè)數(shù)值才可以。
- 去掉不需要的標(biāo)簽:將不需要刻畫出來的標(biāo)簽賦值為
NA
- 繪制氣泡圖:
geom_point() 和scale_size_area(max_size=15)
- 散點(diǎn)圖矩陣:base基礎(chǔ)繪圖系統(tǒng),
pairs()
散點(diǎn)圖通常用來刻畫兩個(gè)連續(xù)型變量之間的關(guān)系,數(shù)據(jù)集中的每一條觀測(cè)都由散點(diǎn)圖中的一個(gè)點(diǎn)來表示。在散點(diǎn)圖中也可以加入一些直線或曲線,用來表示基于統(tǒng)計(jì)模型的擬合。當(dāng)數(shù)據(jù)集記錄很多時(shí),散點(diǎn)圖可能會(huì)彼此重疊,這種情況往往需要一些預(yù)處理操作。
1 基本散點(diǎn)圖
散點(diǎn)圖可以用來描述兩個(gè)連續(xù)變量之間的關(guān)系,一般在做數(shù)據(jù)探索分析時(shí)會(huì)使用到,通過散點(diǎn)圖發(fā)現(xiàn)變量之間的相關(guān)性強(qiáng)度、是否線性關(guān)系等。
使用geom_point()繪制散點(diǎn)圖,并分別映射一個(gè)變量到x和y。
|
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn)) + geom_point()
|
可以使用shape和size分別指定點(diǎn)型和點(diǎn)的大小,如果點(diǎn)型包括填充和描邊的話,可用fill和color分別指定填充色和描邊色。
2 基于類別型變量分組
可將分組變量(因子或字符變量)賦值給顏色或形狀屬性,實(shí)現(xiàn)分組散點(diǎn)圖的繪制
可以將因子和字符串等類別型變量映射到散點(diǎn)的顏色或形狀。
|
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, shape=sex, color=sex)) + geom_point()
|
set.seed(112) x <- rnorm(100,mean = 2,sd = 3) y <- 1.5+2*x+rnorm(100) z <- sample(c(0,1),size = 100,replace = TRUE) df <- data.frame(x = x,y = y,z = z) # 將數(shù)值型變量轉(zhuǎn)換為因子型變量 df$z <- factor(df$z)
#分組變量賦值給顏色屬性 ggplot(df,aes(x = x,y = y,colour = z))+ geom_point(size = 3)
#分組變量賦值給形狀屬性 ggplot(df,aes(x = x,y = y,shape = z))+ geom_point(size = 3)
# 分組變量同時(shí)賦給顏色屬性和形狀屬性 ggplot(df,aes(x = x,y = y,shape = z,colour = z))+ geom_point(size = 3)+ scale_color_brewer(palette = "Accent")+ scale_shape_manual(values = c(2,16))
注意點(diǎn)的形狀,21-25之間的點(diǎn)的形狀,既可以賦值邊框顏色,又可以賦值填充色。
將離散型變量或因子映射給顏色屬性或形狀屬性
x <- c(10,13,11,15,18,20,21,22,24,26)
y <- c(76,60,70,58,55,48,44,40,26,18)
z <- c(100,120,300,180,80,210,30,95,145,420)
df <- data.frame(x = x,y = y,z = z)
# 將連續(xù)型變量映射給顏色屬性
ggplot(df,aes(x = x,y = y,colour = z))+
geom_point(size = 3)
圖例上,顏色越深而對(duì)應(yīng)的值越小,如何將值的大小與顏色的深淺保持一致?只需要人為的設(shè)置色階,從低到高設(shè)置不同的顏色即可
3 基于連續(xù)型變量映射
當(dāng)然,還可以將連續(xù)型變量映射到散點(diǎn)的顏色或大小等存在漸變的屬性上,從而呈現(xiàn)三個(gè)連續(xù)型變量之間的關(guān)系。其中人眼對(duì)于x軸和y軸所對(duì)應(yīng)變量的變化更為敏感,而對(duì)顏色和大小的變化則不那么敏感。
|
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, size=weightLb, color=weightLb)) + geom_point()
|
同時(shí)映射類別型變量和連續(xù)型變量,并設(shè)置散點(diǎn)的面積正比于連續(xù)型變量的大小,默認(rèn)為非線性映射。
|
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, size=weightLb, color=sex)) + geom_point(alpha=.5) + scale_size_area()
|
# 將連續(xù)型變量映射給顏色屬性,同時(shí)設(shè)置雙色梯度 ggplot(df,aes(x = x,y = y,colour = z))+geom_point(size = 3)+scale_colour_gradient(low = "lightblue",high = "darkblue")
# 將連續(xù)變量映射給大小屬性 ggplot(df,aes(x = x,y = y,size = z))+ geom_point()
# 將連續(xù)型變量賦給顏色屬性或大小屬性,自定義雙色梯度,色階間隔順序由低到高 ggplot(df,aes(x = x,y = y,fill = z))+ geom_point(shape = 21,size = 3)+ scale_fill_gradient(low = "lightblue",high = "darkblue",breaks = c(100,150,200,300,350,400))
# 自定義球大小的間隔 ggplot(df,aes(x = x,y = y,size = z))+geom_point()+ scale_size_continuous(breaks = c(100,150,200,250,300,350,400),guide = guide_legend()) # scale_size(breaks = c(100,150,200,250,300,350,400))結(jié)果一樣
# 將連續(xù)變量值的大小與球的大小成比例 ggplot(df,aes(x = x,y = y,size = z))+geom_point()+scale_size_area(max_size = 10) # scale_size_area()可以確保數(shù)值0映射為0,max_size保證映射最大的點(diǎn)的大小
4 處理散點(diǎn)重合
處理散點(diǎn)重合的基本思路包括:
當(dāng)數(shù)據(jù)點(diǎn)非常多時(shí),可能會(huì)導(dǎo)致數(shù)據(jù)點(diǎn)重疊嚴(yán)重,處理方法如下: 1)使用半透明的點(diǎn) 2)數(shù)據(jù)分箱,并用矩形表示{stat_bin2d()} 3)數(shù)據(jù)分箱,并用六邊形表示{stat_binhex()} 4)使用二維密度估計(jì),并將等高線添加到散點(diǎn)圖中{stat_density2d()} 5)向散點(diǎn)圖中添加邊際地毯
set.seed(112) x <- rnorm(10000) y <- rnorm(10000,0,2) df <- data.frame(x = x,y = y) # 不作任何處理 ggplot(df,aes(x = x,y = y))+ geom_point()
# 使用透明度處理點(diǎn)的重疊問題 ggplot(df,aes(x = x,y = y))+geom_point(alpha = 0.1)
# 分箱,并用矩陣表示 ggplot(df,aes(x = x,y = y))+stat_bin2d()
默認(rèn)情況下,stat_bin2d()函數(shù)將x軸和y軸的數(shù)據(jù)點(diǎn)各分位30段,即參數(shù)900個(gè)箱子;用戶還可以自定義分段個(gè)數(shù),以及箱子在垂直和水平方向上的寬度。
# 設(shè)置bins為50, ggplot(df,aes(x = x,y = y))+stat_bin2d(bins = 50)+scale_fill_gradient(low = "steelblue",high = "darkred",limits = c(0,100),breaks = c(0,25,50,100))
分箱的具體做法是,將點(diǎn)分箱,并統(tǒng)計(jì)每個(gè)箱中點(diǎn)的個(gè)數(shù),然后通過某種方法可視化這個(gè)數(shù)量。
# 分箱,用六邊形表示,箱子水平和豎直方向的寬度各為0.2,0.3; # 圖例標(biāo)度范圍0-100,顯示在圖例上的值(0,25,50,100)
ggplot(df,aes(x = x,y = y))+stat_bin_hex(binwidth = c(0.2,0.3))+ scale_fill_gradient(low = "lightgreen",high = "darkred",limits=c(0,100),breaks = c(0,25,50,100))
# 使用stat_density2d作二維密度估計(jì),并將等高線添加到散點(diǎn)圖中 ggplot(df,aes(x = x,y = y))+geom_point()+stat_density2d()
#使用大小與分布密度成正比例的點(diǎn),不添加等高線 ggplot(df,aes(x = x, y = y)) +stat_density2d(geom = 'point', aes(size = ..density..),contour = FALSE) + scale_size_area()
#使用瓦片圖展示數(shù)據(jù)分布密度情況 ggplot(df,aes(x = x, y = y)) + stat_density2d(geom = 'tile',aes(fill = ..density..),contour = FALSE)
#向散點(diǎn)圖中添加邊際地毯(軸須線) ggplot(faithful,aes(x = eruptions, y = waiting)) + geom_point() + geom_rug()
#通過邊際地毯,可以快速查看每個(gè)坐標(biāo)軸上數(shù)據(jù)的分布密疏情況。還可以通過向邊際地毯線的位置坐標(biāo)添加擾動(dòng)并設(shè)定size減少線寬,從而減輕邊際地毯線的重疊程度。 ggplot(faithful, aes(x = eruptions, y = waiting)) +geom_point() +geom_rug(position = 'jitter', size = 0.1)
- 設(shè)置透明度;
- 使用矩形和六邊形等分箱,并且用顏色表示密度。
|
sp <- ggplot(diamonds, aes(x=carat, y=price))
# 未處理
sp + geom_point()
# 設(shè)置透明度
sp + geom_point(alpha=.1)
sp + geom_point(alpha=.01)
# 矩形分箱并設(shè)置漸變顏色
sp + stat_bin2d(bins=50) + scale_fill_gradient(low="lightblue", high="red")
# 六邊形分箱并設(shè)置漸變顏色
install.packages("hexbin")
sp + stat_binhex() + scale_fill_gradient(low="lightblue", high="red")
|
以下為六邊形分箱的結(jié)果。
當(dāng)x軸和y軸對(duì)應(yīng)一個(gè)或兩個(gè)離散型變量時(shí),例如雖然對(duì)應(yīng)數(shù)值,但是數(shù)值僅取某些離散點(diǎn),可以給散點(diǎn)圖添加擾動(dòng),使得散點(diǎn)分離開來。
|
sp <- ggplot(ChickWeight, aes(x=Time, y=weight))
# 未處理
sp + geom_point()
# 添加擾動(dòng)
sp + geom_point(position="jitter")
# 僅添加水平方向上的擾動(dòng)
sp + geom_point(position=position_jitter(width=.5, height=0))
|
5 添加擬合線
使用stat_smooth()或geom_smooth()添加擬合線和置信域。
1
2
3
4
5
6
7
8
9
10
11
12
|
library(gcookbook)
sp <- ggplot(heightweight, aes(x=ageYear, y=heightIn))
# 默認(rèn),loess局部加權(quán)多項(xiàng)式擬合
sp + geom_point() + stat_smooth()
# 線性擬合,95%置信域
sp + geom_point() + stat_smooth(method=lm)
# 99%置信域
sp + geom_point() + stat_smooth(method=lm, level=0.99)
# 不加置信域
sp + geom_point() + stat_smooth(method=lm, se=FALSE)
# 修改配色
sp + geom_point(color="grey60") + stat_smooth(method=lm, se=FALSE, color="black")
|
以下使用Logistic回歸擬合一個(gè)二分類的樣本,可以看出V1和classn具有二分類關(guān)系,Logistic回歸曲線也說明了這一點(diǎn)。
|
library(MASS)
b <- biopsy
b$classn[b$class=="benign"] <- 0
b$classn[b$class=="malignant"] <- 1
head(b)
ggplot(b, aes(x=V1, y=classn)) + geom_point(position=position_jitter(width=.3, height=.06), alpha=.4, shape=21, size=1.5) + geom_smooth(method="glm", method.args=list(family="binomial"))
|
如果已經(jīng)將類別型變量映射到散點(diǎn)的顏色或形狀,則在添加擬合線時(shí)會(huì)分別為每一組添加一條擬合線??梢钥吹缴砀唠S著年齡增長(zhǎng)而增加,到一定年齡后停止增長(zhǎng),且男性比女性平均身高更高。
|
ggplot(heightweight, aes(x=ageYear, y=heightIn, color=sex)) + geom_point() + scale_color_brewer(palette="Set1") + geom_smooth()
|
散點(diǎn)圖矩陣
散點(diǎn)圖矩陣用于展示多幅散點(diǎn)圖,pairs()函數(shù)可以創(chuàng)建基礎(chǔ)的散點(diǎn)圖矩陣,以下代碼包含mpg、disp、drat和wt中任意兩者的散點(diǎn)圖。
|
pairs(~ mpg + disp + drat + wt, data=mtcars, main="Basic Scatter Plot Matrix")
|
car包的scatterplotMatrix()函數(shù)也可以生成散點(diǎn)圖矩陣,并支持以下操作:
- 以某個(gè)因子為條件繪制散點(diǎn)圖矩陣;
- 包含線型和平滑擬合曲線;
- 在主對(duì)角線放置箱線圖、密度圖或者直方圖;
- 在各單元格的邊界添加軸須圖。
|
library(car)
scatterplotMatrix(~ mpg + disp + drat + wt, data=mtcars, spread=FALSE, lty.smooth=2, main="Scatter Plot Matrix via car Package")
|
spread=FALSE選項(xiàng)表示不添加展示分散度和對(duì)稱信息的直線。
再來一個(gè)scatterplotMatrix()函數(shù)的使用例子,主對(duì)角線的核密度曲線改為了直方圖,并且直方圖以汽車氣缸數(shù)為條件繪制。
|
library(car)
scatterplotMatrix(~ mpg + disp + drat + wt|cyl, data=mtcars, spread=FALSE, diagonal="histogram", main="Scatter Plot Matrix via car Package")
|
gclus包中的cpairs()函數(shù)提供了一個(gè)有趣的散點(diǎn)圖矩陣變種,支持重排矩陣中變量的位置,讓相關(guān)性更高的變量更靠近主對(duì)角線,還可以對(duì)各單元格進(jìn)行顏色編碼來展示變量間的相關(guān)性大小。
首先查看各個(gè)變量之間相關(guān)性的大小:
|
cor(mtcars[c("mpg", "wt", "disp", "drat")])
|
可以發(fā)現(xiàn)相關(guān)性最高(0.89)的是車重(wt)和排量(disp),以及車重(wt)和每加侖英里數(shù)(mpg)。相關(guān)性最低(0.68)的是每加侖英里數(shù)(mpg)和后軸比(drat)。以下代碼根據(jù)相關(guān)性大小,對(duì)散點(diǎn)圖矩陣中的這些變量重新排序并著色。
|
library(gclus)
mydata <- mtcars[c(1,3,5,6)]
mydata.corr <- abs(cor(mydata))
mycolors <- dmat.color(mydata.corr)
myorder <- order.single(mydata.corr)
cpairs(mydata, myorder, panel.colors=mycolors, gap=.5, main="Variables Ordered and Colored by Correlation")
|
高密度散點(diǎn)圖
當(dāng)散點(diǎn)圖中點(diǎn)數(shù)量過大時(shí),數(shù)據(jù)點(diǎn)的重疊將會(huì)導(dǎo)致繪圖效果顯著變差。對(duì)于這種情況,可以使用封箱、顏色和透明度等來指定圖中任意點(diǎn)上重疊點(diǎn)的數(shù)目。
smoothScatter()函數(shù)可利用核密度估計(jì)生成用顏色密度來表示點(diǎn)分布的散點(diǎn)圖。
|
set.seed(1234)
n <- 10000
c1 <- matrix(rnorm(n ,mean=0, sd=.5), ncol=2)
c2 <- matrix(rnorm(n, mean=3, sd=2), ncol=2)
mydata <- rbind(c1, c2)
mydata <- as.data.frame(mydata)
names(mydata) <- c("x", "y")
smoothScatter(mydata$x, mydata$y, main="Scatterplot Colored by Smoothed Densities")
|
hexbin包中的hexbin()函數(shù)將二元變量的封箱放到六邊形單元格中。
|
library(hexbin)
bin <- hexbin(mydata$x, mydata$y, xbins=50)
plot(bin, main="Hexagonal Binning with 10000 Observations")
|
IDPmisc包中的iplot()函數(shù)也可以通過顏色來展示點(diǎn)的密度。
|
library(IDPmisc)
iplot(mydata$x, mydata$y, main="Image Scatter Plot with Color Indicating Density")
|
三維散點(diǎn)圖
如果想一次性對(duì)三個(gè)定量變量的交互進(jìn)行可視化,那么可以使用scatterplot3d中的scatterplot3d()函數(shù)進(jìn)行繪制。
|
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg, main="Basic 3D Scatter Plot")
detach(mtcars)
|
scatterplot3d()函數(shù)提供了許多選項(xiàng),包括設(shè)置圖形符號(hào)、軸、顏色、線條、網(wǎng)格線、突出顯示和角度等功能。例如以下代碼生成一幅突出顯示效果的三維散點(diǎn)圖,增強(qiáng)了縱深感并添加了連接點(diǎn)與水平面的垂直線。
|
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE, type="h", main="3D Scatter Plot with Vertical Lines")
detach(mtcars)
|
還可以再加上一個(gè)回歸面。
|
library(scatterplot3d)
attach(mtcars)
s3d <- scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE, type="h", main="3D Scatter Plot with Vertical Lines and Regression Plane")
fit <- lm(mpg ~ wt + disp)
s3d$plane3d(fit)
detach(mtcars)
|
使用rgl包中的plot3d()函數(shù)可創(chuàng)建交互式的三維散點(diǎn)圖,通過鼠標(biāo)即可對(duì)圖形進(jìn)行旋轉(zhuǎn)。
|
library(rgl)
attach(mtcars)
plot3d(wt, disp, mpg, col="red", size=5)
detach(mtcars)
|
Rcmdr包中的scatter3d()函數(shù)可以實(shí)現(xiàn)類似功能。
|
library(Rcmdr)
attach(mtcars)
scatter3d(wt, disp, mpg)
detach(mtcars)
|
7 添加文本標(biāo)注
使用geom_text()為散點(diǎn)圖添加標(biāo)注,vjust為0時(shí)表示豎直方向上基線對(duì)齊,為1時(shí)表示頂部對(duì)齊,hjust為0時(shí)表示水平方向上左對(duì)齊,為1時(shí)表示右對(duì)齊,以下設(shè)置對(duì)齊方式并適當(dāng)添加偏移,以改善顯示效果。
|
ggplot(subset(countries, Year==2009 & healthexp>2000), aes(x=healthexp, y=infmortality)) + geom_point() + geom_text(aes(y=infmortality+.1, label=Name), size=4, vjust=0)
|
8 使用氣泡圖繪制二維統(tǒng)計(jì)
以下使用散點(diǎn)圖繪制氣泡圖,對(duì)兩個(gè)類別型變量進(jìn)行統(tǒng)計(jì)。
|
hec <- HairEyeColor[,,"Male"] + HairEyeColor[,,"Female"]
library(reshape2)
hec <- melt(hec, value.name="count")
ggplot(hec, aes(x=Eye, y=Hair)) + geom_point(aes(size=count), shape=21, color="black", fill="cornsilk") + scale_size_area(max_size=20, guide=FALSE) + geom_text(aes(y=as.numeric(Hair)-sqrt(count)/22, label=count), vjust=1, color="grey60", size=4)
|
value1 <- rep(c('高價(jià)值','中價(jià)值','低價(jià)值'), each = 3) value2 <- rep(c('高價(jià)值','中價(jià)值','低價(jià)值'), times = 3) nums <- c(500,287,123,156,720,390,80,468,1200) df <- data.frame(value1 = value1, value2 = value2, nums = nums) df$value1 <- factor(df$value1, levels = c('高價(jià)值','中價(jià)值','低價(jià)值'), order = TRUE) df$value2 <- factor(df$value2, levels = c('低價(jià)值','中價(jià)值','高價(jià)值'), order = TRUE) ggplot(df,aes(x = value1, y = value2, size = nums)) +geom_point(colour = 'steelblue') + scale_size_area(max_size = 30, guide = FALSE) +geom_text(aes(label = nums), vjust = 0, colour = 'black', size = 5) + theme(text = element_text(family = 'SimSun'))
繪制氣泡圖也可使用函數(shù)symbols(x,y,circle=r).當(dāng)中x、y是坐標(biāo)軸,r是每一個(gè)點(diǎn)的半徑。 x<-rnorm(6) y<-rnorm(6) r<-abs(rnorm(6)) symbols(x,y,circle = r, bg=rainbow(6))
###############氣泡圖例子2 attach(mtcars) # 激活或掛接數(shù)據(jù)集 #attach( )函數(shù)是將數(shù)據(jù)框添加到R的搜索路徑中 # mtcars為R語言內(nèi)置數(shù)據(jù)集 r<-sqrt(disp/pi) symbols(wt,mpg,circle=r, inches=0.3, bg="lightblue") text(wt,mpg,row.names(mtcars), cex=0.5) #給每一個(gè)氣泡加上文字。
Chap6. 描述數(shù)據(jù)分布
數(shù)據(jù)分布可視化方法
直方圖
geom_histogram()
binwidth 設(shè)置組距;origin 設(shè)置分組原點(diǎn)
- 各分組區(qū)間左閉右開
- 分面:
facet_grid(x ~.)
- 修改分類標(biāo)簽:
revalue(x, c("0"="No smoke","1"="smoke"))
- 參數(shù)
scales = free 可以單獨(dú)設(shè)定各個(gè)分面的Y軸標(biāo)度。
我們經(jīng)常想觀察一批數(shù)據(jù)的分布形態(tài),直方圖、密度圖、箱線圖、小提琴圖和點(diǎn)圖等都是很好的實(shí)現(xiàn)形式。在此,我們簡(jiǎn)略介紹直方圖、密度圖和箱線圖,這種三種圖形對(duì)我們來說更為常用。
直方圖
很多人沒搞清楚條形圖和直方圖之間的區(qū)別。條形圖主要用于展示分類數(shù)據(jù),即名義數(shù)據(jù),各組分開而立。而直方圖多用于展示數(shù)值型數(shù)據(jù),各組相依。
單組直方圖
最基本的語句就是在ggplot語句后再加geom_histogram()即可。
library(gcookbook)
library(ggplot2)
ggplot(faithful, aes(x=waiting)) + geom_histogram(bins=10)
直方圖默認(rèn)最大為30組,我們可以使用*binwidth來改變。
ggplot(faithful, aes(x=waiting)) +geom_histogram(binwidth=8, bins=10,fill="white", colour="black")#改為8組
分組直方圖
分組直方圖做法與其他圖形一樣,我們用到facet_grid(var ~ .),該方法是以var變量進(jìn)行分類,做多個(gè)圖形,非一個(gè)圖形中做多個(gè)直方圖。如果變量為數(shù)字,應(yīng)當(dāng)因子化。
library(MASS) #取binwidth數(shù)據(jù)
ggplot(birthwt, aes(x=bwt))+geom_histogram(fill="white",bins=10, colour="black")+facet_grid(smoke ~ .)
核密度曲線
geom_line(stat='identity') 或者geom_density()
如果你想要做密度曲線,則用geom_density映射一連續(xù)變量。
ggplot(faithful, aes(x=waiting)) + geom_density()
#你也可以將包住的部分給填充顏色
ggplot(faithful, aes(x=waiting)) +
geom_density(fill="blue", alpha=.2) +
xlim(35, 105)
#如果你不喜歡線與下方相連,可以使用另外一種方式
ggplot(faithful, aes(x=waiting)) + geom_line(stat="density") +
expand_limits(y=0)#expand_limits使y軸范圍包含0值。
#密度曲線與直方圖共戲
ggplot(faithful, aes(x=waiting, y=..density..)) +
geom_histogram(fill="cornsilk", colour="grey60", size=.2) +
geom_density() +
xlim(35, 105)
分組密度曲線
library(MASS) #取binwidth數(shù)據(jù)
ggplot(birthwt, aes(x=bwt))+geom_histogram(fill="white", colour="black")+facet_grid(smoke ~ .) birthwt1 <- birthwt birthwt1$smoke <- factor(birthwt1$smoke) ggplot(birthwt1, aes(x=bwt, fill=smoke)) + geom_density(alpha=.3)
頻數(shù)多邊形
頻數(shù)多邊形描述了數(shù)據(jù)本身的信息,而核密度曲線只是一個(gè)估計(jì),需要認(rèn)為輸入帶寬參數(shù)。
箱線圖
- 參數(shù):
width ,outlier.size ,outlier.shape
- 添加槽口(notch):用來幫助查看不同分布的中位數(shù)是否有差異。
- 添加均值:
geom_summary(fun.y="mean",geom="point"...)
library(MASS) #取binwidth數(shù)據(jù) ggplot(birthwt, aes(x=bwt))+geom_histogram(fill="white", colour="black")+facet_grid(smoke ~ .)
ggplot(birthwt, aes(x=factor(race), y=bwt)) + geom_boxplot()
#如果存在多個(gè)多個(gè)離群點(diǎn),可用outlier.size 和outlier.shape進(jìn)行大小和形狀設(shè)置
ggplot(birthwt, aes(x=factor(race), y=bwt)) +
geom_boxplot(outlier.size=1.5, outlier.shape=21)
#為了看數(shù)據(jù)分布是否有偏,我們還可以增加均值與中值進(jìn)行比較,主要用stat_summary把均值以菱形相展示。
ggplot(birthwt, aes(x=factor(race), y=bwt)) + geom_boxplot() +
stat_summary(fun.y="mean", geom="point", shape=23, size=3, fill="white")
小提琴圖
- 小提琴圖用來比較多組數(shù)據(jù)分布情況的方法,其也是核密度估計(jì)。
- 坐標(biāo)范圍:從最小值到最大值,與箱線圖不同。
- 參數(shù):
adjust 調(diào)整平滑程度,scale="count" 使得圖的面積與每組觀測(cè)值數(shù)目成正比。
p = ggplot(data=mpg, mapping=aes(x=class, y=hwy, fill=class)) p + geom_boxplot() + geom_jitter(shape=21) p + geom_violin(alpha=0.5, width=0.9) + geom_jitter(shape=21)
Wilkinson點(diǎn)圖
- Wilkinson點(diǎn)圖:沿著x軸方向?qū)?shù)據(jù)進(jìn)行分組,并在y軸上對(duì)點(diǎn)進(jìn)行堆積。圖形上Y軸的刻度線沒有明確的含義。
- 備注:移除刻度線
scale_y_continuous(break=NULL) ,移除坐標(biāo)軸標(biāo)簽theme(axis.title.y=element_blank())
- 參數(shù)
binaxis=”y” ,將數(shù)據(jù)點(diǎn)沿著Y軸進(jìn)行堆疊,并沿著x軸分組。stackdir="center" :中心堆疊
p = ggplot(data=mpg, mapping=aes(x=class, y=hwy, fill=class)) p +geom_dotplot()
顏色圖和等高圖 par(mar = rep(1, 4)) x = 10 * (1:nrow(volcano)) y = 10 * (1:ncol(volcano)) image(x, y, volcano, col = terrain.colors(100), axes = FALSE) contour(x, y, volcano, levels = seq(90, 200, by = 5),add = TRUE, col = "peru") box()
極坐標(biāo) (玫瑰圖)
dt = data.frame(A = c(2, 7, 4, 10, 1,5), B = c('B','A','C','D','E','B')) windowsFonts(myFont = windowsFont("楷體")) ## 綁定字體 p = ggplot(dt, aes(x = B, y = A, fill = B)) + geom_bar(stat = "identity", alpha = 0.7) + coord_polar() p
Chap7. 注解
文本注解
geom_text()
annotate() :可以添加任意類型的幾何對(duì)象。 annotate("text",x=,y=,label=,...)
數(shù)學(xué)表達(dá)式
annotate("text",...,parse=TRUE,...)
- 引入常規(guī)文本:在雙引號(hào)內(nèi)使用單引號(hào)標(biāo)出純文本的部分即可。
- 不能簡(jiǎn)單地把一個(gè)變量之間放到另一個(gè)變量旁邊卻不在中間添加任何記號(hào)。
?plotmath 和?demo(plotmath)
添加直線
- 橫線和豎線:
geom_hline(yintercept=) & geom_vline()
- 有角度的直線:
geom_abline(intercept=,slope=)
添加線段和箭頭
- 線段:
annotate("segment",x=,xend=,y=,yend=)
- 利用grid包中的
arrow() 函數(shù)向線段兩端添加箭頭或平頭。
添加矩形陰影
annotate("rect",xmin=,xmax=,ymin=,ymax=,alpha=,fill=)
添加誤差線
geom_errorbar(aes(ymin=,ymax=),width=,position=)
向獨(dú)立分面添加注解
# 基本圖形
p <- ggplot(mpg, aes(x=displ,y=hwy)) +
geom_point() + facet_grid(.~drv)
#存有每個(gè)分面所需標(biāo)簽的數(shù)據(jù)框
f_labels <- data.frame(drv=c("4","f","r"),
label=c("4wd","Front","Rear"))
p + geom_text(x=6,y=40,aes(label=label), data= f_labels) 1. `sprintf()`:returns a character vector containing a formatted combination of text and variable values. 2. `sprintf("italic(y) == %.2f %+.2f * italic(x)",round(coef(mod)[1],2),round(coef(mod)[2],2))`
1 添加文本注解
使用annotate()生成一條文本注解,通過x和y指定文本位置,可以是具體數(shù)值或者Inf和-Inf,表示圖形的邊緣,使用hjust和vjust進(jìn)行水平方向和豎直方向上的微調(diào),使用family、color、size分別指定字體、顏色、大小。
|
ggplot(faithful, aes(x=eruptions, y=waiting)) + geom_point() + annotate("text", x=3, y=48, label="Group 1", family="serif", color="darkred", size=5) + annotate("text", x=mean(range(faithful$eruptions)), y=-Inf, label="Group 2", vjust=-1)
|
2 添加數(shù)學(xué)表達(dá)式
還是使用annotate(),不過需要制定parse為TRUE,表示對(duì)文本進(jìn)行公式解析。
|
ggplot(data.frame(x=c(-3, 3)), aes(x=x)) + stat_function(fun=dnorm) + annotate("text", x=0, y=0.05, parse=TRUE, size=4, label="'Function: ' * y==frac(1, sqrt(2*pi)) * e^{-x^2/2}")
|
更多和公式語法有關(guān)的內(nèi)容可參考?plotmath,更多數(shù)學(xué)表達(dá)式的圖示可參考?demo(plotmath)。
3 添加直線
使用geom_hline()、geom_vline()、geom_abline()分別繪制水平線、豎直線和有角度的線。如果x軸或y軸為類別型變量,則第一個(gè)水平為數(shù)值1,第二個(gè)水平為數(shù)值2,依此類推。
|
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, color=sex)) + geom_point() + geom_hline(yintercept=60) + geom_vline(xintercept=14) + geom_abline(intercept=37.4, slope=1.75)
|
同樣可以通過指定類別型變量繪制多條直線。
|
library(plyr)
hw_means <- ddply(heightweight, "sex", summarise, heightIn=mean(heightIn))
ggplot(heightweight, aes(x=ageYear, y=heightIn, color=sex)) + geom_point() + geom_hline(aes(yintercept=heightIn, color=sex), data=hw_means, linetype="dashed", size=1)
|
4 添加線段和箭頭
在annotate()中指定segment可以添加線段,還可以為線段添加箭頭,箭頭默認(rèn)角度angle為30度,默認(rèn)長(zhǎng)度length為0.2英寸,使用x、xend、y、yend指定線段的起始位置。如果x軸或y軸為類別型變量,則相應(yīng)地第一個(gè)水平使用數(shù)值1,第二個(gè)水平使用數(shù)值2,依次類推。
|
library(grid)
ggplot(subset(climate, Source=="Berkeley"), aes(x=Year, y=Anomaly10y)) + geom_line() + annotate("segment", x=1850, xend=1820, y=-.8, yend=-.95, color="blue", size=2, arrow=arrow()) + annotate("segment", x=1950, xend=1980, y=-.25, yend=-.25, arrow=arrow(ends="both", angle=90, length=unit(.2, "cm")))
|
5 添加矩形陰影
在annotate()中指定rect可以添加矩形,其實(shí)只要傳遞了合適的參數(shù),任意幾何對(duì)象都可以配合annotate()使用。
|
library(gcookbook)
ggplot(subset(climate, Source=="Berkeley"), aes(x=Year, y=Anomaly10y)) + geom_line() + annotate("rect", xmin=1950, xmax=1980, ymin=-1, ymax=1, alpha=.1, fill="blue")
|
6 向獨(dú)立分面添加注解
使用分面變量生成一個(gè)新的數(shù)據(jù)框,并設(shè)定每個(gè)分面要繪制的值,然后配合新數(shù)據(jù)框使用geom_text()。
|
p <- ggplot(mpg, aes(x=displ, y=hwy)) + geom_point() + facet_grid(.~drv)
f_labels <- data.frame(drv=c("4", "f", "r"), label=c("4wd", "Front", "Rear"))
p + geom_text(x=6, y=40, aes(label=label), data=f_labels)
|
再來一個(gè)為每個(gè)分面添加擬合直線公式的例子。
|
lm_labels <- function(dat) {
mod <- lm(hwy ~ displ, data=dat)
formula <- sprintf("italic(y) == %.2f%+.2f * italic(x)", round(coef(mod)[1], 2), round(coef(mod)[2], 2))
r <- cor(dat$displ, dat$hwy)
r2 <- sprintf("italic(R^2) == %.2f", r^2)
data.frame(formula=formula, r2=r2, sringAsFactors=FALSE)
}
library(plyr)
labels <- ddply(mpg, "drv", lm_labels)
ggplot(mpg, aes(x=displ, y=hwy)) + geom_point() + facet_grid(.~drv) + geom_smooth(method=lm, se=FALSE) + geom_text(x=3, y=40, aes(label=formula), data=labels, parse=TRUE, hjust=0) + geom_text(x=3, y=35, aes(label=r2), data=labels, parse=TRUE, hjust=0)
|
Chap8. 坐標(biāo)軸
交換x軸和y軸
coord_filp()
# x是因子型變量
+ scale_x_discrete(limits=rev(levels(..)))
坐標(biāo)軸的值域
ylim() 或者xlim()
- 全稱:
scale_y_continuous(limits=c(,),breaks=c(.,.,.))
- 注意區(qū)分
scale_y_continuous() 和coord_cartesian() ;其中前者表示使用標(biāo)度限制y到更小的范圍,范圍外的數(shù)據(jù)被丟棄,而后者則是利用坐標(biāo)變換放大或縮小了數(shù)據(jù)。
expand_limits() :只能用來擴(kuò)展數(shù)據(jù),而不能用來縮減值域。
反轉(zhuǎn)一條連續(xù)型坐標(biāo)軸
scale_y_reverse()
scale_x_reverse()
修改類別型坐標(biāo)軸上項(xiàng)目的順序
scale_x_discrete(limits=c(.,.,.))
# 反轉(zhuǎn)坐標(biāo)軸
scale_x_discrete(limits=rev(levels(...)))
設(shè)置x軸和y軸的縮放比例
coord_fixed(ratio=1)
默認(rèn)情況下,ggplot2使兩軸的總長(zhǎng)寬比例為1:1,從而形成正方形的繪圖區(qū)域,而本節(jié)中所提到的比例為:坐標(biāo)軸單位長(zhǎng)度表示的數(shù)值范圍
設(shè)置刻度線的位置
參數(shù)breaks
離散型變量的坐標(biāo)軸:設(shè)置limits 以重排序或移除項(xiàng)目,而設(shè)置breaks 來控制哪些項(xiàng)目擁有標(biāo)簽。
移除刻度線和標(biāo)簽
# 移除刻度標(biāo)簽
theme(axis.text.y = element_blank())
# 移除刻度線
theme(axis.ticks = element_blank())
# 同時(shí)移除連續(xù)型變量的刻度線、刻度標(biāo)簽和網(wǎng)格線
scale_y_continuous(breaks= NULL) 刻度標(biāo)簽可以單獨(dú)控制,但是刻度線和網(wǎng)格線必須同時(shí)控制。
修改刻度標(biāo)簽的文本
參數(shù):breaks & labels
package:scales自帶了一些內(nèi)置的格式化函數(shù),比如comma(),dollar(),percent(),scientific()
修改刻度標(biāo)簽的外觀
# 文本旋轉(zhuǎn)
theme(axis.text.x = element_text(angle=90,hjust=,vjust=))
# 其他文本屬性
theme(axis.text.x = element_text(family=,face=,colour=,size=rel()))
rel(0.9):表示為當(dāng)前主題基礎(chǔ)字體大小的0.9倍
修改坐標(biāo)軸標(biāo)簽的文本
# 簡(jiǎn)便法
xlab() & ylab()
# 完整法
scale_x_continuous(name="") 文本中可包含`\n,\t`等文本符號(hào)
移除坐標(biāo)軸標(biāo)簽
theme(axis.title.x = element_blank())
對(duì)數(shù)坐標(biāo)軸
scale_x_log10() & scale_y_log10()
# 刻度標(biāo)簽轉(zhuǎn)而使用指數(shù)計(jì)數(shù)法
library(scales)
scale_x_log10(breaks=10^(-1:5), labels=trans_format("log10",math_format(10^.x)))
# 自然對(duì)數(shù)
trans=log_trans()
# 以2為底的對(duì)數(shù)
trans = log2_trans()
對(duì)數(shù)坐標(biāo)軸添加刻度
坐標(biāo)軸上使用日期
library(scales)
# Date 對(duì)象
p + scale_x_time(breaks = datebreaks, date_format("%Y-%m"))
# POSIXt對(duì)象
p + scale_x_datetime(breaks = datebreaks,date_format())
+ theme(axis.text.x = element_text(angle=90, hjust=1)) 1 交換X軸和Y軸
使用coord_flip()來翻轉(zhuǎn)坐標(biāo)軸。
|
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() + coord_flip()
|
2 設(shè)置連續(xù)型坐標(biāo)軸的值域
可以使用xlim()和ylim()來設(shè)置連續(xù)型坐標(biāo)軸的最小值和最大值。
|
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() + ylim(0, max(PlantGrowth$weight))
|
ylim()是scale_y_continuous()的簡(jiǎn)化寫法,后者還可以使用breaks設(shè)置刻度線的位置。
|
ylim(0, 10)
scale_y_continuous(limits=c(0, 10), breaks=c(0, 5, 10))
|
3 反轉(zhuǎn)連續(xù)型坐標(biāo)軸
使用scale_y_reverse()和scale_x_reverse()反轉(zhuǎn)連續(xù)型坐標(biāo)軸。
4 修改類別型坐標(biāo)軸上項(xiàng)目的順序
通過scale_x_discrete()和scale_y_discrete()并將一個(gè)依所需順序排列的水平向量傳遞給limits即可。如果在limits中省略某一類別對(duì)應(yīng)的值,則該類別在繪圖中將不顯示。
|
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() + scale_x_discrete(limits=c("trt1", "ctrl", "trt2"))
|
以下代碼反轉(zhuǎn)類別型坐標(biāo)軸的項(xiàng)目順序。
|
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() + scale_x_discrete(limits=rev(levels(PlantGrowth$group)))
|
5 設(shè)置X軸和Y軸的縮放比例
當(dāng)x軸和y軸所對(duì)應(yīng)的連續(xù)型變量具有相同的尺度和量級(jí)時(shí),可以通過coord_fixed()使得x軸和y軸之間保持1:1的縮放結(jié)果。
|
library(gcookbook)
ggplot(marathon, aes(x=Half, y=Full)) + geom_point() + coord_fixed()
|
如果希望使用其他縮放比例時(shí),在coord_fixed()中指定ratio即可。
|
ggplot(marathon, aes(x=Half, y=Full)) + geom_point() + coord_fixed(ratio=1/2)
|
6 修改刻度標(biāo)簽的文本
在需要設(shè)置刻度標(biāo)簽的地方同時(shí)為breaks和labels賦值即可。
|
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn)) + geom_point() + scale_y_continuous(breaks=c(50, 56, 60, 66, 72), labels=c("Tiny", "Really\nshort", "Short", "Medium", "Tallish"))
|
也可以定義一個(gè)格式化函數(shù),將原始的值自動(dòng)地轉(zhuǎn)換為相應(yīng)的標(biāo)簽。
|
# 將英寸轉(zhuǎn)換為英尺加英寸
footinch_formatter <- function(x) {
foot <- floor(x/12)
inch <- x %% 12
return(paste(foot, "'", inch, "\"", sep=""))
}
ggplot(heightweight, aes(x=ageYear, y=heightIn)) + geom_point() + scale_y_continuous(labels=footinch_formatter)
|
scales包提供了一些常用的格式化函數(shù):
- comma(),在千、百萬、十億等位置向數(shù)字添加逗號(hào);
- dollar(),添加一個(gè)美元符號(hào)并舍入到最接近的美分;
- percent(),乘以100,舍入到最接近的整數(shù)值,并添加一個(gè)百分號(hào);
- scientific(),對(duì)大數(shù)字和小數(shù)字給出科學(xué)計(jì)數(shù)法表示。
除此之外,通過ggplot2提供的theme()可以對(duì)刻度標(biāo)簽文本設(shè)置字體、樣式、大小和顏色,進(jìn)行旋轉(zhuǎn)和平移等操作,當(dāng)然還包括對(duì)坐標(biāo)軸標(biāo)簽文本、標(biāo)題、圖例等全部元素的樣式自定義,詳情請(qǐng)參考?theme。
7 修改標(biāo)題和坐標(biāo)軸標(biāo)簽文本
使用labs()可以同時(shí)設(shè)置x軸標(biāo)簽、y軸標(biāo)簽和標(biāo)題,如果使用到了中文,還需要用theme()設(shè)置全局字體,參考這里。
|
labs(x="x軸標(biāo)簽", y="y軸標(biāo)簽", title="繪圖標(biāo)題")
|
8 使用對(duì)數(shù)坐標(biāo)軸
使用scale_x_log10()和scale_y_log10()可以將線性坐標(biāo)軸轉(zhuǎn)換為對(duì)數(shù)坐標(biāo)軸,在某些情況下,使用對(duì)數(shù)坐標(biāo)軸更有意義。
|
library(MASS)
ggplot(Animals, aes(x=body, y=brain, label=rownames(Animals))) + geom_text(size=3) + scale_x_log10() + scale_y_log10()
|
9 繪制極坐標(biāo)
使用coord_polar()即可繪制極坐標(biāo)。
|
library(gcookbook)
ggplot(wind, aes(x=DirCat, fill=SpeedCat)) + geom_histogram(binwidth=15, boundary=-7.5) + coord_polar() + scale_x_continuous(limits=c(0, 360))
|
然而,由于極坐標(biāo)的原因,扇形大小并不能直觀反映出實(shí)際的觀測(cè)數(shù)量,而且多種顏色混雜難以讓人對(duì)風(fēng)力有直觀的感受,因此我們需要改變一下樣式。
|
ggplot(wind, aes(x=DirCat, fill=SpeedCat)) + geom_histogram(binwidth=15, boundary=-7.5, color="black", size=.2) + guides(fill=guide_legend(reverse=TRUE)) + coord_polar() + scale_x_continuous(limits=c(0, 360), breaks=seq(0, 360, by=45), minor_breaks=seq(0, 360, by=15)) + scale_fill_brewer()
|
Chap9.控制圖形的整體外觀
設(shè)置圖形標(biāo)題
# 圖形標(biāo)題,"\n"換行
ggtitle()
labs(title="")
# 將標(biāo)題移到內(nèi)部
annotate("text",x=mean(range(x)),y=Inf,label="Age",vjust=1.5,size=6)
修改文本外觀
文本項(xiàng)目分為兩類:主題元素和文本幾何對(duì)象。主題元素包括圖形中的所有非數(shù)據(jù)元素:如標(biāo)題、圖例和坐標(biāo)軸。文本幾何對(duì)象則屬于圖形本身的一部分。
- family: Helvatica、Times、Courier
- face: plain、bold、italic、bold.italic
- lineheight: 行間距倍數(shù)
- angle: 旋轉(zhuǎn)角度(逆時(shí)針)
- size: 字體大小(主題為磅,幾何對(duì)象為毫米)
- strip.text: 雙向分面標(biāo)簽的外觀
使用主題
# 預(yù)制的主題:
theme_bw()
theme_grey()
# 設(shè)置默認(rèn)主題
theme_set(theme_bw())
## 修改主題元素的外觀
要修改一套主題,配合相應(yīng)的element_xx 對(duì)象添加theme() 函數(shù)即可。element_xx 對(duì)象包括element_line 、element_rect 和element_text 。
創(chuàng)建自定義主題
mytheme = theme_bw() +
theme(text = element_text(colour="red"),axis.title=element_text(size=rel(1.25)))
p + mytheme
隱藏網(wǎng)格線
- 主網(wǎng)格線:panel.grid.major
- 次網(wǎng)格線:panel.grid.minor
Chap10. 圖例
像x軸和y軸一樣,圖例也是一種引導(dǎo)元素:它可以向人們展示如何從視覺上的圖形屬性映射回?cái)?shù)據(jù)本身。
# 移除圖例(指明圖例屬性)
guides(fill=FALSE)
# 修改圖例的位置
theme(legend.position="bottom")
# 將圖例置于圖像中
theme(legend.position=c(1,0)) +
theme(legend.bakground=element_rect(fill="white",colour="black"))
# 修改圖例項(xiàng)目的順序
scale_fill_discrete(limits=c("a","b","c"))
# 反轉(zhuǎn)圖例順序(屬性fill)
guides(fill=guide_legend(reverse=TRUE))
# 設(shè)置圖例標(biāo)題(屬性fill)
labs(fill="Condition")
guides(fill=guide.legend(title="Condition"))
# 修改圖例文本
theme(legend.title=element_text(face="italic",family="Times",colour="red",size=14))
# 修改圖例標(biāo)簽
scale_fill_discrete(limits=c("a","b","c"),labels=c("A","B","C"))
# 修改圖例標(biāo)簽的外觀
theme(legend.text=element_text(xx))
# 使用含多行文本的標(biāo)簽
library(grid)
## 增加圖例說明的高度并減小各行的間距
theme(legend.text=element_text(lineheight=0.8),legend.key.height=unit(1,"cm"))
Chap11. 分面
數(shù)據(jù)可視化中最實(shí)用的技術(shù)之一就是將分組數(shù)據(jù)并列呈現(xiàn),這樣使得組間的比較變得輕而易舉。
# 分面函數(shù)
facet_grid(. ~ cyl,scale="free")
facet_wrap(~class, nrow=2)
# 修改分面標(biāo)簽和標(biāo)題的外觀
theme(strip.text=element_text(face="bold",size=rel(1.5)),strip.background=element_rect(fill="lightblue",colour="black",size=1))
即在一個(gè)頁面上自動(dòng)擺放多幅圖形, 這一過程先將數(shù)據(jù)劃分為多個(gè)子集, 然后將每個(gè)子集依次繪制到頁面的不同面板中。ggplot2提供兩種分面類型:網(wǎng)格型(facet_grid)和封面型(facet_wrap)。網(wǎng)格分面生成的是一個(gè)2維的面板網(wǎng)格, 面板的行與列通過變量來定義, 本質(zhì)是2維的; 封裝分面則先生成一個(gè)1維的面板條塊, 然后再分裝到2維中, 本質(zhì)是1維的。 在很多情況下, 我們可能需要繪制有兩個(gè)y軸的坐標(biāo)系, 而在ggplot2中, 這種做法特別不提倡(stackover的討論), 可解決的方法要么是把變量歸一化, 要么便是采用分面方法。
p <- ggplot(mtcars, aes(mpg, wt, colour = cyl)) +geom_point() #geom_point()為通過”+”以圖層的方式加入點(diǎn)的幾何對(duì)象 p <- ggplot(mtcars, aes(mpg, wt)) + geom_point() p + facet_grid(. ~ cyl) #以cyl為分類變量 p + facet_wrap( ~ cyl, nrow = 3) #wrap與grid的區(qū)別 p + facet_grid(cyl ~ .) #以cyl為分類變量 p + facet_wrap( ~ cyl, ncol = 3) #wrap與grid的區(qū)別 p + facet_grid(vs ~ am) #以vs和am為分類變量 p + facet_wrap(vs ~ am, ncol = 2) #wrap與grid 的區(qū)別
Chap12. 配色
離散型變量調(diào)色板
- 等距色:scale_fill_discrete()
- 色輪等距色:scale_fill_hue()
- 灰度調(diào)色板:scale_fill_grey()
- 調(diào)色板顏色:scale_fill_brewer()
- 自定義顏色:scale_fill_manual()
# 設(shè)置亮度參數(shù)(Default:l=65)
scale_fill_hue(l=45)
# 調(diào)用調(diào)色板
library(RColorBrewer)
display.brewer.all()
# 使用自定義調(diào)色板
scale_fill_manual(values=mycol)
對(duì)類別型數(shù)據(jù)中的點(diǎn)而言,最好選擇調(diào)色板Set1 和Dark2 ;對(duì)面積而言,Set2 、Pastel1 、Pastel2 和Accent 都是不錯(cuò)的選擇方案。
RGB顏色
RGB顏色是由六個(gè)數(shù)字組成(十六進(jìn)制數(shù)),形式如“#RRGGBB”。在十六進(jìn)制中,數(shù)字先從0到9,然后緊接著是A到F。每一個(gè)顏色都由兩個(gè)數(shù)字表示,范圍從00到FF。比如顏色“#FF0099”中,255表示紅色,0表示綠色,153表示藍(lán)色,整體表示品紅色。十六進(jìn)制數(shù)中每個(gè)顏色通道常常重復(fù)同樣的數(shù)字,因子這樣更容易閱讀并且第二個(gè)數(shù)字的精確值對(duì)外觀的影響并不是很明顯。
RGB經(jīng)驗(yàn)法則
- 一般情況下,較大的數(shù)字更明亮,較小的數(shù)字更暗淡。
- 如果要得到灰色,將三個(gè)顏色通道設(shè)置為相同的值。
- CMY(印刷三原色):青(cyan)、品紅(magenta)、黃(yellow)。
- RGB顏色
色盲友好式調(diào)色板
cb_col = c("#000000","#E69F00","#56B4E9","#009E73","#F0E442","#0072B2","#D55E00","#CC79A7")
scale_fill_manual(values=cb_col)
# 調(diào)用dichromat包
連續(xù)型變量調(diào)色板
- 兩色漸變:scale_fill_gradient()
- 三色漸變:scale_fill_gradient2()
- 等間隔n色漸變:scale_fill_gradientn()
Chap15. 其他圖形
相關(guān)矩陣圖
library(corrplot)
corrplot(cor(x),method="shade",shade.col=NA,tl.col="black",tl.srt=45,col=col(200),addCoef.col="black",cl.pos="no",order="AOE")
繪制函數(shù)曲線
# 函數(shù)曲線
stat_function(fun=myfun, n=200)
# 函數(shù)曲線下添加陰影
## 定義一個(gè)新函數(shù),把x范圍外的值替換為NA
p + stat_function(fun=myfun, geom="area", fill="blue",alpha=0.2) +
stat_function(fun=myfun)
# 繪制經(jīng)驗(yàn)累積分布函數(shù)圖
stat_ecdf()
繪制熱圖
使用geom_tile() 或者geom_raster() ,并將一個(gè)連續(xù)變量映射到fill上。
p + geom_tile() +
scale_x_continuous(breaks = seq(1940,1976,by=4)) +
scale_y_reverse() +
scale_fill_gradient2(midpoint=50,mid="grey70",limits=c(0,100))
三維散點(diǎn)圖
library(rgl)
# 繪制點(diǎn)
plot3d(x,y,z,type="s",size=0.75,lit=FALSE)
# 添加線段
interleave = function(v1,v2) as.vector(rbind(v1,v2))
segment3d(interleave(x,x),
interleave(y,y),interleave(z,min(z)),alpha=0.4,col="blue")
# 繪制盒子
rgl.bbox(color="grey50", emission="grey50",xlen=0,ylen=0,zlen=0)
# 保存圖像
rgl.snapshot("3dplot.png", fmt="png")
rgl.postscript("3dplot.pdf",fmt="pdf")
# 三維圖動(dòng)畫
plot3d(x,y,z,type="s",size=0.75,lit=FALSE)
play3d(spin3d())
movie3d(spin3d(axis=c(1,0,0),rpm=4),duration=15,fps=50)
繪制譜系圖
hc = hclust(scale(x))
plot(hc, hang=-1)
繪制QQ圖
# base畫圖
qqnorm(x)
qqline(x)
# ggplot2畫圖
predicted <- data.frame(i = 1:length(VALUE), x=1:length(VALUE), y=1:length(VALUE))
predicted$x <- qnorm((predicted$i-0.375)/(nrow(predicted+0.25)))
predicted$y <- sd(VALUE)*predicted$x+mean(VALUE)
ggplot(data.frame(VALUE), aes(sample = VALUE)) +
stat_qq() +
geom_line(data=predicted[,-1],aes(x=x,y=y),size=1,colour="red")
繪制臉型圖
#可以利用函數(shù)cbind() 和rbind() 把向量和矩陣拼成一個(gè)新的矩陣 library(TeachingDemos) data <- rbind(c(80394, 32903, 13.2), c(82560, 36230, 13.8), c(85213, 26921, 10.8)) faces2(data, which = c(3, 14, 12), labels = c("北京", "上海", "天津"), ncols = 3)
繪制馬賽克圖
# 主要用來可視化列聯(lián)表
library(vcd)
mosaic(~x+y+z, data, highlighting="x",highlighting_fill=c(lightblue","pink"),direction=c("v","h","v"))
繪制餅圖
fold = table(survey$Fold)
pie(fold,labels=c("x","y","z"))
繪制地圖
如何用R語言繪制地圖
Chap14. 保存圖形
Web瀏覽器更支持SVG文件,而LaTeX則更支持PDF文件。
輸出為PDF矢量文件
#width和height的單位為英寸
pdf("myplot.pdf",width=4,height=4,useaDingbats=FALSE)
plot(x,y)
print(ggplot(data,aes(x=x,y=y))+geom_point())
dev.off()
# 如果圖形多于一幅,則每一幅將在PDF輸出中列于獨(dú)立的一頁。
# ggsave()不能用于創(chuàng)建多頁圖形
ggsave("myplot.pdf",width=8,height=8,units="cm",useaDingbats=FALSE)
輸出為SVG矢量文件
svg("myplot.svg",width=4,height=4)
plot()
dev.off()
輸出為WMF矢量文件
Windows圖元文件(WMF),即只能在Windows上創(chuàng)建。
win.metafile("myplot.wmf",width=4,height=4)
plot()
dev.off()
# ggsave()
ggsave("myplot.wmf",width=8,height=8,units="cm")
輸出為點(diǎn)陣(PNG/TIFF)文件
png("myplot.png",width=400,height=400)
plot(x,y)
dev.off()
# 多幅圖形
png("myplot-%d.png",width=400,height=400)
plot()
print(ggplot())
dev.off()
# ggsave函數(shù)
ggsave("myplot.png",width=8,height=8,unit="cm",dpi=300)
# CairoPNG():支持抗鋸齒和alpha通道的特性
install.packages("Cairo")
CairoPNG("myplot.png")
plot()
dev.off()
在圖中顯示中文
# MAC用戶
plot(x, main="散點(diǎn)圖",xlab="數(shù)",ylab="值",family="SimSun")
ggplot(data, aes(x=x,y=y))+
geom_point()+
annotate("text",x=10,y=30,size=10,label="我就是我!",family="SimSun")+
xlab("數(shù)")+
ylab("值")+
theme(title=element_text(family="SimSun"))
一頁多圖
視圖窗口(viewport):顯示設(shè)備的一個(gè)矩陣子區(qū)域。grid.layout() 設(shè)置了一個(gè)任意高和寬的視圖窗口布局。
pdf("myplot.pdf",width=8,height=6)
grid.newpage()
pushViewport(viewport(layout=grid.layout(2,2)))
vplayout = function(x,y){
viewport(layout.pos.row=x, layout.pos.col=y)
}
print(a, vp = vplayout(1, 1:2))
print(b, vp = vplayout(2, 1))
print(c, vp = vplayout(2, 2))
dev.off()
默認(rèn)的grid.layout() 中,每個(gè)單元格的大小都相同,可以設(shè)置widths 和heights 參數(shù)使得它們具有不同的大小。
時(shí)間序列
數(shù)據(jù)下載
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#用excel導(dǎo)入數(shù)據(jù), 格式為csv
ori.data < - read.csv( "lesson8.csv" , header = F)
#以矩陣的方式讀入數(shù)據(jù), 按行排列, 每三列換一行
data < - matrix(as.matrix(ori.data), nrow(ori.data) / 3 , 3 , byrow = TRUE)
#關(guān)閉區(qū)域特定的時(shí)間編碼方式
Sys.setlocale( "LC_TIME" , "C" )
#用as.POSIXlt()讀入字符串?dāng)?shù)據(jù)并轉(zhuǎn)化為date數(shù)據(jù), 賦值給date, 或as.Date()
date < - as.POSIXlt(data[, 1 ], tz = " ", " % a % b % d % H: % M: % S HKT % Y")
#對(duì)ip和pv所在的列轉(zhuǎn)化為數(shù)值型
IP < - as.numeric(data[, 2 ])
PV < - as.numeric(data[, 3 ])
head(data)
#恢復(fù)區(qū)域特地的時(shí)間編碼方式
Sys.setlocale( "LC_TIME" , "")
#用ggplot2繪圖
require(ggplot2)
#用reshape包中的melt函數(shù)分解數(shù)據(jù)
require(reshape2)
p.data < - data.frame(date, IP, PV)
meltdata < - melt(p.data, id = (c( "date" )))
#用對(duì)IP和PV做分頁處理, y軸刻度自由變化
graphic < - ggplot(data = meltdata, aes(x = date, y = value, color = variable)) + geom_line() + geom_point()
graphic < - graphic + facet_grid(variable ~ ., scales = "free_y" )
#美化, 添加標(biāo)題, 坐標(biāo), 更改圖例
graphic< - graphic + labs(x = "日期" , y = "人次" , title = "某網(wǎng)站7月至10月IP/PV統(tǒng)計(jì)" ) +
theme(plot.title = element_text(size = 20 , face = "bold" )) +
scale_colour_discrete(name = " ",labels = c(" IP "," PV")) +
theme(strip.text.y = element_text(angle = 0 ))
|
地圖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
require(maps)
require(ggplot2)
#用直方圖看下pop整體的分布
#可以發(fā)現(xiàn)數(shù)據(jù)分布較變化較大, 所以對(duì)pop做log轉(zhuǎn)化
qplot(pop, data = us.cities, binwidth = 0000 , geom = "histogram" )
qplot(log(pop), data = us.cities, binwidth = 0.03 , geom = "histogram" )
#繪制背景地圖
USA.POP < - ggplot(us.cities, aes(x = long , y = lat)) + xlim( - 130 , - 65 ) + borders( "state" , size = 0.5 ) +
geom_point(aes(size = log(pop), color = factor(capital), alpha = 1 / 50 )) +
#對(duì)size標(biāo)度的調(diào)整參考http://docs./0.9.3.1/scale_size.html
scale_size( range = c( 0 , 7 ), name = "log(City population)" ) +
#對(duì)離散型顏色變量的標(biāo)度調(diào)整參考http://docs./0.9.3.1/scale_manual.html
#對(duì)連續(xù)型顏色標(biāo)量的標(biāo)度調(diào)整參考http://docs./0.9.3.1/scale_brewer.html
#和http://docs./0.9.3.1/scale_gradient2.html
scale_color_manual(values = c( "black" , "red" ), labels = c( "state capital" , "city" )) +
#調(diào)整圖例
guides(color = guide_legend(title = NULL)) + scale_alpha(guide = FALSE) +
#繪制標(biāo)題和坐標(biāo)軸
labs(x = "longtitude" , y = "latitude" , title = "City Population in the United States" ) +
theme(plot.title = element_text(size = 20 ))
#輸出圖像 并用cairo包進(jìn)行抗鋸齒處理
ggsave(USA.POP, file = "USA_POP.png" , type = "cairo" , width = 10 , height = 6.75 )
|
當(dāng)然, 這只是簡(jiǎn)單的地圖繪制方法,統(tǒng)計(jì)之都上也有很多大牛來用R繪制各種各樣精美的地圖(1, 2)。
劑量-效應(yīng)曲線
R中的drc包很容易對(duì)各種劑量-效應(yīng)曲線進(jìn)行繪圖, 此處采用較為常用的log-logistic四參數(shù)方程擬合了劑量-效應(yīng)曲線。
數(shù)據(jù)下載
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
ori.data < - read.csv( "D-R curve.csv" )
require(drc)
require(reshape2)
#把數(shù)據(jù)融合
melt.data < - melt(ori.data, id = c( "dose" ), value.name = "response" )[, - 2 ]
#用drc包中的log-logistic四參數(shù)方程進(jìn)行擬合建模
model < - drm(response ~ dose, data = melt.data, fct = LL. 4 (names = c( "Slope" , "Lower Limit" , "Upper Limit" , "EC50" )))
#確定x軸范圍并構(gòu)建數(shù)據(jù)集
min < - range (ori.data$dose)[ 1 ]
max < - range (ori.data$dose)[ 2 ]
line.data < - data.frame(d.predict = seq( min , max , length.out = 1000 ))
#用模型預(yù)測(cè)數(shù)據(jù)構(gòu)建數(shù)據(jù)集
line.data$p.predict < - predict(model, newdata = line.data)
#構(gòu)建繪圖數(shù)據(jù), 能夠計(jì)算誤差棒
require(plyr)
p.data < - ddply(melt.data, .(dose), colwise(mean))
p.data$sd < - ddply(melt.data, .(dose), colwise(sd))[, 2 ]
require(ggplot2)
p < - ggplot() +
geom_errorbar(data = p.data, width = 0.1 , size = 1 ,
aes(ymax = response + sd, ymin = response - sd, x = dose)) +
geom_point(data = p.data, aes(x = dose, y = response),
color = "red" , alpha = 0.5 , size = 5 ) +
geom_line(data = line.data, aes(x = d.predict, y = p.predict),
size = 1 , color = "blue" ) +
#改變坐標(biāo)軸間隔
scale_x_log10(name = "Dose" ,
breaks = c( 0.05 , 0.1 , 0.5 , 1 , 5 , 10 , 50 , 100 )) +
scale_y_continuous(name = "Response" ) +
theme_bw()
#查看擬合模型參數(shù)
summary(model)
|
現(xiàn)代線條藝術(shù)欣賞
1 羽毛圖
1
2
3
4
5
6
7
8
9
10
11
12
13
|
x1 = c(seq(0, pi, length = 50), seq(pi, 2*pi, length = 50))
y1 = cos(x1) / sin(x1)
x2 = seq(1.02 * 2 * pi + pi/2, 4*pi + pi/2, length = 50)
y2 = tan(x2)
op = par(bg="black", mar=rep(.5,4))
plot(c(x1, x2), c(y1, y2), type = "n", ylim = c(-11, 11))
for (i in seq(-10, 10, length = 100))
{
lines(x1, y1 + i, col = hsv(runif(1,.65,.7), 1, 1, runif(1,.7)),
lwd = 4 * runif(1, 0.3))
lines(x2, y2 + i, col = hsv(runif(1,.65,.7), 1, 1, runif(1,.7)),
lwd = 4 * runif(1, 0.3))
}
|
2 心形圖
|
theta = seq(-2 * pi, 2 * pi, length = 300)
x = cos(theta)
y = x + sin(theta)
op = par(bg = "black", mar = rep(0.1, 4))
plot(x, y, type = "n", xlim = c(-8, 8), ylim = c(-1.5, 1.5))
for (i in seq(-2*pi, 2*pi, length = 100))
{
lines(i*x, y, col = hsv(runif(1, 0.85, 0.95), 1, 1, runif(1, 0.2, 0.5)),
lwd = sample(seq(.5, 3, length = 10), 1))
}
|
3 幻圈圖
|
theta = 1:100
x = sin(theta)
y = cos(theta)
op = par(bg = 'black', mar = rep(0.5, 4))
plot.new()
plot.window(xlim = c(-1, 1), ylim = c(-1, 1), asp = 1)
lines(x, y, col = hsv(0.65, 1, 1))
lines(0.8 * x, 0.8 * y, col = hsv(0.8, 1, 1))
lines(0.6 * x, 0.6 * y, col = hsv(0.9, 1, 1))
lines(0.4 * x, 0.4 * y, col = hsv(0.95, 1, 1))
|
4 土星環(huán)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
x = seq(-50, 50, by = 1)
y = -(x^2)
op = par(bg = 'black', mar = rep(0.5, 4))
plot(y, x, type = 'n')
lines(y, x, lwd = 2*runif(1), col = hsv(0.08, 1, 1, alpha = runif(1, 0.5, 0.9)))
for (i in seq(10, 2500, 10))
{
lines(y-i, x, lwd = 2*runif(1), col = hsv(0.08, 1, 1, alpha = runif(1, 0.5,
0.9)))
}
for (i in seq(500, 600, 10))
{
lines(y - i, x, lwd = 2*runif(1), col = hsv(0, 1, 1, alpha = runif(1, 0.5, 0.9)))
}
for (i in seq(2000, 2300, 10))
{
lines(y - i, x, lwd = 2*runif(1), col = hsv(0, 1, 1, alpha = runif(1, 0.5,
0.9)))
}
for (i in seq(100, 150, 10))
{
lines(y - i, x, lwd = 2*runif(1), col = hsv(0, 1, 1, alpha = runif(1, 0.5, 0.9)))
}
|
5 字母印象
1
2
3
4
5
6
7
8
9
10
11
12
|
nx = 100
ny = 80
x = sample(x = 1:nx, size = 90, replace = TRUE)
y = seq(-1, -ny, length = 90)
op = par(bg = "black", mar = c(0, 0.2, 0, 0.2))
plot(1:nx, seq(-1, -nx), type = "n", xlim = c(1, nx), ylim = c(-ny+10, 1))
for (i in seq_along(x))
{
aux = sample(1:ny, 1)
points(rep(x[i], aux), y[1:aux], pch = sample(letters, aux, replace = TRUE),
col = hsv(0.35, 1, 1, runif(aux, 0.3)), cex = runif(aux, 0.3))
}
|
6 絢麗霞光
|
theta = seq(0, pi, length = 300)
x = cos(theta)
y = sin(theta)
op = par(bg = "black", mar = rep(0.5, 4))
plot(x, y, type = 'n')
segments(rep(0, 299), rep(0, 299), x[1:299] * runif(299, 0.7),
y[1:299] * runif(299, 0.7),
col = hsv(runif(299, 0.45, 0.55), 1, 1, runif(299, 0.5)),
lwd = 5*runif(299))
|
|