专栏首页数据小魔方超强脑洞第三弹之——ggplot构造瀑布图

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

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

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

library("reshape2") library("ggplot2") library("ggmap") library("Cairo")

构造瀑布图数据源:

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

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) }

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)

色盘设置:

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

作图函数:

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()

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

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并转为长数据进行作图。
  • 数据宽转长过程:转换后的因子变量的四个水平顺序要重点注意。因子水平顺序为:降低值<增加值<占位值<开头/结尾值。(顺序万不能乱)。
  • 色盘颜色顺序:与因子水平顺序一致。第三个为白色,其他与之对应。

本文分享自微信公众号 - 数据小魔方(datamofang),作者:小魔方

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-02-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • shiny动态仪表盘应用——中国世界自然文化遗产可视化案例

    这一篇很早就想写了,一直拖到现在都没写完。 虽然最近的社交网络上娱乐新闻热点特别多,想用来做可视化分析的素材简直多到不可想象,但是我个人一向不追星,对明星热文和...

    数据小磨坊
  • R语言爬虫实战——网易云课堂数据分析课程板块数据爬取

    R语言的爬虫生态虽然与Python相比要弱小很多,but,如果你真的想要用R干一些有趣的事情,那么R语言目前所具有的的网络爬取工具也能给你带来很多方便。 今天...

    数据小磨坊
  • 用编程赋能工作系列——解锁合并单元格问题

    能把学习的编程技能用在实际工作中,提升效率、解决痛点、释放生产力,个人觉得是学习编程技能ROI最高的回报,而非都要挤破头成为数据科学家、算法工程师,毕竟这些职业...

    数据小磨坊
  • 网址命名规则,如何有利于百度收录与SEO排名?

    根据以往的SEO工作经验,另搜索引擎头痛的问题,往往是来自过于复杂的网址结构,它让SEO的效果大打折扣,往往事倍功半。

    数据通20847430
  • JDBC 通过PreparedStatement 解决SQL注入(5)

    在浏览器地址栏输入:test.com/sql/article.php?id=1,这是请求方式为get的接口,发送这个请求相当于调用一个查询语句

    桑鱼
  • IntelliJ 的书签(Bookmarks)

    例如希望在我们的代码中打上这个标签,选择你需要打标签的行,如果你希望打上书签 1。

    HoneyMoose
  • 基于springCloud构建微云架构技术分享

    一,什么是微服务 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务。这些小的Web服务可以...

    架构师小秘圈
  • Pycharm:书签的使用

    有时候我们的代码会写很长,为了查找方便,我们会在经常需要查看的地方插入一个书签。 在 Pycharm 中,将光标移动到需要创建书签的行,按 F11 可以创建一个...

    丹枫无迹
  • java高并发系列 - 第12天JUC:ReentrantLock重入锁

    synchronized是java内置的关键字,它提供了一种独占的加锁方式。synchronized的获取和释放锁由jvm实现,用户不需要显示的释放锁,非常方便...

    路人甲Java
  • 每天一道剑指offer-数组中出现次数超过一半的数字

    今天的题目 每天的题目见github(看最新的日期): https://github.com/gzc426 具体的题目可以去牛客网对应专题去找。

    乔戈里

扫码关注云+社区

领取腾讯云代金券