學(xué)會(huì)用ggplot2畫堆積圖就等于學(xué)會(huì)畫餅圖,這樣一石二鳥的干貨汽馋,還不繼續(xù)往下看嗎侮东?
堆積柱狀圖(或百分比堆積圖)與餅圖都是我們常用的直觀描述數(shù)據(jù)占比的手段,它們的區(qū)別主要就在于一個(gè)是用柱子的高低來展示占比豹芯,另一個(gè)是扇形的大小悄雅,其實(shí)它們本質(zhì)相同,只是坐標(biāo)軸的類型不同铁蹈。那么在繪圖的時(shí)候其實(shí)也是互通的宽闲,通過繪制堆積柱狀圖后將坐標(biāo)軸稍微替換一下,就能夠?qū)瀳D繪制出來握牧。下面詳細(xì)介紹繪制過程容诬。
本文梗概
- 堆積柱狀圖的畫法
- 如何將堆積圖“一鍵”轉(zhuǎn)換為餅圖
預(yù)處理 - 創(chuàng)建需要輸入的數(shù)據(jù)框
cb = data.frame(tissue = rep("cord blood", 8),
celltype = c('T', 'NK', 'B',
'eos_mon_neu', 'NRBC', 'platelet', 'stem', 'DC'),
count = c(179937, 15398, 46749, 53229,
4873, 4613, 1807, 185))
這個(gè)數(shù)據(jù)框的第一列表示組織類型,第二列celltype是細(xì)胞類型沿腰,第三列count表示該細(xì)胞類型的數(shù)目有多少個(gè)览徒。
1. 畫堆積柱狀圖
這里注意使用geom_bar(),position = 'stack'矫俺,就會(huì)出現(xiàn)堆積圖吱殉,柱子的高度指的是比例掸冤。另外一種柱狀圖使用的是geom_col(),但它的高度指的是原始數(shù)據(jù)的大小友雳,這點(diǎn)需要加以區(qū)分稿湿。
library(ggplot2)
p = ggplot(cb,aes(x=tissue,y=count,fill=celltype)) +
geom_bar(stat = 'identity', width = 0.5, position = 'stack')
p
現(xiàn)在就畫好了最基礎(chǔ)的堆積柱狀圖。我們來美化一下它押赊。
改變配色:
p = p + scale_fill_brewer(palette ="Set3",direction = 1)
2. 轉(zhuǎn)換成餅圖
我們需要做的饺藤,就是將上面的堆積柱狀圖的坐標(biāo)軸改成極坐標(biāo)軸:
p = p + coord_polar(theta = 'y', direction = 1)
p
這時(shí)候餅圖就畫出來了。但是這樣的圖是不能用的流礁,畢竟橫縱坐標(biāo)的“count”和“tissue”都不再適用了涕俗,而外圈那些數(shù)字也需要去除。
去除橫縱坐標(biāo)標(biāo)題“tissue”神帅,“count”:
p = p + labs(x="",y="")
p
去除數(shù)字和“cord blood”字樣:
p = p + theme(axis.text = element_blank())
p
去除左上角那個(gè)辣眼睛的小點(diǎn)(其實(shí)是刻度):
p = p + theme(axis.ticks = element_blank())
p
將背景設(shè)置為透明:
p = p + theme(panel.background = element_rect(I(0)))
p
下面我們將這個(gè)餅圖上面用geom_text注釋上每部分的占比再姑,x = 1.1可以調(diào)整注釋距離圓心的位置,size調(diào)整字體大姓矣:
label <- paste0('(', round(cb$count/sum(cb$count) * 100, 1), '%)')
p = p+ geom_text(aes(x=1.1,label=as.character(label)),
position = position_stack(reverse =F,vjust=0.5),size=3)
p