ggplot2學(xué)習(xí)(三)

ggplot2基礎(chǔ)(3)——注釋

ggplot2基礎(chǔ)(1)
ggplot2基礎(chǔ)(2)——坐標(biāo)軸
ggplot2基礎(chǔ)(3)——注釋
ggplot2基礎(chǔ)(4)——主題
ggplot2基礎(chǔ)(5)——配色與圖例

使用ggplot2過程中焕盟,離不開在其中添加各種各樣的文字信息,對(duì)于坐標(biāo)軸上的文字內(nèi)容音比,可以使用的函數(shù)包括lab()育谬、xlab()挖胃、ylab等多個(gè)函數(shù),我們已經(jīng)在上一章中進(jìn)行了詳細(xì)的介紹臂寝,這一章我們主要介紹圖中的其他文字標(biāo)注方式——注釋篡悟。

參考的內(nèi)容主要是:

1 annotate函數(shù)

如果想要在圖片上添加注釋右锨,目前比較推薦的是使用annotate函數(shù),該函數(shù)會(huì)在圖片上增加注釋圖層碌秸,該圖層不會(huì)映射到DataFrame對(duì)象绍移。其定義為:

annotate(
  geom,
  x = NULL,
  y = NULL,
  xmin = NULL,
  xmax = NULL,
  ymin = NULL,
  ymax = NULL,
  xend = NULL,
  yend = NULL,
  vjust,
  hjust,
  arrow = NULL,
  parse = FALSE,  
  ...,
  na.rm = FALSE
)

其中

  • geom 注釋的類型,可選項(xiàng)包括"text"(文本)讥电、"rect"(矩形)蹂窖、"segment"(線段)、"pointrange"(點(diǎn)線段)恩敌、"curve"(曲線)等
  • x, y, xmin, ymin, xmax, ymax, xend, yend, vjust, hjust 注釋所在的位置信息
  • arrow 設(shè)置箭頭信息(只有注釋類型為線段或曲線時(shí)起作用)
  • parse 邏輯型參數(shù)瞬测;若設(shè)為TRUE,則label參數(shù)的內(nèi)容遵循plotmath的編譯規(guī)則
  • ... 一些視覺參數(shù),可以參考aes函數(shù)的設(shè)置
  • na.rm 默認(rèn)值為FALSE月趟,此時(shí)缺失的值會(huì)被移除灯蝴,并會(huì)給出警告信息;如果設(shè)置為TRUE孝宗,則缺失值會(huì)被刪除而不給出任何警告信息穷躁。

1.1 文本型注釋——text

使用文本型注釋,除了將geom參數(shù)設(shè)置為text外因妇,還需要設(shè)置label參數(shù):

library(ggplot2)

p = ggplot(faithful, aes(x=eruptions, y=waiting)) + 
    geom_point()

p + annotate("text", x=3, y=48, label="Group1") +
    annotate("text", x=4.5, y=66, label="Group2")
image.png

如果坐標(biāo)軸為連續(xù)值问潭,則可以將xy設(shè)置為Inf-Inf婚被,以便于在繪圖區(qū)域的邊緣放置注解狡忙。

p + 
annotate("text", x=-Inf, y=Inf, label="Upper left", hjust=-.2, vjust=2) +
annotate("text", x= mean(range(faithful$eruptions)), y=-Inf, vjust=-0.4, label="Bottom middle")
image.png

此外,還可以在label中使用Latex公式(其實(shí)是plotmath)址芯,以實(shí)現(xiàn)公式的編輯(同時(shí)將parse參數(shù)設(shè)置為TRUE)灾茁。如果需要在公式中使用普通的文字,則需要在其中將普通文字以單引號(hào)引起來是复,同時(shí)添加*作為分隔删顶。

p = ggplot(data.frame(x=c(-3, 3)), aes(x=x)) +
    stat_function(fun=dnorm)

p + annotate("text", x=0, y=0.05, size=4, parse=TRUE, label="'Function:' * y==frac(1, sqrt(2 * pi)) * e^{-x^2/2}")
image.png

