午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

R

 醫(yī)學(xué)院的石頭 2018-05-11

分析數(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ǔ)

## 加載文件

  1. 默認(rèn)情況下,數(shù)據(jù)集中的字符串(String)會(huì)被視為因子(Factor)處理,此時(shí)可以設(shè)置stringAsFactors = FALSE,將文本變量視為字符串表示。
  2. 讀取xlsx和xls文件:packagexlsx(Java)和gdata(Perl)
  3. 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))

條形圖

  1. barplot()第一個(gè)向量用來設(shè)定條形的高度,第二個(gè)向量用來設(shè)定每個(gè)條形對(duì)應(yīng)的標(biāo)簽(可選)。
  2. 變量值條形圖: 兩個(gè)輸入變量,x為分類變量,y表示變量值
  3. 頻數(shù)條形圖:一個(gè)輸入變量,需要注意連續(xù)x軸和離散x軸的差異。

直方圖

與條形圖不同的地方在于,x為連續(xù)型變量

箱線圖

  1. 需要傳遞兩個(gè)向量:x和y
  2. 在x軸上引入兩變量的交互:interaction()
  3. 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ù)

  1. fill:改變條形圖的填充色;colour:添加邊框線;position:改變條形圖的類型;linetype:線型
  2. scale_fill_brewer()scale_fill_manual()設(shè)置顏色
  3. scale_fill_brewer(palette="Pastell")

條形圖

  1. 頻數(shù)條形圖:只需要一個(gè)輸入變量,當(dāng)變量為連續(xù)型變量時(shí),等價(jià)于直方圖。
  2. 顏色映射在aes()內(nèi)部完成,而顏色的重新設(shè)定在aes()外部完成。
  3. 排序:ggplot(upc, aes=(x=reorder(Abb, Change)), y =Change, fill = Region)
  4. 正負(fù)條形圖著色:首先,創(chuàng)建一個(gè)對(duì)取值正負(fù)情況進(jìn)行標(biāo)示的變量,然后參數(shù)設(shè)定為position='identity',這可以避免系統(tǒng)因?qū)ω?fù)值繪制堆積條形而發(fā)出的警告信息。
  5. guide=FALSE刪除圖例
  6. width調(diào)整條形圖的條形寬度;position_dodge(0.7)調(diào)整條形間距(中心距離)
  7. 堆積條形圖:geom_bar(stat='identity')默認(rèn)情況
  8. 更改圖例顏色順序:guides(fill = guide_legend(reverse=TRUE))
  9. 調(diào)用調(diào)色板 scale_fill_brewer(palette='Pastell')和手動(dòng):scale_fill_manual()
  10. 百分比堆積圖:首先利用plyr包種的ddply()轉(zhuǎn)化數(shù)據(jù),然后再繪圖.
  11. 添加 數(shù)據(jù)標(biāo)簽:geom_text(aes(y = label_y, label=Weight),vjust=xxx)其中y用來控制標(biāo)簽的位置
  12. 繪制Cleveland點(diǎn)圖:通常都會(huì)設(shè)置成根據(jù)x軸對(duì)應(yīng)的連續(xù)變量的大小取值對(duì)數(shù)據(jù)進(jìn)行排序。
  13. reorder(x,y):先將x轉(zhuǎn)化為因子,然后根據(jù)y對(duì)其進(jìn)行排序。
  14. 主題系統(tǒng)(Theming System):theme(panel.grid.major.x = element_blank(),panel.grid.minor.x = element_blank())

匯總好的數(shù)據(jù)集繪制條形圖:

  1. x <- c('A','B','C','D','E')
  2. y <- c(13,22,16,31,8)
  3. df <- data.frame(x= x, y = y)
  4. 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ù)集繪制條形圖:

  1. 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í),該如何正確繪制條形圖?

  1. set.seed(1234)
  2. x <- sample(c(1,2,4,6,7), size = 1000, replace = TRUE,prob = c(0.1,0.2,0.2,0.3,0.2))
  3. 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),如下圖所示:

  1. 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è)置條形圖的填充色和邊框色,例如:

  1. 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è)離散變量的條形圖即簇條形圖該如何處理呢?具體見下方例子:

  1. x <- rep(1:5, each = 3)
  2. y <- rep(c('A','B','C'),times = 5)
  3. set.seed(1234)
  4. z <- round(runif(min = 10, max = 20, n = 15)) df <- data.frame(x= x, y = y, z = z)
  5. 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ù),查看一下條形圖的擺放形式。

