前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R可视乎|瀑布图

R可视乎|瀑布图

作者头像
庄闪闪
发布2021-04-09 11:06:36
1.4K0
发布2021-04-09 11:06:36
举报

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行结果如下所示:

代码语言:javascript
复制
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流写。

代码语言:javascript
复制
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()进行分面,最后就是对主题进行设置。主题的设置有很多有趣的技巧,以后整理一篇完整的。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 庄闪闪的R语言手册 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.简介
  • 2.三维瀑布图
  • 数据介绍
  • 基础版本
    • 添加第四个变量
    • 行分面的带填充的曲线图
    • 基础版本
    • 加入第四个变量
      • 参考资料
      相关产品与服务
      图像处理
      图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档