原文地址:R笔记3:ggplot绘制商务图表--杂志级商业图表作者:刘万祥ExcelPro
文/ExcelPro的图表博客(转载请保留出处)

0、作图流程
如果是非IT人士,由于以往都是使用Excel作图,在看ggplot的两本书时会很困惑,一是书中的例子都是使用系统自带的数据集,初学者不知道如何换成自己的数据;二是那些数据集都是长数据,而初学者的数据可能都是宽数据,那些代码无法用。
经过摸索,R作图可能是如下流程:
读入数据 -> 数据塑形 -> 绘制图表 -> 雕琢图表 -> 导出图表
数据塑形是个新词汇,其实类似于在Excel中的作图数据准备。如果你的数据是类似订单清单这样的“长数据”,可以直接用来作图;如果是类似二维统计表格那样的“宽数据”,就可能需要进行“宽转长”的数据塑形。
和《图表之道》之前琢磨商业图表做法一样,本帖以制作一个常见的簇状柱形图为例,来学习ggplot作图的过程。
1、读入数据
由于我的数据是个简单的二维统计表格,读进去后是这样的:
mydat <- read.csv("c:/rstudy/table1.csv")
      quarter     yahoo     google
1     '04 III     18     8
2     '04 IV     19     18
3     '05 I     7     24
这个格式就是宽数据,不适合R作图,需要转换为长数据。
2、数据塑形
下面把宽数据转换为长数据。有多种方法,这里使用reshape2包里的melt方法。
library(reshape2)
mydat2 <- melt(mydat,id.vars="quarter",variable.name="company",value.name="count")
即以第1列quarter为关键字,把yahoo和google转换为字段company,指标则放入字段count。现在数据是这样的,这就是长格式了:
     quarter     company     count
1     '04 III     yahoo     18
2     '04 IV     yahoo     19
3     '05 I     yahoo     7
4     '04 III     google     8
5     '04 IV     google     18
6     '05 I     google     24
3、绘制图表
要制作一个簇状的柱形图,需要在geom_bar()中指明position="dodge",dodge的意思是避开,那就是绘制成并列的样子了。
library(ggplot2)
p <- ggplot(mydat2,aes(x=quarter,y=count,fill=company))+
     geom_bar(stat="identity",position="dodge")
p

这就是ggplot绘制图表的默认样式,网络上的各种教程也只介绍到这里为止。这个样式非常平实朴素,看起来很舒服很耐看,它是根据塔夫特等专家的理论设计的,适合科研、论文、统计之类的运用场景,但并不太适合商务环境。如果要制作《图表之道》中介绍的商务风格图表,下面需要进一步雕琢图表。
4、雕琢图表
雕琢图表最快的方式是套用主题,这和Excel是类似的。有人制作了ggthemes主题包,可以用来更改图表的主题外观。我喜欢其中的wsj和economist主题,就是我们推崇的华尔街日报风格和经济学人风格。先安装和加载ggthemes包:
install.packages("ggthemes")
library(ggthemes)
4.1、通过添加theme_wsj(),使用wsj主题,图表的背景、样式就变成wsj风格的了。
p + theme_wsj() + ggtitle("华尔街日报风格图表")
4.2、但现在填充色还是默认的,可添加scale_fill_wsj(),图表变成了wsj的填充色,并且图例前的标题也自动没有了。如果是散点或折线图,可使用scale_color_wsj()。
p + theme_wsj() + scale_fill_wsj("rgby", "") + ggtitle("华尔街日报风格图表")

非常经典的wsj图表配色风格。其中scale_fill_wsj() 的参数可以使用colors6,rgby,dem_rep,red_green,black_green,都是wsj常用的配色方案,非常好。
4.3、也可以手动指定柱形图的颜色,这样就可以使用我们看到的好的配色方案。这两个颜色是用《图表之道》介绍的吸色方法拾取的,方法见该书第1章。
p +  theme_wsj() + scale_fill_manual(values=c("#FB882C","#5B88A0")) + ggtitle("华尔街日报风格图表")
其他微调:现在图表还有些地方有ggplot的影子,可以继续微调一下。
4.4、柱形图的组间间距可以调整大一点,经测试,使用width=0.65接近Excel里的分类间距100%。
ggplot(mydat2,aes(x=quarter,y=count,fill=company))+
     geom_bar(stat="identity",position="dodge",width=0.65)+
     theme_wsj()+
     scale_fill_manual(values=c("#FB882C","#5B88A0"))+
     ggtitle("华尔街日报风格图表")
