ggplot制作分析仪表盘

浏览: 2377

ggplot2搞定分析仪表盘

ggplot的强大想必大家都已经通过各种途径和本号之前的推送文章见识到了,那么除了之前你看到哪些之外,它还能做哪些更加不可思议的东西呢~这个我一时半会真的没法明确点的告诉你~

只能说,我需要用灵感来证明它的强大……

以下是今天的案例,我会先给出单独一个仪表盘图表的绘制思路,然后利用循环,一次性迭代出你想要的数量,而且每一个单独的图表指标和标签都是个性化的,所以说掌握了本文的技巧,你相当于掌握了瞬间画出N多个易表盘的能力(当然速度要视自己的软硬件配置和代码水平而定)。

library(ggplot2) 
library("showtext")  
library
(Cairo)  
library
("Rmisc")  
library
(grid)  
font.add("myfont","msyh.ttc")
setwd("F:/微信公众号/公众号——数据小魔方/2017年4月/20170415")

仪表盘图表绘制思路:

生成辅助数据:

bardata<-seq(from=0,to=270,length=1000)
rectdata<-seq(from=0,to=270,by=27)%>%c(360)
target<-1/3
assist<-target*270

绘制过程代码:

CairoPNG(file="dashboard.png",width=800,height=540)
showtext.begin()
ggplot(data=NULL)+
geom_rect(aes(xmin=rectdata[-12],xmax=rectdata[-1],ymin=5,ymax=10),fill="#F2F2F2",col="white")+
geom_bar(aes(x=bardata,y=5,col=bardata),stat="identity",fill=NA,size=2)+
geom_text(aes(x=rectdata[-12],y=-5,label=seq(0,100,by=10)),vjust=.5,hjust=.5,size=5,family="myfont",col="#0F1110")+
geom_segment(aes(x=assist,y=-50,xend=assist,yend=-10),arrow =arrow(length=unit(0.4,"cm")),size=1.2,col="red")+
geom_point(aes(x=assist,y=-50),shape=21,fill="white",col="black",size=7)+
annotate("text",x=315,y=-30,label=percent(target),size=12,hjust=.5,vjust=.5,family="myfont",col=ifelse(target<.5,"#F32626","#38E968"),fontface="plain")+
annotate("text",x=315,y=-15,label="指标1",size=15,hjust=.5,vjust=.5,family="myfont")+
ylim(-50,12)+
coord_polar(theta="x",start=179.85)+
scale_colour_gradient(low="#F32626",high="#38E968",guide=FALSE)+
theme_minimal()+
theme(
text=element_blank(),
line=element_blank(),
rect=element_blank()
)
showtext.end()
dev.off()

效果图如下:


以下过程将展示如何和通过一次性多图合并,将多个仪表盘封装在一个版面上,并利用函数输出!

通过设置随机种子,你或许可以模拟出和我一样的数据源:

set.seed(123)
target<-runif(5,0,1) #实际业务指标(百分制)
assist<-270*target #将实际业务指标转换为270度单位

以下过程将展示同时输出多个仪表盘图表

CairoPNG(file="bigdashboard.png",width=1500,height=675)
showtext.begin()
grid.newpage()
pushViewport(viewport(layout=grid.layout(1,5)))
vplayout<-function(x,y){viewport(layout.pos.row =x,layout.pos.col=y)}
for
(i in 1:length(assist)){
p<-ggplot(data=NULL)+
geom_rect(aes(xmin=rectdata[-12],xmax=rectdata[-1],ymin=5,ymax=12),fill="#F2F2F2",col="white")+
geom_bar(aes(x=bardata,y=5,col=bardata),stat="identity",fill=NA,size=2)+
geom_text(aes(x=rectdata[-12],y=-5,label=seq(0,100,by=10)),vjust=.5,hjust=.5,size=3.5,family="myfont",col="#0F1110")+
geom_segment(aes(x=assist[i],y=-50,xend=assist[i],yend=-10),arrow =arrow(length=unit(0.4,"cm")),size=1.2,col="red")+
geom_point(aes(x=assist[i],y=-50),shape=21,fill="white",col="black",size=7)+
annotate("text",x=315,y=-30,label=percent(target[i]),size=7.5,hjust=.5,vjust=.5,family="myfont",col=ifelse(target[i]<.5,"#F32626","#38E968"),fontface="plain")+
annotate("text",x=315,y=-15,label=paste0("指标",i),size=8.5,hjust=.5,vjust=.5,family="myfont")+
ylim(-50,12)+
coord_polar(theta="x",start=179.85)+
scale_colour_gradient(low="#F32626",high="#38E968",guide=FALSE)+
theme_minimal()+
theme(
text=element_blank(),
line=element_blank(),
rect=element_blank()
)
print(p,vp=vplayout(1,i))
}
showtext.end()
dev.off()

以下是最终的效果图


正常情况下,你可以将此处代码作为模板使用,只需修改target的值即可!

推荐 0
本文由 EasyCharts 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册