1 ggplot2特點(diǎn)
2 ggplot2基本概念
3 ggplot2語(yǔ)法框架繪圖流程: ggplot(data, aes(x = , y = )) + # 基礎(chǔ)圖層,不出現(xiàn)任何圖形元素,, 3.1 共性映射與個(gè)性映射
3.2 幾何對(duì)象與統(tǒng)計(jì)變換
3.3 aes與data參數(shù)
4 |
幾何對(duì)象函數(shù) | 描述 | 其它 |
---|---|---|
geom_point | 點(diǎn)圖 | geom_point(position = 'jitter') == geom_jitter() 避免重疊 |
geom_line | 折線圖 | 可以通過(guò)smooth參數(shù)平滑處理 |
geom_bar | 柱形圖 | x軸是離散變量 |
geom_area | 面積圖 | |
geom_histogram | 直方圖 | x軸數(shù)據(jù)是連續(xù)的 |
geom_boxplot | 箱線圖 | |
geom_rect | 二維長(zhǎng)方形圖 | |
geom_segment | 線段圖 | |
geom_path | 幾何路徑 | 由一組點(diǎn)按順序連接 |
geom_curve | 曲線 | |
geom_abline | 斜線 | 有斜率和截距指定 |
geom_hline | 水平線 | 常用于坐標(biāo)軸繪制 |
geom_vline | 豎線 | 常用于坐標(biāo)軸繪制 |
geom_text | 文本 |
ggplot2唯一不支持的常規(guī)平面圖形是雷達(dá)圖
其它幾何對(duì)象查詢(xún):
ggplot2 part of the tidyverse
ggplot2 Quick Reference: geom
也可以用
ls(pattern = '^geom_', env = as.environment('package:ggplot2'))
查詢(xún),,但是沒(méi)有圖形示例
library(ggplot2)
ls(pattern = '^geom_', env = as.environment('package:ggplot2'))
柱形圖和散點(diǎn)圖是關(guān)鍵,并且與極坐標(biāo)變換緊密相連,,著重介紹柱形圖和散點(diǎn)圖,,其它的原理和參數(shù)都類(lèi)似
能用作變量映射的包括:
美學(xué)參數(shù) | 描述 |
---|---|
color/col/colour | 指定點(diǎn)、線和填充區(qū)域邊界的顏色 |
fill | 指定填充區(qū)域的顏色,,如條形和密度區(qū)域,, 第21到24號(hào)點(diǎn)也有填充色 |
alpha | 指定顏色的透明度,從0(完全透明) 到 1(不透明) |
size | 指定點(diǎn)的尺寸或線的寬度,單位為mm |
angle | 角度,,只有部分幾何對(duì)象有,如geom_text文本的擺放角度, geom_spoke中短棒擺放角度 |
linetype | 指定線條的類(lèi)型 |
shape | 點(diǎn)的形狀, 為[0, 25]區(qū)間的26個(gè)整數(shù) |
vjust | 垂直位置微調(diào),,在(0, 1)區(qū)間的數(shù)字或位置字符串: 0=“buttom”, 0.5=“middle”, 1=“top” , 區(qū)間外的數(shù)字微調(diào)比例控制不均 |
hjust | 水平位置微調(diào),在(0, 1)區(qū)間的數(shù)字或位置字符串:0=“l(fā)eft”, 0.5=“center”, 1=“right” ,, 區(qū)間外的數(shù)字微調(diào)比例控制不均 |
不常映射的參數(shù) | 描述 |
---|---|
binwidth | 直方圖的寬度 |
notch | 表示方塊圖是否應(yīng)為缺口 |
sides | 表示地毯圖的安置位置(“b”底部, “l(fā)”左部, “t”頂部, “r”右部, “bl”左下角, 等等) |
width | 箱線圖或柱形圖的寬度,,從(0, 1), 柱形圖默認(rèn)0.9即90% |
lineend | 表示指定寬線條端部形狀,有3種:“round”半圓形,,“square”增加方形, “butt”默認(rèn)不變,, 常用于geom_path和geom_line幾何對(duì)象 |
family | 字體(Font face),內(nèi)置的只有3種:“sans”, “serif”, “mono” |
fontface | 字型,,分為: “plain”常規(guī)體, “bold”粗體, “italic”斜體, “bold.italic”粗斜體,。常用于geom_text等文本對(duì)象 |
lineheight | 長(zhǎng)文本換行行距, 常用于geom_text等文本對(duì)象 |
R自身自持很多種方式的顏色,“顏色名稱(chēng)”和“HEX色值”最常用和方便,,其它的需要擴(kuò)展包
顏色名稱(chēng)如:
“white”, “azure”, “bisque”, “blue”, “black”, “brown”, “chacolate”, “coral”, “cornsilk”, “cyan”, “gold” ,
“darkgolden”, “orange”, “orchild”, “gray”, “grey”, “tomato”, “violet”, “wheat”, “yellow”, “pink”,
“purple”, “red”, “salmon”, “seashell”, “ivory”,“magentia”,“navy”等系列,。
所有的顏色名稱(chēng)見(jiàn): R_Color_Chart(后臺(tái)回復(fù):顏色,可下載PDF版本)
如果對(duì)一組顏色進(jìn)行映射的話,,建議使用RColorBrewer等調(diào)色包,,更加方便
RColorBrewer顏色板如下,,左邊為字符串編號(hào),,上下分為3個(gè)版塊,分別為漸變色板Sequential,,離散對(duì)比色板Qualitative,,兩極色板Diverging
# colors() # 調(diào)用所有內(nèi)置顏色編號(hào),名稱(chēng)
scales::show_col(colors()[1:6]) # show_col函數(shù)可以將顏色名稱(chēng)或HEX色值向量顯示出來(lái)
# RColorBrewer包使用
library('RColorBrewer')
display.brewer.all() # 顯示所有可用色板
display.brewer.all(type = 'seq') # 查看漸變色板
RColorBrewer使用方法:
通過(guò)函數(shù)brewer.pal(n, name)
抽取色條名字為name的n種顏色,,后面還可以用“[]”索引符號(hào)索取色塊,,
一個(gè)幾何對(duì)象設(shè)置多種顏色只能在標(biāo)度中設(shè)置,我們會(huì)在標(biāo)度中繼續(xù)講解,,例:
library('RColorBrewer')
display.brewer.pal(7, 'PuRd') # 抽取PuRd色條7種顏色,,其顏色色值范圍沒(méi)有變,只是色值間隔增大了
display.brewer.pal(9, 'PuRd')[11] # 抽取PuRd色條11種顏色,,其顏色色值范圍沒(méi)有變,,指定色值間隔減小了
線條形狀通過(guò)名稱(chēng)或整數(shù)指定:
線型 | 描述 |
---|---|
0=“blank” | 白線 |
1=“solid” | 實(shí)線 |
2=“dashed” | 短虛線 |
3=“dotted” | 點(diǎn)線 |
4=“dotdash” | 點(diǎn)橫線 |
5=“l(fā)ongdash” | 長(zhǎng)虛線 |
6=“twodash” | 短長(zhǎng)虛線 |
自定義線型
通過(guò)1個(gè)十六進(jìn)制的字符串來(lái)自定義,字符串長(zhǎng)度為2,、4,、6或8。
第1個(gè)數(shù)字為代表閉合的長(zhǎng)度,,第2個(gè)數(shù)字代表缺口的長(zhǎng)度,,第3個(gè)數(shù)字又是閉合的長(zhǎng)度,第4個(gè)數(shù)字是缺口的長(zhǎng)度,如此交替排列,。 然后作為一個(gè)整體重復(fù)排列
如:
* 字符串“33”代表開(kāi)始3個(gè)單位長(zhǎng)度閉合,,產(chǎn)生短橫線,然后缺口長(zhǎng)度也是3個(gè)單位,,這樣作為一個(gè)整體進(jìn)行重復(fù)排列
* 字符串“81”代表開(kāi)始8個(gè)單位長(zhǎng)度閉合,,產(chǎn)生較長(zhǎng)的橫線,然后缺口長(zhǎng)度為1個(gè)單位,,這樣作為一個(gè)整體重復(fù)排列
* 字符串“f8”表示開(kāi)始16個(gè)單位長(zhǎng)度閉合,,產(chǎn)生長(zhǎng)橫線,然后缺口長(zhǎng)度為8個(gè)單位,,這樣作為一個(gè)整體重復(fù)排列
* 字符串“357a”表示開(kāi)始3個(gè)單位長(zhǎng)度閉合,,產(chǎn)生短橫線,然后缺口5個(gè)單位,,然后閉合7個(gè)單位,,最后缺口11個(gè)單位,這樣整體重復(fù)排列
如圖所示:
library(ggplot2)
lty <- c('solid', 'dashed', 'dotted', 'dotdash', 'longdash', 'twodash')
linetypes <- data.frame(
y = seq_along(lty), # seq_along表示生成與對(duì)象同樣長(zhǎng)度的序列
lty = lty
)
ggplot(linetypes, aes(0, y)) +
geom_segment(aes(xend = 5, yend = y, linetype = lty)) + # 將一個(gè)變量映射到線型
scale_linetype_identity() +
geom_text(aes(label = lty), hjust = 0, nudge_y = 0.2) +
scale_x_continuous(NULL, breaks = NULL) +
scale_y_reverse(NULL, breaks = NULL)
# 自定義線型
lty <- c('33', '18', '81', 'f8', '5f', '357a', '5a73', '342167', 'a23f45b6') # 自定義9種線型
linetypes <- data.frame(
y = seq_along(lty),
lty = lty
)
ggplot(linetypes, aes(0, y)) +
geom_segment(aes(xend = 5, yend = y, linetype = lty)) + # 將一個(gè)變量映射到線型
scale_linetype_identity() +
geom_text(aes(label = lty), hjust = 0, nudge_y = 0.2) +
scale_x_continuous(NULL, breaks = NULL) +
scale_y_reverse(NULL, breaks = NULL)
[0, 25]個(gè)序號(hào)代表26種點(diǎn)型,, 只有21到26號(hào)點(diǎn)形能fill顏色,,其它都只有輪廓顏色,
序號(hào)32:127對(duì)應(yīng)ASCII字符
所有序號(hào)如圖所示:
library('ggplot2')
d = data.frame(p = c(0:25, 32:127))
ggplot() + scale_y_continuous(name = '') + scale_x_continuous(name = '') + scale_shape_identity() +
geom_point(data = d, mapping = aes(x = p%%16, y = p%/%16, shape = p), size = 5,
fill = 'red') + geom_text(data = d, mapping = aes(x = p%%16, y = p%/%16 +
0.25, label = p), size = 3)
內(nèi)置的只有3種,,可以通過(guò)擴(kuò)展包extrafont來(lái)將其它字體轉(zhuǎn)換為ggplot2可識(shí)別的標(biāo)準(zhǔn)形式 還可以通過(guò)showtext包以圖片的形式將字體插入到ggplot2圖中,,對(duì)于公式之類(lèi)的特殊字體特別方便,比Latex容易爆了
library('ggplot2')
df <- data.frame(x = c(0.4, 0.6, 0.8), y = 1:3, family = c('sans', 'serif',
'mono'))
ggplot(df, aes(x, y)) + geom_text(aes(label = family, family = family), size = 15) +
xlim(0.2, 1) + ylim(0, 4)
分為4類(lèi):“plain”常規(guī)體, “bold”粗體, “italic”斜體, “bold.italic”粗斜體
library('ggplot2')
df <- data.frame(x = c(1, 1.5, 3, 3.5), y = c(2, 1, 1, 2), fontface = c('plain',
'bold', 'italic', 'bold.italic'))
ggplot(df, aes(x, y)) + geom_text(aes(label = fontface, fontface = fontface),
size = 15) + xlim(0, 5.5) + ylim(0.5, 2.5)
vjust: “top” = 1, “middle” = 0.5, “bottom” = 0
hjust: “l(fā)eft” = 0, “center” = 0.5, “right” = 1
微調(diào)后,,該幾何對(duì)象還是在另一個(gè)幾何對(duì)象周?chē)?/p>
library('ggplot2')
just <- expand.grid(hjust = c(0, 0.5, 1), vjust = c(0, 0.5, 1))
just$label <- paste0(just$hjust, ', ', just$vjust)
ggplot(just, aes(hjust, vjust)) + geom_point(colour = 'grey70', size = 5) +
geom_text(aes(label = label, hjust = hjust, vjust = vjust)) # 也能進(jìn)行映射,,但很少用
包括:
位置調(diào)整函數(shù) | 描述 | 其它 |
---|---|---|
position_dodge() | 水平并列放置 | position_dodge(width = NULL, preserve = c(“total”, “single”)) 簇狀柱形圖 |
position_dodge2() | 水平并列放置 | position_dodge2(…, padding = 0.1, reverse = FALSE) 簇狀柱形圖,多了2個(gè)參數(shù) |
position_identity() | 位置不變 | 對(duì)于散點(diǎn)圖和折線圖,可行,,默認(rèn)為identity,但對(duì)于多分類(lèi)柱形圖,,序列間存在遮蓋 |
position_stack() | 垂直堆疊 | position_stack(vjust = 1, reverse = FALSE) 柱形圖和面積圖默認(rèn)stack堆積 |
position_fill() | 百分比填充 | position_fill(vjust = 1, reverse = FALSE) 垂直堆疊,但只能反映各組百分比 |
position_jitter() | 擾動(dòng)處理 | position_jitter(width = NULL, height = NULL, seed = NA)部分重疊,, 用于點(diǎn)圖 |
position_jitterdodge() | 并列抖動(dòng) | position_jitterdodge(jitter.width = NULL,jitter.height = 0, dodge.width = 0.75,seed = NA) |
position_nudge() | 整體位置微調(diào) | position_nudge(x = 0, y = 0),整體向x和y方向平移的距離,,常用于geom_text文本對(duì)象 |
position_xxx()
內(nèi)其它參數(shù):padding, preserve, reverse, vjust, width, height 等
參數(shù)名稱(chēng) | 值 | 描述 |
---|---|---|
preserve | c(“total”, “single”) | 當(dāng)同一組柱子高度相同時(shí),是保留單個(gè)柱子,,還是保留所有柱子 |
padding | 數(shù)字,,(0, 1)區(qū)間 | 調(diào)整柱子間距(中心距離), 越大,,則柱子寬度縮小越多,, 間距越大,0.5表示寬度縮小50%以增大間距 |
reverse | TRUE/FALSE | 是否翻轉(zhuǎn)各組柱子內(nèi)部的排列順序,,對(duì)于dodge2則水平順序翻轉(zhuǎn),,對(duì)于stack和fill則垂直順序不同 |
vjust | (0,1)區(qū)間 | 調(diào)整點(diǎn)和線的垂直位置,,默認(rèn)1頂部,0.5表示居中,,0表示處于底部,,折線的變化趨勢(shì)會(huì)變平緩,默認(rèn)1 |
width | (0,1)區(qū)間 | 表示水平抖動(dòng)的程度,,因?yàn)榇嬖谡?fù)方向,,所有抖動(dòng)的范圍為其2倍,默認(rèn)0.5 |
height | (0,1)區(qū)間 | 表示垂直抖動(dòng)的程度,,因?yàn)榇嬖谡?fù)方向,,所以抖動(dòng)的范圍為其2倍, 默認(rèn)0.5 |
dodge.width | (0,1)區(qū)間 | 表示各組的點(diǎn)抖動(dòng)總的水平寬度,默認(rèn)0.75,, 表示點(diǎn)分布在各組箱子75%寬度上 |
library(ggplot2)
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) + geom_bar(position = 'dodge2') # 水平并列柱形圖,,默認(rèn)保留所有柱子
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) + geom_bar(position = position_dodge(preserve = 'total')) # 保留所有柱子
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) + geom_bar(position = position_dodge(preserve = 'single')) # 保留單個(gè)柱子
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) + geom_bar(position = position_dodge2(preserve = 'single',
reverse = T)) # 翻轉(zhuǎn)各組柱子內(nèi)部排列順序
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) + geom_bar(position = position_dodge2(preserve = 'single',
padding = 0.5)) # 所有柱子寬度縮小50%
library(ggplot2)
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) + geom_bar() # 柱形圖默認(rèn)stack堆積
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) + geom_bar(position = 'fill') # 百分比堆積
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) + geom_bar(position = position_stack(reverse = TRUE)) # 翻轉(zhuǎn)各組內(nèi)部垂直堆疊順序
# 散點(diǎn)圖 + 折線圖
series <- data.frame(time = c(rep(1, 4), rep(2, 4), rep(3, 4), rep(4, 4)), type = rep(c('a',
'b', 'c', 'd'), 4), value = rpois(16, 10))
ggplot(series, aes(time, value, group = type)) + geom_line(aes(colour = type)) +
geom_point(aes(colour = type)) # 默認(rèn)identity
ggplot(series, aes(time, value, group = type)) + geom_line(aes(colour = type),
position = 'stack') + geom_point(aes(colour = type), position = 'stack') # stack堆積
ggplot(series, aes(time, value, group = type)) + geom_line(aes(colour = type),
position = position_stack(vjust = 0.5)) + geom_point(aes(colour = type),
position = position_stack(vjust = 0.5)) # 向下移動(dòng)半個(gè)單位,以最下面的元素為高度為基準(zhǔn)
ggplot(series, aes(time, value, group = type)) + geom_line(aes(colour = type),
position = position_stack(vjust = 0)) + geom_point(aes(colour = type), position = position_stack(vjust = 0)) # 向下移動(dòng)到底,,最下面的折線都拉直了
library(ggplot2)
ggplot(mtcars, aes(am, vs)) +
geom_jitter()
ggplot(mtcars, aes(am, vs)) +
geom_jitter(width = 0.1, height = 0.1) # 增加水平抖動(dòng)10%,,垂直抖動(dòng)10%
ggplot(mtcars, aes(am, vs)) +
geom_point(position = position_jitter(width = 0.1, height = 0.1)) # 原理與上面一樣,但是抖動(dòng)是隨機(jī)的,,每次結(jié)果都可能不一樣
ggplot(mtcars, aes(am, vs)) +
geom_point(position = 'jitter') + # 默認(rèn)抖動(dòng)50%
geom_point(aes(am + 0.2, vs + 0.2), position = 'jitter', color = 'red' ) # 可以在映射里面進(jìn)行簡(jiǎn)單的運(yùn)算
position_jitterdodge(jitter.width = NULL, jitter.height = 0, dodge.width = 0.75, seed = NA)
僅僅用于箱線圖和點(diǎn)圖在一起的情形,且有順序的,,必須箱子在前,點(diǎn)圖在后,,抖動(dòng)只能用在散點(diǎn)幾何對(duì)象中,
jitter.width 默認(rèn)40%,, jitter.height 默認(rèn)0
library(ggplot2)
dsub <- diamonds[sample(nrow(diamonds), 1000), ]
ggplot(dsub, aes(x = cut, y = carat, fill = clarity)) + geom_boxplot(outlier.size = 0) +
geom_point(shape = 23) # 23號(hào)點(diǎn)形狀為菱形
ggplot(dsub, aes(x = cut, y = carat, fill = clarity)) + geom_boxplot(outlier.size = 0) +
geom_point(shape = 23, position = position_jitterdodge(dodge.width = 0.1)) # 點(diǎn)分布于各組箱子10%寬度上,默認(rèn)點(diǎn)水平抖動(dòng)錯(cuò)開(kāi)
ggplot(dsub, aes(x = cut, y = carat, fill = clarity)) + geom_boxplot(outlier.size = 0) +
geom_point(shape = 23, position = position_jitterdodge(dodge.width = 0.8)) # 點(diǎn)分布于各組箱子80%寬度上,,默認(rèn)點(diǎn)水平抖動(dòng)錯(cuò)開(kāi)
library(ggplot2)
df <- data.frame(x = c(1, 3, 2, 5), y = c('a', 'c', 'd', 'c'))
ggplot(df, aes(x, y)) + geom_point() + geom_text(aes(label = y)) # 文本對(duì)象位置與點(diǎn)重合,,視覺(jué)效果不好
ggplot(df, aes(x, y)) + geom_point() + geom_text(aes(label = y), position = position_nudge(y = -0.1)) # 文本位置向下移動(dòng)1%個(gè)單位,,錯(cuò)開(kāi)文本與點(diǎn)位置
|
來(lái)自: 生物_醫(yī)藥_科研 > 《ggplot2》