R 數(shù)據(jù)可視化 —— 徑向柱狀圖

前言

我們前面所介紹的圖形,基本上都是在笛卡爾坐標系上的圖形乳蛾。

今天,我們要介紹幾種繪制在極坐標上的圖形

南丁格爾玫瑰圖

南丁格爾玫瑰圖,即笛卡爾坐標系中的柱狀圖轉(zhuǎn)換為極坐標系之后的圖形像云。

因此,柱形會被拉伸為扇形蚂夕,堆積柱狀圖也就是堆積扇形圖迅诬,適用于比較大小相近的數(shù)值,x 軸為周期性變量的情況

示例

單數(shù)據(jù)型

count(mpg, class) %>%
  ggplot(aes(x = class, y = n)) +
  geom_col(aes(fill = class)) +
  geom_text(aes(y = n - 3, label = n), colour = "white") +
  coord_polar(theta = "x", start = 0) + 
  theme(
    panel.background = element_blank(),
    panel.grid.major = element_line(colour = "grey80",size=.25),
    axis.text.x=element_text(size = 13,colour="black", angle = seq(-20,-340, length.out = 7)),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    axis.title = element_blank(),
    legend.position = "none"
  )

堆積型

count(mpg, class, drv) %>%
  ggplot(aes(x = class, y = n))
  geom_col(aes(fill = drv)) +
  geom_text(aes(y = n - 3, label = n), colour = "white") +
  coord_polar(theta = "x", start = 0) + 
  theme(
    panel.background = element_blank(),
    panel.grid.major = element_line(colour = "grey80",size=.25),
    axis.text.x=element_text(size = 13,colour="black", angle = seq(-20,-340, length.out = 7)),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    axis.title = element_blank(),
    legend.position = "none"
  )

徑向柱狀圖

徑向柱狀圖也稱為圓形柱狀圖或星圖婿牍。

我們從 cBioPortal 網(wǎng)站下載了結(jié)直腸癌的一份 2015 年的 29 個樣本數(shù)據(jù)侈贷,然后提取突變基因與樣本信息。

https://github.com/dxsbiocc/learn/blob/main/data/mutation/data_mutations_mskcc.txt

我們提取突變頻率大于 3 的基因等脂,繪制單組徑向柱狀圖如下

df <- read_delim("~/Downloads/coad_caseccc_2015/data_mutations_mskcc.txt", delim = "\t")

select(df, Tumor_Sample_Barcode, Hugo_Symbol) %>%
  count(df, Hugo_Symbol) %>%
  filter(n > 3) %>%
  arrange(n) %>%
  ggplot(aes(Hugo_Symbol, n, fill = Hugo_Symbol)) +
  geom_col() +
  geom_text(aes(y = n - 2, label = n), colour = "white") +
  coord_polar(start = 0) +
  ylim(c(-10, 35)) +
  theme(
    panel.background = element_blank(),
    panel.grid.major = element_line(colour = "grey80",size=.25),
    axis.text.x = element_text(size = 9, colour="black", angle = seq(-10, -350, length.out = 27)),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    axis.title = element_blank(),
    legend.position = "none"
  )

我們根據(jù)突變頻率對基因進行排序俏蛮,只要做如下修改就行

ggplot(aes(factor(Hugo_Symbol, levels = Hugo_Symbol), n, fill = Hugo_Symbol))

那如果想要繪制多分組數(shù)據(jù),要怎么做呢上遥?

這份數(shù)據(jù)實在是畫不出來效果搏屑,所以手動構(gòu)建了一份基因突變數(shù)據(jù)

# 設(shè)置空白柱子的個數(shù)
empty_bar = 2
# 自定義突變類型
mut_type <- c("Ins", "Del", "Mismatch", "Silent")
# 構(gòu)造數(shù)據(jù)
data <- tibble(
  gene=paste( "Gene ", seq(1,60), sep=""),
  group=c(rep('Ins', 10), rep('Mismatch', 30), rep('Del', 14), rep('Silent', 6)) ,
  value=sample(seq(10,100), 60, replace=T)
) %>%
  # 添加 NA 數(shù)據(jù),用于在分組之間繪制空白柱形
  add_row(tibble(
    gene = rep(NA, empty_bar * length(mut_type)),
    group = rep(mut_type, empty_bar),
    value = gene
  )) %>%
  mutate(group = factor(group, levels = mut_type)) %>%
  # 排序粉楚,為了讓統(tǒng)一分組繪制在一起
  arrange(group)

# 構(gòu)造唯一標識睬棚,用作 x 軸,并按該順序繪制
data$id = 1:nrow(data)
# 添加顯示文本的角度
angle <- 90 - 360 * (data$id - 0.5) / nrow(data)
# 添加內(nèi)圈注釋
base_anno <- group_by(data, group) %>%
  summarise(start = min(id), end = max(id) - empty_bar) %>%
  mutate(mid = (start + end) / 2)
  
