之前我們已經(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)了全球的疫情狀況,直觀的同時還很美觀。

這是另一個例子,關(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()

然后我們在之前的基礎(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()

然后在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: 火山圖