3. 設(shè)置值范圍
除了設(shè)置坐標(biāo)軸的范圍生真,我們也可以設(shè)置圖形中必須包含某個(gè)或某些值腰吟。
可以使用 expand_limits()
函數(shù)屋吨,該函數(shù)接受一個(gè)命名列表针贬,名稱必須為圖形屬性
示例
對(duì)于下面這張散點(diǎn)圖
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
> mtcars %>% distinct(mpg) %>% summarise(min=min(.), max=max(.))
min max
1 10.4 33.9
> mtcars %>% distinct(wt) %>% summarise(min=min(.), max=max(.))
min max
1 1.513 5.424
從上面的結(jié)果中,我們可以計(jì)算出:X
軸(mpg
)和 Y
軸(wt
)的數(shù)據(jù)范圍
下面赋兵,讓我們用 expand_limits
來(lái)調(diào)整數(shù)據(jù)范圍
p1 <- p + expand_limits(x = 0)
p2 <- p + expand_limits(y = c(1, 9))
p3 <- p + expand_limits(x = 0, y = 0)
plot_grid(p1, p2, p3, labels = c('A', 'B', 'C'), nrow = 1)
在圖 A
中笔咽,我們?cè)O(shè)置 X
軸數(shù)據(jù)要包含 0
,盡管并沒(méi)有對(duì)應(yīng)的值霹期,但是 X
坐標(biāo)軸還是會(huì)從 0
開始。
類似的经伙,圖 B
設(shè)置了 Y
軸需要包含 1
和 9
扶叉,超過(guò)了數(shù)據(jù)的范圍,相當(dāng)于擴(kuò)大了 Y
軸的范圍
我們還可以對(duì)顏色進(jìn)行設(shè)置
p1 <- ggplot(mtcars, aes(mpg, wt)) +
geom_point(aes(colour = cyl)) +
expand_limits(colour = seq(2, 10, by = 2))
p2 <- ggplot(mtcars, aes(mpg, wt)) +
geom_point(aes(colour = factor(cyl))) +
expand_limits(colour = factor(seq(2, 10, by = 2)))
plot_grid(p1, p2, labels = c('A', 'B'))
A
圖設(shè)置了漸變色帕膜,B
圖是離散配色枣氧。
> mtcars %>% distinct(cyl)
cyl
Mazda RX4 6
Datsun 710 4
Hornet Sportabout 8
我們可以看到,其實(shí)顏色的值只有三個(gè) 4
垮刹、6
达吞、8
,但是我們?cè)O(shè)置了 5
個(gè)不同的顏色層級(jí)荒典。
從 B
圖可以明顯看出酪劫,2
和 10
的顏色并沒(méi)有顯示,因?yàn)椴淮嬖谙鄳?yīng)的數(shù)據(jù)
4. 設(shè)置間隔
可以使用 expansion()
函數(shù)設(shè)置數(shù)據(jù)與軸之間的間隔寺董,該函數(shù)主要搭配 scale_(x|y)_continuous
與 scale_(x|y)_discrete
使用覆糟。
# 推薦使用
expansion(mult = 0, add = 0)
# 已被棄用
expand_scale(mult = 0, add = 0)
該函數(shù)包含兩個(gè)參數(shù):
-
mult
: 百分比間距,接受一個(gè)向量遮咖,如果向量長(zhǎng)度為1
滩字,則上下間距的間隔是一樣的,如果長(zhǎng)度為2
御吞,則mult[1]
為下間距麦箍,mult[2]
為上間距 -
add
: 常數(shù)值單位間距,類似mult
示例
p1 <- ggplot(mtcars) +
geom_bar(aes(x = factor(cyl)))
p2 <- ggplot(mtcars) +
geom_bar(aes(x = factor(cyl))) +
scale_y_continuous(expand = expansion(mult = c(0, .1)))
p3 <- ggplot(subset(diamonds, carat > 2), aes(cut, clarity)) +
geom_jitter() +
scale_x_discrete(expand = expansion(add = 2))
p4 <- ggplot(subset(diamonds, carat > 2), aes(cut, price)) +
geom_jitter() +
scale_x_discrete(expand = expansion(add = .6)) +
scale_y_continuous(expand = expansion(mult = .05))
plot_grid(p1, p2, p3, p4, labels = LETTERS[1:4],
nrow = 2)
其中陶珠,D
圖所設(shè)置的間距是默認(rèn)值
5. 設(shè)置透明度
alpha
透明度并不是非常有用挟裂,但它可以方便地從視覺(jué)上降低不太重要的觀察結(jié)果的權(quán)重
設(shè)置透明度的函數(shù)包括:
scale_alpha(..., range = c(0.1, 1))
scale_alpha_continuous(..., range = c(0.1, 1))
scale_alpha_binned(..., range = c(0.1, 1))
scale_alpha_discrete(...)
scale_alpha_ordinal(..., range = c(0.1, 1))
其中 scale_alpha
是 scale_alpha_continuous
的別名,因?yàn)檫@個(gè)函數(shù)是最常用的揍诽。
其中 range
參數(shù)的值為透明度的范圍诀蓉,必須在 0-1
之間。
其他參數(shù)分別被 continuous_scale()
, binned_scale
, 和 discrete_scale()
解析
示例
首先在 aes
中設(shè)置透明度寝姿,如
p <- ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(alpha = year))
然后使用標(biāo)度函數(shù)來(lái)修改透明度范圍
p1 <- p + scale_alpha("cylinders")
p2 <- p + scale_alpha(range = c(0.4, 0.8))
plot_grid(p1, p2, labels = LETTERS[1:2],
nrow = 1)
在圖 A
中交排,我們傳遞了一個(gè)字符串,相當(dāng)于設(shè)置了 name
參數(shù)的值饵筑,更改了圖例的名稱
自定義透明度
p <- ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(alpha = factor(year)))
p + scale_alpha_manual(values = c(0.1, 0.2))
6. 設(shè)置線條類型
線條的類型可以使用 0-6
之間的整數(shù)來(lái)指定埃篓,分別代表
0 = blank 1 = solid
2 = dashed 3 = dotted
4 = dotdash 5 = longdash
6 = twodash
繪制所有的線條類型
df_lines <- tibble(
linetype = factor(0:6)
)
ggplot(df_lines) +
geom_hline(aes(linetype = linetype, yintercept = 0), size = 2) +
scale_linetype_discrete() +
facet_grid(linetype ~ .) +
theme_void(20)
線條類型不支持連續(xù)型數(shù)據(jù),因?yàn)闊o(wú)法將連續(xù)型數(shù)據(jù)映射到線型根资。但是可以使用 scale_linetype_binned()
架专,由于線型沒(méi)有固定的順序,也不推薦這樣使用
示例
對(duì)于數(shù)據(jù)
> economics_long
# A tibble: 2,870 x 4
date variable value value01
<date> <chr> <dbl> <dbl>
1 1967-07-01 pce 507. 0
2 1967-08-01 pce 510. 0.000265
3 1967-09-01 pce 516. 0.000762
4 1967-10-01 pce 512. 0.000471
5 1967-11-01 pce 517. 0.000916
6 1967-12-01 pce 525. 0.00157
7 1968-01-01 pce 531. 0.00207
8 1968-02-01 pce 534. 0.00230
9 1968-03-01 pce 544. 0.00322
10 1968-04-01 pce 544 0.00319
# … with 2,860 more rows
我們根據(jù) variable
變量進(jìn)行分組玄帕,繪制折線圖
base <- ggplot(economics_long, aes(date, value01))
base + geom_line(aes(group = variable))
注意:我們是通過(guò)設(shè)置 group = variable
來(lái)設(shè)置分組的部脚,但是組與組之間沒(méi)有區(qū)分度。
為圖片添加線型和顏色
base + geom_line(aes(linetype = variable, colour=variable))
這樣裤纹,每組之間的趨勢(shì)就很明顯了委刘。
自定義線條映射
df <- economics_long %>% filter(variable %in% c("pop", "pce", "uempmed"))
lt <- c("pop"=1, "pce"=3, "uempmed"=5)
ggplot(df, mapping = aes(date, value01)) +
geom_line(aes(linetype = variable, colour=variable)) +
scale_linetype_manual(values = lt)
7. 設(shè)置形狀
scale_shape()
函數(shù)可以將離散變量映射為 6
個(gè)不同的形狀丧没。
如果你有超過(guò) 6
個(gè)類別,你將會(huì)得到一個(gè)警告信息锡移,并且第 7
個(gè)或更后面的類別將不會(huì)在圖片中顯示
形狀與線型一樣呕童,不支持連續(xù)型數(shù)據(jù),也不推薦使用 scale_shape_binned
函數(shù)來(lái)設(shè)置
scale_shape(..., solid = TRUE)
scale_shape_binned(..., solid = TRUE)
其中 solid
參數(shù)控制形狀是不是實(shí)心的
下面的代碼展示了所有的形狀
df_shapes <- data.frame(shape = 0:25)
ggplot(df_shapes, aes(0, 0, shape = shape)) +
geom_point(aes(shape = shape), size = 5, fill = 'red') +
scale_shape_identity() +
facet_wrap(~shape) +
theme_void()
取值范圍為 0-25
淆珊,共 26
個(gè)整數(shù)值分別代表了相應(yīng)的形狀夺饲。
注意:紅色的形狀是可以設(shè)置填充色(fill
)的,其他形狀只能設(shè)置輪廓顏色(colour
)施符。
示例
dsmall <- diamonds[sample(nrow(diamonds), 100), ]
d <- ggplot(dsmall, aes(carat, price)) + geom_point(aes(shape = cut))
p2 <- d + scale_shape(solid = FALSE)
p3 <- d + scale_shape(name = "Cut of diamond")
levels(dsmall$cut) <- c("Fair", "Good", "Very Good", "Premium", "Ideal")
p4 <- ggplot(dsmall, aes(price, carat)) + geom_point(aes(shape = cut))
plot_grid(d, p2, p3, p4, labels = LETTERS[1:4])
注意:在繪制圖 D
時(shí)往声,會(huì)輸出警告信息,提示不建議對(duì)排序的變量設(shè)置形狀
自定義形狀映射
shape_map <- c("Fair"=13, "Good"=20, "Very Good"=15, "Premium"=2, "Ideal"=11)
d + scale_shape(solid = FALSE) +
scale_shape_manual(values = shape_map)
8. 設(shè)置大小
一般只有點(diǎn)圖和文本需要設(shè)置大小戳吝。而我們通常是將數(shù)據(jù)映射到點(diǎn)的面積浩销,而不是映射到半徑。
標(biāo)度函數(shù)如下
scale_size(..., range = c(1, 6))
scale_radius(..., range = c(1, 6))
scale_size_binned(..., range = c(1, 6))
scale_size_area(..., max_size = 6)
scale_size_binned_area(..., max_size = 6)
如果需要將值為 0
的點(diǎn)映射為 0
听哭,需要使用 scale_size_area
函數(shù)
示例
例如撼嗓,下面這張散點(diǎn)圖
p <- ggplot(mpg, aes(displ, hwy, size = hwy)) +
geom_point()
# 設(shè)置圖例標(biāo)題
p1 <- p + scale_size("Highway mpg")
# 設(shè)置點(diǎn)的大小范圍
p2 <- p + scale_size(range = c(0, 10))
# 允許將 0 值映射為面積為 0 的點(diǎn)(不繪制)
p3 <- p + scale_size_area()
# 方便從看出圖例中看出分箱
p4 <- p + scale_size_binned()
# This is most useful when size is a count
p5 <- ggplot(mpg, aes(class, cyl)) +
geom_count() +
scale_size_area()
# 將數(shù)據(jù)映射為半徑,不推薦
p6 <- p + scale_radius()
plot_grid(p1, p2, p3, p4, p5, p6,
labels = LETTERS[1:6], nrow = 3)
自定義數(shù)據(jù)大小欢唾,我們根據(jù) cyl
的值倒序設(shè)置點(diǎn)的大小
ggplot(mpg, aes(displ, hwy, size = factor(cyl))) +
geom_point() +
scale_size_manual(
name="cyl",
values = c(
"4" = 5,
"5" = 4,
"6" = 3,
"8" = 2
))