https://mp.weixin.qq.com/s/fm69bw-3cww1YEW_kBcTHQ
更多關於R語言,ggplot2繪圖,生信分析的內容,關注有驚喜😄。
擁有財富、名聲、權力,這世界上的一切的男人 “海賊王”哥爾·D·羅傑,在被行刑受死之前說了一句話,讓全世界的人都涌向了大海。“想要我的寶藏嗎?如果想要的話,那就到海上去找吧,我全部都放在那里。”,世界開始迎接“大海賊時代”的來臨。
ggforce是ggplot2的擴展包,“擅長”於根據數據繪制輪廓以及區域放大。先將整體分為幾個重要的“版圖”,然后根據“線索”重點放大后在此區域進行精細“搜尋”,最終找到“ONEPIECE”!😄
一 載入數據,R包
#載入R包
library(tidyverse)
library(ggforce)
library(nycflights13)
#使用airports數據集
head(airports)
# A tibble: 6 x 8
faa name lat lon alt tz dst tzone
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr>
1 04G Lansdowne Airport 41.1 -80.6 1044 -5 A America/New_~
2 06A Moton Field Municipal Ai~ 32.5 -85.7 264 -6 A America/Chic~
3 06C Schaumburg Regional 42.0 -88.1 801 -6 A America/Chic~
4 06N Randall Airport 41.4 -74.4 523 -5 A America/New_~
5 09J Jekyll Island Airport 31.1 -81.4 11 -5 A America/New_~
6 0A9 Elizabethton Municipal A~ 36.4 -82.2 1593 -5 A America/New_~
繪制基礎圖形
p <- airports %>%
filter(lon < 0, tzone != "\\N") %>%
ggplot(aes(lon, lat, color = tzone)) +
geom_point(show.legend = FALSE)
p
可以看到不同的tzone使用不同的顏色標識出來了,那如果給每個tzone加一個輪廓應該會更方便的區分。
二 ggforce繪制輪廓
1 添加輪廓
geom_mark_...()
系列函數能夠非常簡單的圍繞數據組繪制輪廓,以下四個參數可以繪制不同的輪廓:
-
geom_mark_circle()
-
geom_mark_ellipse()
-
geom_mark_hull()
-
geom_mark_rect()
使用geom_mark_rect(),以每個時區為組繪制圓角矩形輪廓
p + geom_mark_rect()
2 添加標簽,箭頭
在上述輪廓的基礎上添加標簽和指向箭頭,試試看效果如何
p + geom_mark_rect(aes(label = tzone))
標簽和箭頭的位置被優化了,此外背景默認為白色,指示符為線條加文本,很容易知道每個組的標簽。
3 更改主題設置
ggforce作為ggplot2的擴展包,也能直接使用ggplot2的主題設置
p + geom_mark_rect(aes(label = tzone), show.legend = FALSE) +
theme_void()
4 hull-k 增強
然而很多情況下,圍繞組繪制矩形或圓形是不理想的,此時就需要geom_mark_hull()
函數來圍繞數據組的輪廓繪制更復雜的多邊形。
#使用hull需要加載concaveman包
library(concaveman)
p + geom_mark_hull(aes(label = tzone)) +
theme_void()
1)優化:fill
函數添加輪廓中顏色,show.legend
去掉legend
2)優化:expand
調整輪廓大小,theme_no_axes
只保留邊距
使用expand
參數中使用units()
參數命令調整輪廓的大小。
對於白色背景或在線文章(基本上都是白色背景),很難確定繪圖的邊距。theme_no_axes()
只保留邊框可以較好的解決這個問題。
p + geom_mark_hull(aes(label = tzone, fill = tzone),
show.legend = FALSE, expand = unit(3, "mm")) +
theme_no_axes()
三 ggforce區域放大
如果“寶藏”的區域就在上述的位置之一(全圖展示),現在發現更可能在某個區域,那就使用facet_zoom()
函數放大或聚焦在特定區域。
1)xlim和ylim設置聚焦區域
#xlim和ylim,基於坐標聚焦區域
p + facet_zoom(xlim = c(-155, -160.5), ylim = c(19, 22.3))
2)基於特定項設置聚焦區域
#結合filter函數,基於特定項聚焦區域
p + facet_zoom(xy = tzone == "Pacific/Honolulu",zoom.data = tzone == "Pacific/Honolulu")
注:原圖中Pacific/Honolulu不展示。
四 整體展示
p + geom_mark_hull(aes(label = tzone, fill = tzone), show.legend = FALSE, expand = unit(3, "mm")) +
theme_no_axes() +
facet_zoom(x = tzone == "America/Los_Angeles",zoom.data = tzone == "America/Los_Angeles")
好了 ,現在就完成了根據“組”添加輪廓,再重點“zoom”特定區域。
其實可以做很多事情,遇到需要區別,重點展示的案例不妨試一下!
◆ ◆ ◆ ◆ ◆
精心整理(含圖版)|你要的全拿走!有備無患 (R統計,ggplot2繪圖,生信圖形可視化匯總)