R使用筆記: ggplot2的一頓騷操作...

本次筆記內(nèi)容:

  • 使用ggplot2及ggrepel繪制主圖和副圖
  • 多種方法整合主圖與副圖:
    ggpubr: ggarange() , 副圖注釋在主圖外
    ggplot2: ggplotGrob + annotation_custom, 副圖注釋在主圖內(nèi)
    ggExtra: ggMarginal(), 副圖重疊注釋在主圖外
    cowplot: 副圖注釋在主圖外
  • 總結(jié):形式為功能服務(wù)募判,不要lost在細(xì)節(jié)的漩渦奖唯,但細(xì)節(jié)如何處理得心里有數(shù)。

使用iris這個示例數(shù)據(jù)普气,用ggplot2畫一個基本圖。
鳶尾花(iris)是數(shù)據(jù)挖掘常用到的一個數(shù)據(jù)集焰檩,有150個鳶尾花樣本信息副签,包括3個物種(setosa,versicolour和virginica)奶是。每個樣本具有5個特征(Sepal.Length,Sepal.Width, Petal.Length, Petal.Width, Species)。

data("iris")
iris <- data.frame(iris)
col <- brewer.pal(3, "Set1")
ggplot(data = iris, aes(Sepal.Length, Sepal.Width, colour = Species)) + 
    geom_point(size = 5, alpha = .6) + 
    scale_color_manual(values = col)
base
使用ggplot2及ggrepel繪制主圖和副圖

使用iris這個示例數(shù)據(jù)繪制主圖和副圖聚磺。在以下代碼中我切了一個子數(shù)據(jù)集出來坯台,并加上了一個‘group’列,作為演示ggrepel用瘫寝。

主圖:
# required packages
library(RColorBrewer)
library(ggrepel)
library(ggpubr)
library(cowplot)
library(ggExtra)

data("iris")
iris <- data.frame(iris)
iris_sub <- iris[iris$Sepal.Length > 2 & iris$Sepal.Width > 3.5, ]
iris_sub$group <- c(rep('group1',10), rep('group2',9))

col <- brewer.pal(3, "Set1")
col1 <- brewer.pal(3,"Set3")[1:2]     

# main scatter plot
gg <- ggplot(data = iris, aes(Sepal.Length, Sepal.Width, colour = Species)) + 
  geom_point(size = 5, alpha = .6) + 
  scale_color_manual(values = col) +
  geom_label_repel(data = iris_sub, 
                   aes(
                     Sepal.Length, Sepal.Width, 
                     label=rownames(iris_sub), 
                     fill = group,
                     color = group
                     ),
                   color = 'black', alpha=1,
                   point.padding = unit(0.1,"lines"), 
                   box.padding = 0.5,
                   segment.color = 'grey55') +
                   # 連接label和點的線:顏色設(shè)置為gery55
  scale_fill_manual(values = setNames(col1, levels(iris_sub$group))) +
  # 將col1的兩個顏色蜒蕾,設(shè)置為iris_sub的兩個group的顏色,ggrepel按照這個顏色來fill
  theme(legend.position = "bottom")     
  # 把legend設(shè)置在底部焕阿,因為副圖可能會遮蓋住右邊的Legend
main scatter plot
副圖:
# annotated plot
xplot <- ggplot(data = iris, aes(x = Species, y = Sepal.Length, fill = Species)) + 
  geom_boxplot(position = position_dodge(0.8)) +
  geom_point(position = position_jitterdodge())+
  scale_fill_brewer(palette = "Set1") +
  coord_flip() +
  # 把豎著的boxplot橫過來
  clean_theme() +
  # 去掉所有theme, 比如x和y軸咪啡,只留下box。在調(diào)整階段可以先留著暮屡,以觀察把主副圖合并時有沒有把坐標(biāo)軸對齊
  theme(legend.position = "none")
  # 去掉lengend

yplot <- ggplot(data = iris, aes(x = Species, y = Sepal.Width, fill = Species)) + 
  geom_boxplot(position = position_dodge(0.8)) +
  geom_point(position = position_jitterdodge())+
  scale_fill_brewer(palette = "Set1") +
  clean_theme() +
  theme(legend.position = "none")
多種方法整合主圖與副圖:
ggpubr: ggarange() , 副圖注釋在主圖外
ggarrange(xplot, NULL,gg,yplot, 
          widths = c(5,1),heights = c(1,4), align = "hv")

ggarange()將副圖整合在主圖外部撤摸。如果把clean_theme()去掉,發(fā)現(xiàn)因為主圖legend的緣故,副圖的坐標(biāo)軸沒法和主圖對齊愁溜。這里可能得根據(jù)實際情況調(diào)整主圖的legend疾嗅。ggarange()的好處在于可以調(diào)整整合圖的比例,參數(shù)設(shè)置簡單冕象。

ggplotGrob + annotaion_custom
# ggplotGrob + annotaion_custom
x_grob <- ggplotGrob(xplot)
y_grob <- ggplotGrob(yplot)
xmin <- min(iris$Sepal.Length)
xmax <- max(iris$Sepal.Length)
ymin <- min(iris$Sepal.Width)
ymax <- max(iris$Sepal.Width)
yoffset <- (1/20) * ymax
xoffset <- (1/30) * xmax

gg + annotation_custom(grob = x_grob, 
                       xmin = xmin, xmax = xmax, 
                       ymin = ymin-yoffset, ymax = ymin+yoffset) +
  annotation_custom(grob = y_grob,
                    xmin = xmin-xoffset, xmax = xmin+xoffset, 
                    ymin = ymin, ymax = ymax)

