之前我們已經(jīng)講過很多條形圖啦茂嗓,但是今天我們再來講一種條形圖——環(huán)狀條形圖(Circular barplot)档冬。當厭倦普通的條形圖的時候或者空間有限但是要展示較多樣本的時候讼撒,都可以考慮使用環(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ù)進行作圖可霎,首先我們來看看怎么把普通的柱狀圖變成環(huán)形的魄鸦。
為了能夠滿足Tree和Pop分開的效果,我們需要把Pop的數(shù)值變成負數(shù)癣朗。
library(tidyverse)
TP<-read.table('~/Desktop/dat.txt',header = T,sep='\t',stringsAsFactors = F,check.names = F)
head(TP)
#Pop值和Trees相比較小所以需要適當擴大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進行排序旷余。具體的排序規(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ǔ)上標記上數(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签孔,顏色為白色,當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中進行最后的調(diào)整,比如加上中間的字抽高。
左上角的圖可以用下述代碼進行制作判耕。為了偷懶我就copy原文中的代碼,沒有調(diào)整參數(shù)翘骂,而是在AI中進一步調(diào)整的壁熄。
ggplot(TP, aes(x = Pop, y = Trees)) +
geom_point(size = 3) +
theme_minimal()
然后在AI中一番修改,坐標用了Arial字體碳竟,標題等用了NewsGoth Lt BT Light(感覺和原圖比較相似)草丧。根據(jù)原圖添加了相關(guān)的坐標軸名稱等,然后把兩張圖拼接在了一起莹桅。(有一些細節(jié)比如左上角還根據(jù)地理位置對點進行了劃分昌执,我就忽略啦)
今天的分享就到這里啦。
往期R數(shù)據(jù)可視化分享
R數(shù)據(jù)可視化18:弧形圖
R數(shù)據(jù)可視化17:烧┢茫基圖
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: 火山圖