堆疊式:

  1. 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è)置即可,如下所示:

  1. 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)即可。

百分比堆疊式:

  1. 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è)比較方便

  1. col <- c('darkred','skyblue','purple')
  2. 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)

plot of chunk unnamed-chunk-5

統(tǒng)計(jì)方法有輸入,有輸出。通常輸入為x和y。輸出值會(huì)以例的形式追加到當(dāng)前操作的數(shù)據(jù)拷貝中。比如上例中的stat_bin函數(shù),就會(huì)生成四列新數(shù)據(jù),分別為count, density, ncount以及ndensity。在訪問這些新列的時(shí)候,使用..name..的方式。

 該如何繪制有序的條形圖?

  1. #不經(jīng)排序的條形圖,默認(rèn)按x值的順序產(chǎn)生條形圖
  2. x <- c('A','B','C','D','E','F','G')
  3. y <-c('xx','yy','yy','xx','xx','xx','yy')
  4. z <- c(10,33,12,9,16,23,11) 
  5. df<- data.frame(x = x, y = y, z = z)
  6. ggplot(data = df, mapping = aes(x= x, y = z, fill = y)) + geom_bar(stat = 'identity')

按z值的大小,重新排列條形圖的順序,只需將aes()中x的屬性用reorder()函數(shù)更改即可。

  1. 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ū)分開來,并去除圖例

  1. 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)。

  1. 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)整條形寬度和條形距離

  1. 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è)案例開始:

  1. # 添加標(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)簽的大小、顏色、位置等。

  1. 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)簽水平居中放置。

  1. ggplot(data = df, mapping = aes(x = x, y = z, fill = y)) + geom_bar(stat
  2. = 'identity', position = 'dodge') + geom_text(mapping = aes(label = z),
  3. 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)簽水平居中放置。

  1. ggplot(data = df, mapping = aes(x = x, y = z, fill = y)) + geom_bar(stat
  2. = 'identity', position = 'stack') + geom_text(mapping = aes(label = z),
  3. 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)單折線圖

geom_line()
  1. 對(duì)于因子型變量,必須使用aes(group=1)以確保ggplot()知道這些數(shù)據(jù)點(diǎn)屬于同一個(gè)分組,從而應(yīng)該用一條折線連在一起。
  2. 數(shù)據(jù)標(biāo)記相互重疊:需要相應(yīng)地左移或者右移連接線以避免點(diǎn)線偏離。geom_line(position=position_dodge(0.2))
  3. 參數(shù):線型(linetype),線寬(size),顏色(colour):邊框線
  4. aes()函數(shù)外部設(shè)定顏色、線寬、線型和點(diǎn)型等參數(shù)會(huì)將所有目標(biāo)對(duì)象設(shè)定為同樣的參數(shù)值。
  5. 面積圖:geom_area(),alpha調(diào)節(jié)透明度
  6. 堆積面積圖:geom_area()基礎(chǔ)上,映射一個(gè)因子型比那里給填充色(fill)即可
  7. 添加置信域: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)圖

geom_point()
  1. 參數(shù)值:shape(),size=2,colour()
  2. 更改配色與點(diǎn)形:scale_colour/shape_brewer/manual()
  3. 盡量將不需要高精度的變量映射給圖形的大小和顏色屬性。
  4. 調(diào)用scale_size_area()函數(shù)使數(shù)據(jù)點(diǎn)的面積正比于變量值。
  5. 處理圖形重疊問題(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)。
  6. 添加回歸模型擬合線:stat_smooth(method=lm,level=0.95)
  7. 添加自己構(gòu)建的模型擬合線:geom_line(data=predicted,size=1)
  8. dlply()ldply()函數(shù):切分?jǐn)?shù)據(jù),對(duì)各個(gè)部分執(zhí)行某一函數(shù),并對(duì)執(zhí)行結(jié)果進(jìn)行重組。
  9. 散點(diǎn)圖中添加模型系數(shù):+ annotate(parse = TRUE)函數(shù)添加文本。利用expression()檢驗(yàn)輸出結(jié)果
  10. 添加邊際地毯(Marginal rugs):geom_rug()
  11. 添加標(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
  12. 繪制氣泡圖:geom_point()scale_size_area(max_size=15)
  13. 散點(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。

1
2
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn)) + geom_point()

