首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >R基础绘图篇 | 旭日图与冰柱图的绘制

R基础绘图篇 | 旭日图与冰柱图的绘制

作者头像
DataCharm
发布2023-08-23 10:46:53
发布2023-08-23 10:46:53
2.4K0
举报

写在前面

旭日图(sunbrust diagram),通常也被称为多层饼图(multi-level pie chart)或径向树图,通常会用来展示层级占比关系,通过一系列的圆环展示层次结构。冰柱图(icicle diagram)也叫分区层图(partition layer chart),也就是直角坐标系下的旭日图,他们都是展示层级占比关系的王者。

开始绘图

需要调用的R包有以下4个

代码语言:javascript
复制
library(ggraph)
library(igraph)
library(RColorBrewer)
library(dplyr)

读取数据

代码语言:javascript
复制
#df<-read.csv('旭日图.csv',header=TRUE,stringsAsFactors=FALSE)
df<-read.csv(file.choose( ),header=TRUE,stringsAsFactors=FALSE)

旭日图

分割角度均等平分

代码语言:javascript
复制
edges<- data.frame(rbind(
cbind(rep('origin',4),unique(as.character(df$Season))),
as.matrix(df[!duplicated(df[c('Season','Month')]),1:2]),
as.matrix(df[!duplicated(df[c('Month','Week')]),2:3])))
colnames(edges)<-c('from','to')
vertices0<-data.frame(name=unique(c(as.character(edges$from), as.character(edges$to))))
df_leaf<-df[,c('Week','Value','label')]
df_leaf$angle<-90-(1:nrow(df_leaf))/nrow(df_leaf)*360
df_leaf$angle<-ifelse(df_leaf$angle< -90, df_leaf$angle+180, df_leaf$angle)
vertices<-left_join(vertices0,df_leaf,by=c('name'='Week'))
graph <- graph_from_data_frame(edges, vertices = vertices)
# 分割角度均等平分
ggraph(graph, layout ='partition', circular = TRUE) +
geom_node_arc_bar(aes(filter =(depth<=2 & depth>0 )),fill='#FEE5D9',color='black',size=0.1)+#,size=size
geom_node_arc_bar(aes(filter =(depth==3 ),fill = Value),size=0.1)+
geom_node_text( aes(filter =(depth<=2 & depth>0 ),label=name,size=-depth),angle=0,colour="black") +
geom_node_text(aes(label=label,angle=angle),size=2,colour="black") +
scale_size(range=c(3,5))+
coord_fixed()+
scale_fill_distiller(palette='Reds')+
guides(size="none")+
theme_void()

冰柱图

分割角度均等平分

代码语言:javascript
复制
ggraph(graph, layout ='partition') +
geom_node_tile(aes(filter =(depth<=2)),fill='#FEE5D9',color='black',size=0.1)+#,size=size
geom_node_tile(aes(filter =(depth==3 ),fill = Value),size=0.1)+
geom_node_text(aes(filter =(depth<=2 & depth>0),label=name,size=-depth),angle=90,colour="black") +
geom_node_text(aes(label=label),size=2,angle=90,colour="black")+
scale_size(range=c(3,4))+
scale_y_reverse()+
scale_fill_distiller(palette="Reds",na.value = "#FFF2EC")+
guides(size="none")+
theme_void()

旭日图

分割角度与某个数值成比例

代码语言:javascript
复制
fake_circle<-c()
for (i in 1:nrow(df)){
fake_circle<-append(fake_circle,rep(df$Week[i],round(10*df$Value[i])))
}
edges<- data.frame(rbind(
cbind(rep('origin',4),unique(as.character(df$Season))),
as.matrix(df[!duplicated(df[c('Season','Month')]),1:2]),
as.matrix(df[!duplicated(df[c('Month','Week')]),2:3]),
cbind(fake_circle,as.character(1:length(fake_circle)))
))
colnames(edges)<-c('from','to')
vertices0<-data.frame(name=unique(c(as.character(edges$from), as.character(edges$to))))
df_leaf<-df[,c('Week','Value','label')]
df_leaf$angle<-90-(cumsum(df_leaf$Value)-df_leaf$Value/2)/sum(df_leaf$Value)*360
df_leaf$angle<-ifelse(df_leaf$angle< -90, df_leaf$angle+180, df_leaf$angle)
vertices<-left_join(vertices0,df_leaf,by=c('name'='Week'))
df_color<- data.frame(rbind(
as.matrix(df[!duplicated(df[c('Season','Season')]),c(1,1)]),
as.matrix(df[!duplicated(df[c('Season','Month')]),c(1,2)]),
as.matrix(df[!duplicated(df[c('Season','Week')]),c(1,3)])
))
colnames(df_color)<-c('Season','name')
vertices<-left_join(vertices,df_color,by='name')
graph <- graph_from_data_frame(edges, vertices = vertices)
#旭日图 分割角度与某个数值成比例
ggraph(graph, layout ='partition', circular = TRUE) +
geom_node_arc_bar(aes(filter =(depth<=3 & depth>0 ),fill = Season),size=0.1)+
geom_node_text(aes(filter =(depth<=2 & depth>0),label=name,size=-depth),angle=0,colour="black") +
geom_node_text(aes(label=label,angle=angle),size=2,colour="black")+
scale_size(range=c(3,4))+
coord_fixed()+
scale_fill_brewer(palette="Reds",direction=-1)+
guides(size="none",fill="none")+
theme_void()

冰柱图

分割角度与某个数值成比例

代码语言:javascript
复制
#冰柱图 分割角度与某个数值成比例
ggraph(graph, layout ='partition')+
geom_node_tile(aes(filter =(depth<=3 ),fill = Season),size = 0.1)+
geom_node_text(aes(filter =(depth<=2 & depth>0),label=name,size=-depth),angle=90,colour="black") +
geom_node_text(aes(label=label),size=2,angle=90,colour="black")+
scale_size(range=c(3,4))+
scale_y_reverse()+
scale_fill_brewer(palette="Reds",na.value = "#FFF2EC")+
guides(size="none",fill="none")+
theme_void()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataCharm 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档