4.5、一直觉得wsj图表的x轴刻度线特别长,是显著区别于Excel图表的一个地方,在Excel中实现代价太大,ggplot则有这个设置选项,可以设定其长度。
library(grid)  #使用unit需要先加载grid
ggplot(mydat2,aes(x=quarter,y=count,fill=company))+
     geom_bar(stat="identity",position="dodge",width=0.65)+
     theme_wsj()+
     scale_fill_manual(values=c("#FB882C","#5B88A0"))+
     ggtitle("华尔街日报风格图表")+
     theme(axis.ticks.length=unit(0.5,'cm'))

x轴刻度线变长了,但同时y轴的标签与网格线的距离也变大了,不知到如何只针对x轴,尝试axis.ticks.x.length无此属性,有知道的朋友望指点。
4.6、使用自定义颜色时,图例里出现了字段名称,不需要,可以单独去掉:
library(grid)  #使用unit需要先加载grid
ggplot(mydat2,aes(x=quarter,y=count,fill=company))+
     geom_bar(stat="identity",position="dodge",width=0.65)+
     theme_wsj()+
     scale_fill_manual(values=c("#FB882C","#5B88A0"))+
     ggtitle("华尔街日报风格图表")+
     theme(axis.ticks.length=unit(0.5,'cm'))+
     guides(fill=guide_legend(title=NULL))

4.7、theme_wsj()里可以指定背景色,换成其他背景如灰色也很不错。有brown, gray, green, blue四种颜色可选,默认就是上面的brown。
ggplot(mydat2,aes(x=quarter,y=count,fill=company))+
     geom_bar(stat="identity",position="dodge",width=0.65)+
     theme_wsj(color="gray")+
     scale_fill_manual(values=c("#FB882C","#5B88A0"))+
     ggtitle("华尔街日报风格图表")+
     theme(axis.ticks.length=unit(0.5,'cm'))+
     guides(fill=guide_legend(title=NULL))

现在图表已经非常接近华尔街日报图表的风格和气质了,适合商务环境使用。
我们雕琢图表的过程,是把图表做到尽量符合商务图表的风格和气质,倒不一定要做到一模一样,神似即可。事实上,到第4步里的每一个图,都已经很好,比较商务。
另,如果使用经济学人的主题,图表马上变成下面这个样子,有兴趣可以继续雕琢。
ggplot(mydat2,aes(x=quarter,y=count,fill=company))+
     geom_bar(stat="identity",position="dodge",width=0.65)+
     theme_economist(base_size=14)+   
     scale_fill_economist()+
     ggtitle("经济学人风格图表")+
     guides(fill=guide_legend(title=NULL))

5、导出图表
一般用途直接通过Rstudio的界面导出即可。编程情况下则可输出到图片或pdf。
***
以上就是摸索用ggplot制作一个商务图表的过程,由于只是看书捣腾的,不知方式是否正确,如不对请轻拍。
通过这个练习过程,可以知道ggplot绘制图表的设定选项非常丰富,但这些都需要以代码设定,没有手册不可能都记住,为了做这个图查选项,我是反复查书的对应章节好几遍。
好的是代码一旦完成,可以反复使用,新的数据做图时替换数据源就可以,效率高,而且可以保证出图的格式一模一样。Excel制图则很难保证两次作图能格式化到一模一样,除非也是做好了模板套用。
折腾的结论是,一般工作环境下的普通图表还是用Excel来做,对于过于复杂、高级、超出Excel能力范围的图表,可以考虑利用ggplot来制作。当然,这是对统计格式的小数据而言,如果是几百兆的长数据,ggplot会有非常大的优势。
参考书目:R graphics cookbook,中文版名R数据可视化手册。
ExcelPro图表博客,专注于简单实用、专业有效的商务图表沟通方法。转载请注明出处。
最新商业图表案例教程见第1季、第2季,属于中高级程度,适合对图表品质要求高的朋友。提供xlsx源文件+pdf图文教程+在线视频演示3合1课程。
第1季:http://study.163.com/course/courseMain.htm?courseId=1096026
第2季:http://study.163.com/course/courseMain.htm?courseId=1152030
--------------------------------------
刘万祥
微博:@刘万祥ExcelPro
微信:iamExcelPro
博客:ExcelPro.blog.sohu.com
邮箱:ExcelPro2008@gmail.com