基本散點(diǎn)圖

可以使用shape和size分別指定點(diǎn)型和點(diǎn)的大小,如果點(diǎn)型包括填充和描邊的話,可用fill和color分別指定填充色和描邊色。

2 基于類別型變量分組

可將分組變量(因子或字符變量)賦值給顏色或形狀屬性,實(shí)現(xiàn)分組散點(diǎn)圖的繪制

可以將因子和字符串等類別型變量映射到散點(diǎn)的顏色或形狀。

1
2
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, shape=sex, color=sex)) + geom_point()

分組散點(diǎn)圖

 

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ì)顏色和大小的變化則不那么敏感。 

1
2
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, size=weightLb, color=weightLb)) + geom_point()

連續(xù)散點(diǎn)圖

同時(shí)映射類別型變量和連續(xù)型變量,并設(shè)置散點(diǎn)的面積正比于連續(xù)型變量的大小,默認(rèn)為非線性映射。

1
2
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è)置透明度;
  • 使用矩形和六邊形等分箱,并且用顏色表示密度。
1
2
3
4
5
6
7
8
9
10
11
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)分離開來。 

1
2
3
4
5
6
7
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)。 

1
2
3
4
5
6
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"))

Logistic回歸

如果已經(jīng)將類別型變量映射到散點(diǎn)的顏色或形狀,則在添加擬合線時(shí)會(huì)分別為每一組添加一條擬合線??梢钥吹缴砀唠S著年齡增長(zhǎng)而增加,到一定年齡后停止增長(zhǎng),且男性比女性平均身高更高。

1
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)圖。

1
pairs(~ mpg + disp + drat + wt, data=mtcars, main="Basic Scatter Plot Matrix")

pairs()函數(shù)創(chuàng)建的散點(diǎn)圖矩陣

car包的scatterplotMatrix()函數(shù)也可以生成散點(diǎn)圖矩陣,并支持以下操作:

  • 以某個(gè)因子為條件繪制散點(diǎn)圖矩陣;
  • 包含線型和平滑擬合曲線;
  • 在主對(duì)角線放置箱線圖、密度圖或者直方圖;
  • 在各單元格的邊界添加軸須圖。
1
2
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ì)稱信息的直線。

scatterplotMatrix()函數(shù)

再來一個(gè)scatterplotMatrix()函數(shù)的使用例子,主對(duì)角線的核密度曲線改為了直方圖,并且直方圖以汽車氣缸數(shù)為條件繪制。 

1
2
library(car)
scatterplotMatrix(~ mpg + disp + drat + wt|cyl, data=mtcars, spread=FALSE, diagonal="histogram", main="Scatter Plot Matrix via car Package")

scatterplotMatrix()函數(shù)另一個(gè)例子

gclus包中的cpairs()函數(shù)提供了一個(gè)有趣的散點(diǎn)圖矩陣變種,支持重排矩陣中變量的位置,讓相關(guān)性更高的變量更靠近主對(duì)角線,還可以對(duì)各單元格進(jìn)行顏色編碼來展示變量間的相關(guān)性大小。

首先查看各個(gè)變量之間相關(guān)性的大小:

1
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)圖矩陣中的這些變量重新排序并著色。

1
2
3
4
5
6
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")

按相關(guān)性排序并著色后的散點(diǎn)圖矩陣

高密度散點(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)圖。

1
2
3
4
5
6
7
8
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")

smoothScatter

hexbin包中的hexbin()函數(shù)將二元變量的封箱放到六邊形單元格中。

1
2
3
library(hexbin)
bin <- hexbin(mydata$x, mydata$y, xbins=50)
plot(bin, main="Hexagonal Binning with 10000 Observations")

hexbin包中的hexbin()函數(shù)

