1.简介
瀑布图(waterfall plot) 用于展示拥有相同的X轴变量数据(如相同的时间序列)、不同的Y轴离散型变量(如不同的类别变量)和Z轴数值变量,可以清晰地展示不同变量之间的数据变化关系。
2.三维瀑布图
三维瀑布图可以看成是多数据系列三维面积图。R中plot3D
包的polygon3D()
函数和segments3D()
函数可以绘制三维面积图,lines3D()
函数可以绘制三维曲线图,所以,综合这几个函数可以绘制三维瀑布图,该代码,数据来源R语言书可视化之美[1]。
这是一本非常棒的R可视化书籍。小编预计在年底进行一次抽奖送该书的活动,尽情期待?。
数据介绍
原始数据如下所示:一共39行,9列数据。列表示不同组别,行表示不同x坐标下的数值大小,其中第一列表示x坐标位置。
代码语言:javascript复制library(plot3D)
library(RColorBrewer)
mydata0 <- read.csv("Facting_Data.csv",check.names =FALSE)
head(mydata0)
之后对数据进行一个变换,变成我们绘图所需要的数据格式(这里最费时间了)。因为从行来看,数据是离散的绘制出来效果不是很好,于是使用插值样条函数(spline
)对原始数据进行插值,变成了300行数据(n=300
)。这里做了一个for循环,把所有数据都进行了插值,列名存在了variable
中。mydata
的前6行结果如下所示:
N <- ncol(mydata0)-1
mydata <- data.frame(x=numeric(),y=numeric(),variable=character())
for(i in 1:N){
newdata <- data.frame(spline(mydata0[,1],mydata0[,i 1],n=300,method= "natural")) #进行插值
newdata$variable<-colnames(mydata0)[i 1]
mydata <- rbind(mydata,newdata)
}
mydata$variable <- as.numeric(mydata$variable)
group <- unique(mydata$variable) #每组的名称
M <- length(group) #组数
head(mydata)
进行颜色的处理,以及图片版式的设置。
代码语言:javascript复制gg_color_hue <- function(n) {
hues = seq(15, 375, length = n 1)
hcl(h = hues, l = 65, c = 100)[1:n]
}
colormap <- rev(gg_color_hue(M))#brewer.pal(M,'RdYlGn')
pmar <- par(mar = c(5.1, 4.1, 4.1, 6.1))
基础版本
这里先构建一个空的立方体,注意x,y,z轴的坐标范围,所以你得看看原始数据,再定范围,不能一股脑地拿来用。该函数的内部参数,在R可视乎|等高线有提过一些。或者将光标放在该函数,按F1寻求帮助文档,在这里就不做过多解释,Rstudio常用快捷键小编已经整理完,可学习使用。
代码语言:javascript复制perspbox(z=as.vector(0),#add=TRUE,
xlim=c(20,70),ylim=c(360,750),zlim=c(0,15),
ticktype = "detailed",bty = "f",box = TRUE,
colkey = FALSE,theta = -110, phi = 20, d=3)
使用polygon3D
函数和lines3D
函数将每一类的数据填充到立方体中。这里代码主要还是用base包写的,你可以试试tidyverse流写。
for (i in 1:M){
df0<-mydata[mydata$variable==group[i],]
Ndf<-nrow(df0)
df<-rbind(df0,c(df0$x[1],df0$y[Ndf],df0$variable[Ndf]))
with(df,polygon3D(x=variable,y=x, z=y, alpha=0.6,
col=colormap[i],lwd = 3,add=TRUE,colkey = FALSE))
with(df0,lines3D(x=variable,y=x, z=y,
lwd = 0.5,col="black",add=TRUE))
}
在此,就完成这个三维瀑布图了,美观度极佳,可解释性也不错。
添加第四个变量
如果想加入第四变量也是没问题的,具体不再重复。完整代码可见R语言书可视化之美或者我的github中。
行分面的带填充的曲线图
使用分面图的可视化方法也可以展示瀑布图的数据信息,关于分面图可视化方法我已经在R可视乎|分面一页多图介绍过。
下面进行行分面的带填充的曲线图绘制,所有数据共用X轴坐标,每个数据类别是用的Y轴坐标。
相对三维瀑布图,分面瀑布图的优点是:可以更好地展示数据信息,避免不同类别之间数据重叠引起的遮挡问题,但是不能很直接地比较不同类别之间的数据差异。
基础版本
这里不做过多解释,用geom_area()
绘制面积,用facet_grid()
进行分面,最后就是对主题进行设置。主题的设置有很多有趣的技巧,以后整理一篇完整的。
library(reshape2)
library(ggplot2)
mydata0<-read.csv("Facting_Data.csv",stringsAsFactors=FALSE)
colnames(mydata0)<-c("X_Axis",seq(60,25,-5))
mydata<-melt(mydata0,id.vars = "X_Axis")
ggplot(mydata,aes(X_Axis,value,fill=variable))
geom_area(color="black",size=0.25)
facet_grid(variable~.)
theme(
text=element_text(size=15,face="plain",color="black"),
axis.title=element_text(size=10,face="plain",color="black"),
axis.text = element_text(size=10,face="plain",color="black"),
legend.position="none"
)
加入第四个变量
同理,在上图的基础上可以将每个数据的Z变量进行颜色映射,这样有利于比较不同类别之间的数据差异,该图如下所示:
当然峰峦图也可以很好地展示瀑布图的数据信息,具体将在下一次可视化推送中进行介绍。
以上对绘制瀑布图(这里指的和网上说的瀑布图还不一样)进行了详细介绍了。本篇视为《R语言数据可视化之美》学习笔记,并进行函数详细介绍与解释,版权归原作者所有。其他可视化图可在菜单命令[可视化]中搜索得到。
参考资料
[1]
R语言书可视化之美: https://github.com/EasyChart/Beautiful-Visualization-with-R