R笔记3:ggplot绘制商务图表…相关推荐

  1. R语言基于ggplot绘制多条ROC曲线(2)

    ROC曲线也叫受试者工作曲线,原来用在军事雷达中,后面广泛应用于医学统计中.ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的 ...

  2. R语言使用ggplot绘制线型与点

    # Load plyr so we can use ddply() to create the example data setlibrary(plyr)library(tidyverse)ggplo ...

  3. python商务图表_Excel 数据之美:科学图表与商业图表的绘制(全彩)

    本书主要介绍基于Excel 2016的科学图表和商业图表的绘制方法,首次引入R ggplot2.Python Seaborn.Tableau.D3.js.Matlab 2015.Origin等绘图软件 ...

  4. R语言ggplot绘制地图-报错汇总(一)

    R语言ggplot绘制地图-报错汇总 报错两例 报错1: 报错2: 报错两例 在用ggplot绘制地图时出现了两个报错,网上搜索了没有相关说明,虽然解决方式很蠢,但是可能对于出现同样报错的人会有帮助, ...

  5. R - ggplot绘制带误差线的柱状图

    ggplot绘制带误差线的柱状图 利用ggplot2 数据格式转换并做统计计算 绘制图形 ## 模拟 ## 导入包 library(ggplot2) library(reshape2) library ...

  6. ggplot绘制时间相关性折线图和面积图(2)

    折线图和面积图属于时间相关的周期性图表,既往我们已经介绍了使用ggplot绘制简单折线图的,今天我们继续使用我们的GDP数据来进一步深入绘制折线图,数据来源于网址: http://www.icane. ...

  7. ggplot绘制小提琴图

    我们既往已经讲过使用ggplot绘制箱型图,今天我们来聊聊ggplot绘制小提琴图,小提琴图在SCI论文中非常常见,特别是基因类的文章. 小提琴图其实可以算是箱型图的变种(等于:箱型图+核密度图),箱 ...

  8. 数据可视化——R语言ggplot2包绘制相关矩阵为热图

    数据可视化--R语言ggplot2包绘制相关矩阵为热图 概述:R语言软件和数据可视化--ggplot2快速绘制相关矩阵为热图.本文翻译了一篇英文博客,博客原文链接:http://www.sthda.c ...

  9. 数据可视化——R语言ggplot2包绘制精美的小提琴图(并箱线图或误差条图组合)

    数据可视化--R语言ggplot2包绘制精美的小提琴图(并箱线图或误差条图组合) 概述:R语言使用ggplot2工具包绘制小提琴图.为了使数据表达更加丰富,同时将小提琴图与箱线图和误差条图相结合.另外 ...

  10. html绘制静态图表,怎样用JavaScript和HTML5 Canvas绘制图表

    在这篇教程中,我将展示用JavaScript和canvas作为手段,在饼状图和圆环图上显示数字信息. 与从零到一创建图表相比,其实有更简便的方式,例如用CodeCanyon上的这个图表库 但是如果你想 ...

最新文章

  1. CoinMarketCap计划于11月发布新的流动性排名系统
  2. 利用Excel VBA实现批量数据分组转置
  3. android dropbox anr分析,Android如何分析排查ANR
  4. 小程序开发(8)-之跳转第三方小程序设计
  5. dorado 7 怎么样_一点点奶茶怎么样?消费者眼中的网红奶茶
  6. Spring4Shell 漏洞已遭Mirai 僵尸网络利用
  7. postfix邮件队列管理
  8. 超级扫盲-什么是设计模式?
  9. 关于主机的思维导图_思维导图可以整理哪些东西?
  10. 统计学习理论(SLT)与支持向量机(SVM)
  11. MySQL 查询统计订单
  12. 数据结构:手把手教你写代码系列总结与说明
  13. 纪录片:《独立游戏大电影》
  14. 前端入门 02:HTML入门
  15. 解决error: inlining failed in call to always_inline ‘int _mm_popcnt_u32(unsigned int)’
  16. 【控制系统数字仿真与CAD——实验报告】实验四:黄金分割法最优化PI调节器参数(文末附完整代码 + 实验结果)
  17. 合伙人股权设计的9点常识
  18. docx转doc时,防止公式被转成图片的解决办法
  19. 数梦工场的笔试编程1——同构字符串判断
  20. 国外信号与系统经典书籍收藏

热门文章

  1. edge保存页面html,Edge浏览器怎么保存网页 保存网页方法介绍
  2. 关于word2010指定位置插入页码及三线表格绘制问题
  3. 【java实现简单的登录界面】
  4. PVE7.2 显示CPU温度和频率
  5. Java中计算圆柱的体积
  6. python制作日历并保存成excel_Python+Excel制作精美壁纸日历,任意DIY
  7. 【配置git和github】github鉴权失败 git配置github 免密登录
  8. Yapi 配置 pm2服务
  9. ASO优化含义篇:积分墙是什么?
  10. 靠模仿红牛成为饮料界的“黑马”,东鹏特饮的未来如何谱写?