1.2 線型注釋(含箭頭)——segment、curve

如果要在圖片中添加線段型注釋淑廊,則需要將geom設(shè)置為"segment"逗余,同時(shí)設(shè)置xy季惩、xend录粱、yend,分別代表起點(diǎn)和終點(diǎn)的坐標(biāo)

如果要為線段添加箭頭画拾,則需要設(shè)置arrow參數(shù)

arrow參數(shù)一般使用arrow()函數(shù)來進(jìn)行設(shè)置啥繁,其常用的參數(shù)有:

  • ends 如果設(shè)置為"both",則表示線段的兩邊均有箭頭青抛,否則只在線段的終端進(jìn)行設(shè)置
  • angel 箭頭的角度旗闽,如果設(shè)置為90,則可以作為范圍的標(biāo)簽進(jìn)行使用
  • length 箭頭的長(zhǎng)度蜜另,一般可以使用unit(長(zhǎng)度适室,"單位")的形式來使用

更多的使用可以加載grid包后,用?arrow命令來查看

p <- ggplot(mtcars, aes(x = wt, y = mpg)) + 
    geom_point()
p + annotate("segment", x = 2.5, xend = 4, y = 15, yend = 25, color = "blue", size=4)
image.png
p <- ggplot(mpg, aes(displ, hwy)) +
  geom_point(
    data=filter(mpg, manufacturer=="subaru"),
    color="orange",
    size=3, 
    
  ) +
  geom_point() 

p + 
    annotate(geom = "segment", x = 4, y = 35, xend = 2.65, yend = 27, arrow = arrow(length = unit(4, "mm")), size=2)+
    annotate(geom = "text", x = 4.1, y = 35, label = "subaru", hjust = "left", size=10)
image.png

當(dāng)需要使用更加美觀的曲線時(shí)举瑰,需要將geom設(shè)置為"curve"捣辆,同時(shí)想要調(diào)整曲線的曲率,則可以調(diào)整curvature參數(shù)此迅。

p + 
    annotate(geom = "curve", x = 4, y = 35, xend = 2.65, yend = 27, curvature = .3, arrow = arrow(length = unit(4, "mm")), size=2)+
    annotate(geom = "text", x = 4.1, y = 35, label = "subaru", hjust = "left", size=10)
image.png

1.3 陰影注釋——rect

使用陰影注釋(在圖片中添加矩形方框)汽畴,除了需要將geom參數(shù)設(shè)置為"rect"外旧巾,還需要設(shè)置好xminymin忍些、xmax鲁猩、ymax,以便于確定矩形的范圍坐昙。

ggplot(economics) + 
  geom_line(aes(date, unemploy)) + 
  annotate("rect", 
           xmin=as.Date("1970-01-01","%Y-%m-%d"), 
           xmax=as.Date("1979-12-31","%Y-%m-%d"), 
           ymin=-Inf, ymax=Inf, fill="blue", alpha=.1)+
  xlab("date") + 
  ylab("unemployment")
image.png

2 其他注釋

2.1 直線注釋

前面提到的是線段注釋绳匀,如果想要使用直線類型的注釋,可選的選項(xiàng)包括:

  • geom_hline()
  • geom_vline()
  • geom_abline()

其中g(shù)eom_abline()的參數(shù)主要包括:

  • slope 表示斜率
  • intercept 表示截距

早期的ggplot中并未包含annotate函數(shù)炸客,因此絕大多數(shù)使用的是直線疾棵、geom_rect等對(duì)象進(jìn)行注釋

library(ggplot2)

p = ggplot(mpg, aes(displ, hwy, colour = class)) + 
  geom_point()

p + 
    geom_hline(yintercept=25) +
    geom_vline(xintercept=3) +
    geom_abline(slope=3, intercept=20)
image.png

2.2 文字注釋——geom_text與geom_label