IDPmisc包中的iplot()函數(shù)也可以通過顏色來展示點(diǎn)的密度。 

1
2
library(IDPmisc)
iplot(mydata$x, mydata$y, main="Image Scatter Plot with Color Indicating Density")

 

IDPmisc包中的iplot()函數(shù)

三維散點(diǎn)圖

如果想一次性對(duì)三個(gè)定量變量的交互進(jìn)行可視化,那么可以使用scatterplot3d中的scatterplot3d()函數(shù)進(jìn)行繪制。

1
2
3
4
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg, main="Basic 3D Scatter Plot")
detach(mtcars)

最基本的三維散點(diǎn)圖

scatterplot3d()函數(shù)提供了許多選項(xiàng),包括設(shè)置圖形符號(hào)、軸、顏色、線條、網(wǎng)格線、突出顯示和角度等功能。例如以下代碼生成一幅突出顯示效果的三維散點(diǎn)圖,增強(qiáng)了縱深感并添加了連接點(diǎn)與水平面的垂直線。

1
2
3
4
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE, type="h", main="3D Scatter Plot with Vertical Lines")
detach(mtcars)

帶縱深效果和垂直線的三維散點(diǎn)圖

還可以再加上一個(gè)回歸面。

1
2
3
4
5
6
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)。

1
2
3
4
library(rgl)
attach(mtcars)
plot3d(wt, disp, mpg, col="red", size=5)
detach(mtcars)

Rcmdr包中的scatter3d()函數(shù)可以實(shí)現(xiàn)類似功能。

1
2
3
4
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)添加偏移,以改善顯示效果。 

1
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)

添加文本標(biāo)注

8 使用氣泡圖繪制二維統(tǒng)計(jì)

以下使用散點(diǎn)圖繪制氣泡圖,對(duì)兩個(gè)類別型變量進(jìn)行統(tǒng)計(jì)。

1
2
3
4
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)

氣泡圖二維統(tǒng)計(jì)

 

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ù)分布可視化方法

直方圖

  1. geom_histogram()
  2. binwidth設(shè)置組距;origin設(shè)置分組原點(diǎn)
  3. 各分組區(qū)間左閉右開
  4. 分面: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)

itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總 
直方圖默認(rèn)最大為30組,我們可以使用*binwidth來改變。

ggplot(faithful, aes(x=waiting)) +geom_histogram(binwidth=8, bins=10,fill="white", colour="black")#改為8組

itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總

分組直方圖

分組直方圖做法與其他圖形一樣,我們用到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 ~ .)

itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總

核密度曲線

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)

itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總 
itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總 
itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總 
itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總

分組密度曲線

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)

itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總

 

頻數(shù)多邊形

geom_freqpoly()

頻數(shù)多邊形描述了數(shù)據(jù)本身的信息,而核密度曲線只是一個(gè)估計(jì),需要認(rèn)為輸入帶寬參數(shù)。

箱線圖

geom_boxplot()
  1. 參數(shù):width,outlier.size,outlier.shape
  2. 添加槽口(notch):用來幫助查看不同分布的中位數(shù)是否有差異。
  3. 添加均值: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")

itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總 
itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總 
itdadao-R語言ggplot包之?dāng)?shù)據(jù)分布匯總

小提琴圖

geom_violin()
  1. 小提琴圖用來比較多組數(shù)據(jù)分布情況的方法,其也是核密度估計(jì)。
  2. 坐標(biāo)范圍:從最小值到最大值,與箱線圖不同。
  3. 參數(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)圖

