超强脑洞第三弹之——ggplot构造瀑布图

对,就是瀑布图,你没看错。而且是使用ggplot现有图层叠加构造,并没有用任何ggplot的外挂插件。

数据准备:

作图理念是在数据源的构造上,方法与《Excel图表之道》《Excel图表拒绝平庸》中的方法一致,我只是加入了自己的技巧。

1
2
3
4
library("reshape2")
library("ggplot2")
library("ggmap")
library("Cairo")

构造瀑布图数据源:

1
2
3
4
5
6
7
8
Item<-c("Before","Factor A","Factor B","Factor C","Factor D","Factor E","Factor F","Factor G","After")
Data<-c(325,-32,-105,38,86,97,232,389,1030)
mydata<-data.frame(Item,Data,stringsAsFactors =F)
mydata$BA<-mydata$Data
mydata$Dummy<-0
mydata$add<-0
mydata$Reduc<-0
mydata$BA[2:8]<-0

1
2
3
4
5
6
7
8
9
for (i in 2:8){
ifelse(mydata$Data[i]<0,mydata$Dummy[i]<-sum(mydata$Data[1:i]),mydata$Dummy[i]<-sum(mydata$Data[1:i-1]))
}
for (i in 2:8){
ifelse(mydata$Data[i]<0,mydata$add[i]<-0,mydata$add[i]<-mydata$Data[i])
}
for (i in 2:8){
ifelse(mydata$Data[i]<0,mydata$Reduc[i]<-abs(mydata$Data[i]),mydata$add[i]<-0)
}
1
2
3
mydata1<-mydata[,-2]
mydataA<- melt(mydata1,id.vars ="Item",variable.name = "class", value.name = "scope")
mydataA$class<-factor(mydataA$class,levels=c("Reduc","add","Dummy","BA"),order=T)

图形可视化:

色盘设置:

1
Color<-c("#A6442A","#015313","#FFFFFF","#131F37")

作图函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CairoPNG(file="C:/Users/Administrator/Desktop/瀑布图1.png",width=650,height=360)
ggplot()+
geom_bar(data=mydataA,aes(x=Item,y=scope,fill=class),stat="identity",position="stack",width=1)+
scale_x_discrete(limits=Item)+
scale_fill_manual(values=Color)+
guides(fill=FALSE)+
geom_text(data=mydata1,aes(x=Item,y=BA/2),label=ifelse(mydata1$BA!=0,mydata1$BA,""),col="white")+
geom_text(data=mydata1,aes(x=Item,y=Dummy+add),label=ifelse(mydata1$add!=0,paste("+",mydata1$add,sep=""),""),col="#015313",vjust=-.5)+
geom_text(data=mydata1,aes(x=Item,y=Dummy),label=ifelse(mydata1$Reduc!=0,paste("-",mydata1$Reduc,sep=""),""),col="#A6442A",vjust=1.2)+
theme(
panel.background=element_blank(),
axis.title=element_blank(),
axis.text = element_text(colour ="black",size=12,face="italic"),
axis.text.y=element_blank(),
axis.ticks=element_blank()
)
dev.off()

通过角度旋转,得到水平方向瀑布图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CairoPNG(file="C:/Users/Administrator/Desktop/瀑布图2.png",width=650,height=360)
ggplot()+
geom_bar(data=mydataA,aes(x=Item,y=scope,fill=class),stat="identity",position="stack",width=1)+
scale_x_discrete(limits=Item)+
scale_fill_manual(values=Color)+
coord_flip()+
guides(fill=FALSE)+
geom_text(data=mydata1,aes(x=Item,y=BA/2),label=ifelse(mydata1$BA!=0,mydata1$BA,""),col="white")+
geom_text(data=mydata1,aes(x=Item,y=Dummy+add),label=ifelse(mydata1$add!=0,paste("+",mydata1$add,sep=""),""),col="#015313",hjust=-.20)+
geom_text(data=mydata1,aes(x=Item,y=Dummy),label=ifelse(mydata1$Reduc!=0,paste("-",mydata1$Reduc,sep=""),""),col="#A6442A",hjust=1.2)+
theme(
panel.background=element_blank(),
axis.title=element_blank(),
axis.text = element_text(colour ="black",size=12,face="italic"),
axis.text.x=element_blank(),
axis.ticks=element_blank()
)
dev.off()

核心要点总结:

  • 数据源组织:瀑布图高度依赖数据源组织,如果你不太熟悉R中的数据操纵,完全可以将数据源组织过程在excel使用函数完成,然后倒入R并转为长数据进行作图。
  • 数据宽转长过程:转换后的因子变量的四个水平顺序要重点注意。因子水平顺序为:降低值<增加值<占位值<开头/结尾值。(顺序万不能乱)。
  • 色盘颜色顺序:与因子水平顺序一致。第三个为白色,其他与之对应。

联系方式:
wechat:ljty1991
Mail:578708965@qq.com
个人公众号:数据小魔方(datamofang)
团队公众号:EasyCharts
qq交流群:[魔方学院]298236508

个人简介:
杜雨
财经专业研究僧;
伪数据可视化达人;
文科背景的编程小白;
喜欢研究商务图表与地理信息数据可视化,爱倒腾PowerBI、SAP DashBoard、Tableau、R ggplot2、Think-cell chart等诸如此类的数据可视化软件,创建并运营微信公众号“数据小魔方”。
Mail:578708965@qq.com


备注信息:
知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

坚持原创技术分享,您的支持将鼓励我继续创作!