R數(shù)據(jù)可視化19:環(huán)狀條形圖

之前我們已經(jīng)講過很多條形圖啦,但是今天我們再來講一種條形圖——環(huán)狀條形圖(Circular barplot)。當(dāng)厭倦普通的條形圖的時候或者空間有限但是要展示較多樣本的時候,都可以考慮使用環(huán)狀條形圖。

什么是環(huán)狀條形圖(Circular barplot)

條形圖是科研中常用的圖,但是有時候可能你會覺得普通的條形圖過于平平無奇。還有些時候展示的空間有限,數(shù)據(jù)卻很龐大,這時再用普通的條形圖可能就不利于展示信息了。那么要怎么辦呢?不如考慮一下使用環(huán)狀條形圖。我們先來看幾個關(guān)于環(huán)狀條形圖的例子。

2個月前,人民日報使用了環(huán)狀條形圖展現(xiàn)了全球的疫情狀況,直觀的同時還很美觀。

人民日報:截止北京時間3月11日12時 世界疫情地圖

這是另一個例子,關(guān)于森林覆蓋率和人口密度。每一根柱子代表一個州,綠色的柱子代表森林覆蓋率,灰色的代表人口密度。

森林覆蓋率與人口密度

通過上面兩個例子可以發(fā)現(xiàn)環(huán)狀條形圖是一種明明很簡單,但是卻讓你眼前一亮,覺得好像是種很華麗的數(shù)據(jù)展現(xiàn)方式。那么要如何作圖呢?

如何作環(huán)狀條形圖

1)需要什么樣的數(shù)據(jù)
我們這次使用的數(shù)據(jù)以及代碼來源Azandis的博客。我根據(jù)最終的圖片,整理了所需要的數(shù)據(jù)。

TP<-read.table('~/Desktop/dat.txt',header = T,sep='\t',stringsAsFactors = F,check.names = F)
head(TP)
State Trees  Pop
1    CT    73  7.4
2    MA    71  8.4
3    RI    70 10.2
4    NY    65  4.1
5    PA    66  2.8
6    VA    67  2.0

2)如何作圖
我們將使用ggplot函數(shù)進(jìn)行作圖,首先我們來看看怎么把普通的柱狀圖變成環(huán)形的。
為了能夠滿足Tree和Pop分開的效果,我們需要把Pop的數(shù)值變成負(fù)數(shù)。

library(tidyverse)
TP<-read.table('~/Desktop/dat.txt',header = T,sep='\t',stringsAsFactors = F,check.names = F)
head(TP)

#Pop值和Trees相比較小所以需要適當(dāng)擴(kuò)大10倍
TP <- mutate(TP, Pop.10 = Pop*10)
TP <- mutate(TP, Pop.10 = -Pop.10)

ggplot(TP, aes(x = State)) +
  geom_col(aes(y = Trees), fill = "#5d8402") +
  geom_col(aes(y = Pop.10), fill = "#817d79") +
  coord_polar()#變成環(huán)形

可以看到已經(jīng)有一點感覺了,但是這個圖有點混亂。所以我們先對圖像中的State進(jìn)行排序。具體的排序規(guī)則參考了原blog的代碼。

TP <- TP %>% mutate(TreeRank = rank(-Trees), PopRank = rank(-Pop)) %>% mutate(SqRank = (TreeRank^2)+(PopRank^2)/2) %>% mutate(RankOrder = rank(SqRank))

ggplot(TP, aes(x = reorder(State, RankOrder))) +
  geom_col(aes(y = Trees), fill = "#5d8402") +
  geom_col(aes(y = Pop.10), fill = "#817d79") +
  geom_text(aes(y = 100, label = State)) +
  coord_polar()+
  theme_void()

排序后的環(huán)形圖

然后我們在之前的基礎(chǔ)上標(biāo)記上數(shù)值:

ggplot(TP, aes(x = reorder(State, RankOrder))) +
  geom_col(aes(y = Trees), fill = "#5d8402") +
  geom_text(aes(y = ifelse(Trees >= 15, 8, (Trees + 10)), color = ifelse(Trees >= 15, 'white', '#5d8402'), label = round(Trees, 2)), size = 2.5)+#ifelse(test, yes, no),所以這里代表Trees如果大于等于15時,y=8,顏色為白色,如果小于15則y為Trees+10,顏色為綠色
  geom_col(aes(y = Pop.10), fill = "#817d79") +
  geom_text(aes(y = ifelse(Pop.10 <= -15, -8, (Pop.10 - 10)), color = ifelse(Pop.10 <= -15, 'white', '#817d79'), label = round(Pop, 1)), size = 2.5)+#Pop.10小于等于-15時,y=-8,顏色為白色,當(dāng)Pop.10大于-15時,y=Pop.10-10,顏色為綠色
  geom_text(aes(y = ifelse(Trees <= 50 , 60, Trees + 15), label = State),size=3) +
  coord_polar() +
  scale_y_continuous(limits = c(-150, 130)) +#y軸的范圍為-150到130
  scale_color_identity() +
  theme_void() 

保存后我們可以去AI中進(jìn)行最后的調(diào)整,比如加上中間的字。
左上角的圖可以用下述代碼進(jìn)行制作。為了偷懶我就copy原文中的代碼,沒有調(diào)整參數(shù),而是在AI中進(jìn)一步調(diào)整的。

ggplot(TP, aes(x = Pop, y = Trees)) +
  geom_point(size = 3) +
  theme_minimal()
raw image

然后在AI中一番修改,坐標(biāo)用了Arial字體,標(biāo)題等用了NewsGoth Lt BT Light(感覺和原圖比較相似)。根據(jù)原圖添加了相關(guān)的坐標(biāo)軸名稱等,然后把兩張圖拼接在了一起。(有一些細(xì)節(jié)比如左上角還根據(jù)地理位置對點進(jìn)行了劃分,我就忽略啦)

今天的分享就到這里啦。

往期R數(shù)據(jù)可視化分享
R數(shù)據(jù)可視化18:弧形圖
R數(shù)據(jù)可視化17:?;鶊D
R數(shù)據(jù)可視化16:啞鈴圖
R數(shù)據(jù)可視化15:傾斜圖 Slope Graph
R數(shù)據(jù)可視化14:生存曲線圖
R數(shù)據(jù)可視化13:瀑布圖/突變圖譜
R數(shù)據(jù)可視化12: 曼哈頓圖
R數(shù)據(jù)可視化11: 相關(guān)性圖
R數(shù)據(jù)可視化10: 蜜蜂圖 Beeswarm
R數(shù)據(jù)可視化9: 棒棒糖圖 Lollipop Chart
R數(shù)據(jù)可視化8: 金字塔圖和偏差圖
R數(shù)據(jù)可視化7: 氣泡圖 Bubble Plot
R數(shù)據(jù)可視化6: 面積圖 Area Chart
R數(shù)據(jù)可視化5: 熱圖 Heatmap
R數(shù)據(jù)可視化4: PCA和PCoA圖
R數(shù)據(jù)可視化3: 直方/條形圖
R數(shù)據(jù)可視化2: 箱形圖 Boxplot
R數(shù)據(jù)可視化1: 火山圖

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容