ggplot(data, aes(id, value, fill = group)) +
  geom_col(position = position_dodge2()) +
  geom_text(aes(y = value + 18, label = gene), size = 2.5, alpha = 0.6, 
            angle = ifelse(angle < -90, angle+180, angle)) +
  # 內(nèi)圈注釋
  geom_segment(data = base_anno, aes(x = start, y = -5, xend = end, yend = -5),
               colour = "grey40") +
  geom_text(data = base_anno, aes(x = mid, y = -18, label = group), 
            angle = c(-26, -100, -50, 26), colour = "grey40") +
  coord_polar() +
  ylim(-100,120) +
  theme(
    panel.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
  )

是不是也很簡單解幼。不對抑党,好像還是有點復(fù)雜的,但是還是很容易理解的撵摆。

繪制徑向熱力圖底靠,我們使用了比特幣從 2015-2018 年的價格數(shù)據(jù)

https://github.com/dxsbiocc/learn/blob/main/data/bit_data.csv

bit_data <- read_csv("~/Downloads/bit_data.csv")

group_by(bit_data, year, month) %>%
  summarise(value = mean(High), .groups = "drop") %>%
  ggplot(aes(factor(month), year, fill = value)) +
  geom_tile(width = 1, colour = "white") +
  coord_polar() +
  ylim(c(2010, 2020)) +
  scale_fill_gradientn(colours = rainbow(10)) +
  theme(
    panel.background = element_blank(),
    panel.grid.major = element_line(colour = "grey80",size=.25),
    axis.text.x = element_text(size = 9, colour="black", angle = seq(-10, -350, length.out = 12)),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    axis.title = element_blank()
  )

從內(nèi)圈到外圈,依次代表 2015-2018 年特铝,每圈有 12 段代表月份暑中,顏色深淺代表價格

我們還可以將每個年份數(shù)據(jù)分開壹瘟,同時還添加了一些隨機擾動,代表一些未知因素鳄逾。

group_by(bit_data, year, month) %>%
  summarise(value = mean(High)) %>%
  mutate(
    xmin = month,
    xmax = month + 1,
    ymin = (year - 2015) * 10 + 1,
    ymax = ymin + sample(1:5, n(), replace = TRUE)
    ) %>%
  ggplot(aes(fill = value)) +
  geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax)) +
  scale_x_continuous(breaks = seq(1.5, 12.5, 1), labels = month.name) +
  scale_fill_gradientn(colours = rainbow(10)) +
  coord_polar() +
  ylim(c(-5, 40)) +
  theme(
    panel.background = element_blank(),
    panel.grid.major = element_line(colour = "grey80",size=.25),
    axis.text.x = element_text(size = 9, colour="black", angle = seq(-10, -350, length.out = 12)),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    axis.title = element_blank()
  )

哈哈稻轨,圖形看起來又不大一樣了。

代碼:
https://github.com/dxsbiocc/learn/blob/main/R/plot/polar_bar.R

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雕凹,一起剝皮案震驚了整個濱河市殴俱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枚抵,老刑警劉巖线欲,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汽摹,居然都是意外死亡李丰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門逼泣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趴泌,“玉大人,你說我怎么就攤上這事拉庶□馓郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵砍的,是天一觀的道長痹筛。 經(jīng)常有香客問我,道長廓鞠,這世上最難降的妖魔是什么帚稠? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮床佳,結(jié)果婚禮上滋早,老公的妹妹穿的比我還像新娘。我一直安慰自己砌们,他們只是感情好杆麸,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浪感,像睡著了一般昔头。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上影兽,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天揭斧,我揣著相機與錄音,去河邊找鬼峻堰。 笑死讹开,一個胖子當(dāng)著我的面吹牛盅视,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旦万,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闹击,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了成艘?” 一聲冷哼從身側(cè)響起赏半,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狰腌,沒想到半個月后除破,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牧氮,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡琼腔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了踱葛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丹莲。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尸诽,靈堂內(nèi)的尸體忽然破棺而出甥材,到底是詐尸還是另有隱情,我是刑警寧澤性含,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布洲赵,位于F島的核電站,受9級特大地震影響商蕴,放射性物質(zhì)發(fā)生泄漏叠萍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一绪商、第九天 我趴在偏房一處隱蔽的房頂上張望苛谷。 院中可真熱鬧,春花似錦格郁、人聲如沸腹殿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锣尉。三九已至,卻和暖如春决采,著一層夾襖步出監(jiān)牢的瞬間悟耘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工织狐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暂幼,地道東北人筏勒。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像旺嬉,于是被迫代替她去往敵國和親管行。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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