R 數(shù)據(jù)可視化 —— ggplot 標(biāo)度(二)

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 軸需要包含 19扶叉,超過(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 圖可以明顯看出酪劫,210 的顏色并沒(méi)有顯示,因?yàn)椴淮嬖谙鄳?yīng)的數(shù)據(jù)

4. 設(shè)置間隔

可以使用 expansion() 函數(shù)設(shè)置數(shù)據(jù)與軸之間的間隔寺董,該函數(shù)主要搭配 scale_(x|y)_continuousscale_(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_alphascale_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
  ))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末且警,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子礁遣,更是在濱河造成了極大的恐慌斑芜,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祟霍,死亡現(xiàn)場(chǎng)離奇詭異杏头,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)沸呐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門醇王,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人崭添,你說(shuō)我怎么就攤上這事寓娩。” “怎么了呼渣?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵棘伴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我屁置,道長(zhǎng)焊夸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任蓝角,我火速辦了婚禮阱穗,結(jié)果婚禮上饭冬,老公的妹妹穿的比我還像新娘。我一直安慰自己揪阶,他們只是感情好伍伤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遣钳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麦乞。 梳的紋絲不亂的頭發(fā)上蕴茴,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音姐直,去河邊找鬼倦淀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛声畏,可吹牛的內(nèi)容都是我干的撞叽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼插龄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼愿棋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起均牢,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤糠雨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后徘跪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甘邀,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年垮庐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了松邪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哨查,死狀恐怖逗抑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寒亥,我是刑警寧澤锋八,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站护盈,受9級(jí)特大地震影響挟纱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腐宋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一紊服、第九天 我趴在偏房一處隱蔽的房頂上張望檀轨。 院中可真熱鬧,春花似錦欺嗤、人聲如沸参萄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讹挎。三九已至,卻和暖如春吆玖,著一層夾襖步出監(jiān)牢的瞬間筒溃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工沾乘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怜奖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓翅阵,卻偏偏與公主長(zhǎng)得像歪玲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掷匠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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