使用geom_text()geom_label()也可以在圖中添加文字,進(jìn)而實(shí)現(xiàn)注釋的效果痹仙。但是需要注意的是是尔,當(dāng)使用這兩個(gè)函數(shù)時(shí),會(huì)在圖中增加一個(gè)文字圖層开仰,同時(shí)該圖層會(huì)映射到DataFrame中拟枚。例如,在下面的例子中众弓,文字"Group 1"是我們使用annotate()函數(shù)繪制的恩溅,我們將其透明度設(shè)置為0.1,而"Group 2"是我們使用geom_text()函數(shù)繪制的谓娃,在繪制時(shí)脚乡,我們同樣將其透明度設(shè)置為0.1,但是由于geom_text函數(shù)對(duì)DataFrame數(shù)據(jù)(即faithful)的映射滨达,因此"Group 2"被繪制了n次奶稠,因此盡管其透明度也被設(shè)置為0.1,但是其清晰度則遠(yuǎn)遠(yuǎn)高于"Group 1"捡遍。

此外需要注意的是相對(duì)于geom_text而言锌订,geom_label會(huì)在文本周圍添加一個(gè)背景

library(ggplot2)

p = ggplot(faithful, aes(x=eruptions, y=waiting)) + 
    geom_point()

p + annotate("text", x=3, y=48, label="Group1", alpha=0.1) +
    geom_text(x=4.5, y=66, label="Group2", alpha=0.1)
image.png

3 分面注釋

在分面上添加注釋的方法有很多種,最主要還是依賴于要表達(dá)的信息:

3.1 方法一

使用分面變量創(chuàng)建一個(gè)新的數(shù)據(jù)框画株,然后設(shè)定每個(gè)分面需要繪制的值辆飘,最后配合新的數(shù)據(jù)框使用geom_text()函數(shù)

mpg_plot <- 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"))

mpg_plot +
    geom_text(x=6, y=40, mapping=aes(label=label), data=f_labels)
image.png
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, stringsAsFactors = FALSE)
}

library(dplyr)
labels <- mpg %>%
  group_by(drv) %>%
  do(lm_labels(.))

mpg_plot + 
    geom_smooth(method=lm, se=FALSE) +
    geom_text(data=labels, aes(label=formula), x=3, y=40, parse=TRUE) +
    geom_text(x=3, y=35, aes(label=r2), data=labels, parse=TRUE, hjust=0)
image.png

3.2 方法二

使用gghighlight

# install.packages("gghighlight")

ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
    geom_point() +
    gghighlight::gghighlight() +
    facet_wrap(.~factor(cyl))
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者谓传。
  • 序言:七十年代末蜈项,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子良拼,更是在濱河造成了極大的恐慌战得,老刑警劉巖充边,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庸推,死亡現(xiàn)場(chǎng)離奇詭異常侦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贬媒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門聋亡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人际乘,你說我怎么就攤上這事坡倔。” “怎么了脖含?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵罪塔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我养葵,道長(zhǎng)征堪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任关拒,我火速辦了婚禮佃蚜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘着绊。我一直安慰自己谐算,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布归露。 她就那樣靜靜地躺著洲脂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪靶擦。 梳的紋絲不亂的頭發(fā)上腮考,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音玄捕,去河邊找鬼踩蔚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛枚粘,可吹牛的內(nèi)容都是我干的馅闽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼馍迄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼福也!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起攀圈,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤暴凑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赘来,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體现喳,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凯傲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗦篱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冰单。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灸促,靈堂內(nèi)的尸體忽然破棺而出诫欠,到底是詐尸還是另有隱情,我是刑警寧澤浴栽,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布荒叼,位于F島的核電站,受9級(jí)特大地震影響典鸡,放射性物質(zhì)發(fā)生泄漏甩挫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一椿每、第九天 我趴在偏房一處隱蔽的房頂上張望伊者。 院中可真熱鬧,春花似錦间护、人聲如沸亦渗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)法精。三九已至,卻和暖如春痴突,著一層夾襖步出監(jiān)牢的瞬間搂蜓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工辽装, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帮碰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓拾积,卻偏偏與公主長(zhǎng)得像殉挽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拓巧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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