使用ggplot2制作放射狀玫瑰圖本不是什么難事,僅需將普通單序列柱形圖添加添加一個極坐標轉(zhuǎn)化參數(shù)即可。
但是遇到比較小清新的案例,還是值得手動操作一下的。
本文圖片案例來源于DT財經(jīng)關(guān)于星巴克門店分布TOP20城市分布數(shù)據(jù)圖,用色和呈現(xiàn)形式比較友好,所以就信手拿來作為案例分享給大家。

原圖中并未給出任何實際數(shù)據(jù)(所以需要用眼睛估測了~—~)
library('rvest')
library('dplyr')
library('ggplot2')
library('grid')
library('showtext')
library('Cairo')
font.add('myfont','msyh.ttc')
找一份網(wǎng)上的最新統(tǒng)計數(shù)據(jù)
url<-'http://bbs./thread-2715502-1-1.html'
table<-read_html(url,encoding='gbk')%>%html_nodes('td.t_f>table')%>%html_table(header =TRUE,trim =TRUE,fill=TRUE)%>%as.data.frame()
城市數(shù)據(jù)
mydata<-data.frame(
label=c('上海','北京','杭州','廣州','深圳','蘇州','成都','天津','南京','武漢','寧波','重慶','西安','無錫','廈門','青島','長沙','南通','常州','福州')
)
整理數(shù)據(jù)
mydata<-merge(mydata,table[,c('城市','門店數(shù)量')],by.x='label',by.y='城市',all.x=TRUE)
mydata[mydata$label=='常州','門店數(shù)量']=27
names(mydata)[2]<-'value'
mydata<-arrange(mydata,-value)%>%transform(id=1:20,class=c(1,6,rep(1:6,3)))
mydata$label<-as.character(mydata$label)
#標簽拆成單字換行,豎排布局:
label<-strsplit(mydata$label,'')
for (i in 1:length(label)){
mydata$label_ff[[i]]<-paste0(label[[i]],collapse='\n')
}
mydata[1:2,'label_ff']<-c('上海','北京')
mydata[16:20,'label_ff']<-c('青島','廈門','常州','福州','南通')
#計算標簽的旋轉(zhuǎn)角度:
mydata$angle=c(rev(9*(1:10-1) 4.5),-(9*(1:10-1) 4.5))
mydata$angle[16:20]<-rev(9*(1:5-1) 4.5)
圖形可視化過程:
p<-ggplot(mydata)
geom_col(aes(x=id,y=value,fill=factor(class)))
geom_hline(yintercept =c(25,50,100,200,500),linetype=2,size=.25)
geom_text(aes(x=id,y=value 12,label=label_ff,angle=angle),family='myfont',size=3.5,lineheight=1) #坐標軸放大一倍占位:scale_x_continuous(limits=c(0,40),expand=c(0,0)) #Y延伸到負值突出圓心的空白scale_y_continuous(limits=c(-100,600))
scale_fill_manual(values=c('#00643E','#207A57','#3D8C6D','#59A284','#76B69B','#95CBB3'),guide=FALSE)
coord_polar(start=-14.245)
theme_void();p

圖形輸出:
setwd('E:/數(shù)據(jù)可視化/R/R語言學(xué)習(xí)筆記/數(shù)據(jù)可視化/ggplot2/優(yōu)秀R語言案例')
CairoPNG(file='polar_rose.png',width=2400,height=1800)
showtext.begin()
grid.newpage()
pushViewport(viewport(layout=grid.layout(6,8)))
vplayout<-function(x,y){viewport(layout.pos.row =x,layout.pos.col=y)}
print(p,vp=vplayout(1:6,1:8))
showtext.end()
dev.off()

局部線條經(jīng)過手工修飾!
以上就是整個制圖過程,其中關(guān)于角度轉(zhuǎn)換以及細節(jié)處理問題均省略掉了,如需了解可以 單獨交流。
好了干貨完了,下面是一波廣告:
9月12日晚8~10點,本小編有一場關(guān)于ggplot2的微課,主要內(nèi)容如下:
1、ggplot2圖層語法的核心理念
2、ggplot函數(shù)與geom_xxx函數(shù)間的父子繼承關(guān)系
3、美學(xué)映射參數(shù)寫在ggplot函數(shù)內(nèi)與寫在geom_xxx內(nèi)的差異
4、美學(xué)映射參數(shù)寫在aes函數(shù)內(nèi)部和寫在aes函數(shù)外部的差異
5、顏色標度一共有幾種類型和寫法,在不同模塊中是否能夠共用
6、如何結(jié)合實際業(yè)務(wù)與引用場景進行顏色標度選擇
7、多圖層疊加時,如何解決顏色標度沖突的問題
8、分面函數(shù)的權(quán)限控制
9、主題框架與模塊間的繼承關(guān)系
10、主題函數(shù)更新與替換方案
11、圖形輸出與高清抗鋸齒渲染
其實這些問題都是之前我學(xué)習(xí)過程中走過的彎路,隨著練習(xí)的案例越來越多,這些問題一步步全都解決了,其實如果你能有心看完我的所有關(guān)于ggplot講解部分,差不多這些問題也都能全部理解。

掃描下方二維碼,免費加入課程