geom_dotplot()
  1. Wilkinson點(diǎn)圖:沿著x軸方向?qū)?shù)據(jù)進(jìn)行分組,并在y軸上對(duì)點(diǎn)進(jìn)行堆積。圖形上Y軸的刻度線沒有明確的含義。
  2. 備注:移除刻度線scale_y_continuous(break=NULL),移除坐標(biāo)軸標(biāo)簽theme(axis.title.y=element_blank())
  3. 參數(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. 注解

文本注解

  1. geom_text()
  2. annotate():可以添加任意類型的幾何對(duì)象。 annotate("text",x=,y=,label=,...)

數(shù)學(xué)表達(dá)式

  1. annotate("text",...,parse=TRUE,...)
  2. 引入常規(guī)文本:在雙引號(hào)內(nèi)使用單引號(hào)標(biāo)出純文本的部分即可。
  3. 不能簡(jiǎn)單地把一個(gè)變量之間放到另一個(gè)變量旁邊卻不在中間添加任何記號(hào)。
  4. ?plotmath?demo(plotmath)

添加直線

  1. 橫線和豎線geom_hline(yintercept=) & geom_vline()
  2. 有角度的直線:geom_abline(intercept=,slope=)

添加線段和箭頭

  1. 線段:annotate("segment",x=,xend=,y=,yend=)
  2. 利用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分別指定字體、顏色、大小。

1
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)行公式解析。

1
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,依此類推。

1
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)

同樣可以通過指定類別型變量繪制多條直線。

1
2
3
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,依次類推。

1
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()使用。 

1
2
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()。

1
2
3
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è)分面添加擬合直線公式的例子。

1
2
3
4
5
6
7
8
9
10
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)軸的值域

  1. ylim()或者xlim()
  2. 全稱:scale_y_continuous(limits=c(,),breaks=c(.,.,.))
  3. 注意區(qū)分scale_y_continuous()coord_cartesian();其中前者表示使用標(biāo)度限制y到更小的范圍,范圍外的數(shù)據(jù)被丟棄,而后者則是利用坐標(biāo)變換放大或縮小了數(shù)據(jù)。
  4. 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)軸添加刻度

annotation_logticks()

坐標(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)軸。 

1
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() + coord_flip()

 2 設(shè)置連續(xù)型坐標(biāo)軸的值域

可以使用xlim()和ylim()來設(shè)置連續(xù)型坐標(biāo)軸的最小值和最大值。

1
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() + ylim(0, max(PlantGrowth$weight))

ylim()是scale_y_continuous()的簡(jiǎn)化寫法,后者還可以使用breaks設(shè)置刻度線的位置。

1
2
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)的值,則該類別在繪圖中將不顯示。

1
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() + scale_x_discrete(limits=c("trt1", "ctrl", "trt2"))

以下代碼反轉(zhuǎn)類別型坐標(biāo)軸的項(xiàng)目順序。

1
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é)果。

1
2
library(gcookbook)
ggplot(marathon, aes(x=Half, y=Full)) + geom_point() + coord_fixed()

如果希望使用其他縮放比例時(shí),在coord_fixed()中指定ratio即可。

1
ggplot(marathon, aes(x=Half, y=Full)) + geom_point() + coord_fixed(ratio=1/2)

 6 修改刻度標(biāo)簽的文本

在需要設(shè)置刻度標(biāo)簽的地方同時(shí)為breaks和labels賦值即可。

1
2
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)簽。

1
2
3
4
5
6
7
# 將英寸轉(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è)置全局字體,參考這里。

1
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)軸更有意義。 

1
2
library(MASS)
ggplot(Animals, aes(x=body, y=brain, label=rownames(Animals))) + geom_text(size=3) + scale_x_log10() + scale_y_log10()

體重和大腦重量的對(duì)數(shù)線性關(guān)系

9 繪制極坐標(biāo)

使用coord_polar()即可繪制極坐標(biāo)。 

1
2
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))

風(fēng)向風(fēng)力極坐標(biāo)

然而,由于極坐標(biāo)的原因,扇形大小并不能直觀反映出實(shí)際的觀測(cè)數(shù)量,而且多種顏色混雜難以讓人對(duì)風(fēng)力有直觀的感受,因此我們需要改變一下樣式。

1
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()

修改樣式后的極坐標(biāo)

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_rectelement_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)色板Set1Dark2;對(duì)面積而言,Set2、Pastel1Pastel2Accent都是不錯(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è)置widthsheights參數(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繪制各種各樣精美的地圖(12)。


劑量-效應(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 心形圖

1
2
3
4
5
6
7
8
9
10
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 幻圈圖

1
2
3
4
5
6
7
8
9
10
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)))
}

土星環(huán)

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 絢麗霞光

1
2
3
4
5
6
7
8
9
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))

絢麗霞光


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多