ggGrob + annotation_custom()設(shè)置起來比較麻煩代承,其副圖注釋在主圖內(nèi)部。但存在一系列問題渐扮。坐標(biāo)軸很難對齊论悴,主圖與副圖重疊很多。所以實際操作起來墓律,為避免圖之間的overlap, 可能還是副圖注釋在主圖外比較合適膀估。

ggExtra: ggMarginal()
ggMarginal(gg, type = "boxplot",groupColour = TRUE, groupFill = TRUE)

ggMarginal()可以用簡潔的代碼畫出上述的圖。注釋在主圖外耻讽,且坐標(biāo)軸可以對齊察纯。但副圖之間有overlap...可能繪制可以重疊的分布曲線比較合適。我始終沒有找到如何避免boxplot之間overlap的辦法=_=
ggMarginal()有個好處在于不需要畫出副圖针肥,只需要主圖饼记。這個包會幫你直接繪制副圖。但也意味著你沒辦法自定義副圖的一些屬性慰枕。

cowplot
p1 <- insert_xaxis_grob(gg, xplot, grid::unit(.2, "null"), position = "top")
p2 <- insert_yaxis_grob(p1, yplot, grid::unit(.2, "null"), position = "right")
ggdraw(p2)

cowplot畫出的圖是我覺得比較滿意的一種具则。副圖注釋在主圖外,坐標(biāo)軸對齊具帮,代碼簡單博肋,不用調(diào)試太多參數(shù)。

p.s. 還有一個ggscatterhist() 可以試試
http://www.sthda.com/english/articles/32-r-graphics-essentials/131-plot-two-continuous-variables-scatter-graph-and-alternatives/

總結(jié)

....有時候很難找到一個合適的包蜂厅,能滿足所有的需求:副圖和主圖之間的空白不要那么大匪凡,坐標(biāo)軸要互相對齊,box之間最好不要有overlap葛峻,lengend的位置不要影響到副圖的位置...等等锹雏。圖是為表達(dá)科學(xué)問題的一種形式,更好的反應(yīng)出科學(xué)假設(shè)與結(jié)果才是作圖的目的术奖。一些代碼難以處理的細(xì)枝末節(jié)可以在圖的形式大致確定下來之后礁遵,使用其他圖片編輯軟件進(jìn)行微調(diào)。

參考鏈接:
color filling in ggrepel:
https://github.com/slowkow/ggrepel/issues/82
https://stackoverflow.com/questions/37664025/ggrepel-label-fill-color-questions
http://rstudio-pubs-static.s3.amazonaws.com/155546_17c0cb7ee350417e902dfb9031b81f48.html
annotated to the main plot:
http://www.sthda.com/english/wiki/wiki.php?id_contents=7930
http://www.sthda.com/english/articles/24-ggpubr-publication-ready-plots/78-perfect-scatter-plots-with-correlation-and-marginal-histograms/
http://www.r-graph-gallery.com/277-marginal-histogram-for-ggplot2/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末采记,一起剝皮案震驚了整個濱河市佣耐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唧龄,老刑警劉巖兼砖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡讽挟,警方通過查閱死者的電腦和手機懒叛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耽梅,“玉大人薛窥,你說我怎么就攤上這事⊙劢悖” “怎么了诅迷?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長众旗。 經(jīng)常有香客問我罢杉,道長,這世上最難降的妖魔是什么贡歧? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任滩租,我火速辦了婚禮,結(jié)果婚禮上艘款,老公的妹妹穿的比我還像新娘持际。我一直安慰自己,他們只是感情好哗咆,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著益眉,像睡著了一般晌柬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郭脂,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天年碘,我揣著相機與錄音,去河邊找鬼展鸡。 笑死屿衅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莹弊。 我是一名探鬼主播涤久,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忍弛!你這毒婦竟也來了响迂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤细疚,失蹤者是張志新(化名)和其女友劉穎蔗彤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡然遏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年贫途,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片待侵。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡潮饱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诫给,到底是詐尸還是另有隱情香拉,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布中狂,位于F島的核電站凫碌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胃榕。R本人自食惡果不足惜盛险,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勋又。 院中可真熱鬧苦掘,春花似錦、人聲如沸楔壤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹲嚣。三九已至递瑰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隙畜,已是汗流浹背抖部。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留议惰,地道東北人慎颗。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像言询,于是被迫代替她去往敵國和親俯萎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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

  • 簡介 文章較長倍试,點擊直達(dá)我的博客讯屈,瀏覽效果更好。本文內(nèi)容基本是來源于STHDA县习,這是一份十分詳細(xì)的ggplot2使...
    taoyan閱讀 50,889評論 7 159
  • 今天中午孩子進(jìn)家門就喊:“媽涮母,你猜猜外面怎么樣谆趾?”我說:“怎樣?”“多虧你和弟弟沒出去啊叛本,外面凍死了沪蓬,風(fēng)刮的...
    女人越簡單越快樂閱讀 124評論 0 0
  • 今天聽同事小Y說起她的發(fā)小擺了個小攤,專賣炒面炒餅的来候,作為吃貨的我跷叉,為了掩蓋我真實的關(guān)注點,就假裝好奇多問了幾句营搅,...
    丁丁求職閱讀 638評論 10 6
  • 忽然就想到你們云挟。 現(xiàn)在我坐在教室,靠著窗的座位转质。許多人在外面打籃球园欣,半場四打四。顯的有些擁擠休蟹。仿佛看得到小晗別扭的...
    簡畫閱讀 320評論 0 1
  • 《修》:鄧松云 又回村一趟 石板路上 落了一灘亂紅 后山梨樹還在下雪 葉子卻還沒長出來 沒看見烏鴉 這烏七八黑的鳥...
    鄧松云的手工作坊閱讀 454評論 0 2