作者:Bruno Rodrigues
原文链接:https://www.brodrigues.co/blog/2018-10-05-ggplot2_purrr_officer/

来源:R语言


最近我面临以下的问题:创建数以百计的图片以便我们的客户仍旧可以编辑。这意味着我需要把图表导出到Excel、PPT或者其它客户熟悉的工具,而不是像往常那样把图片直接以pdf或者png形式导出。尽管我还是希望使用R解决这个问题,因为我可以进行一直以来的操作,当我需要完成重复性任务时,比如生成上百张图,就像一系列国家的地图,并且每个国家单独制作一张。这是我在前一篇博客里面讨论的内容, Make ggplot2 purrr

因此,经过上网搜寻,我发现了{officer}包,这个包允许你把对象放在Microsoft文件中。比如,可编辑图放在ppt文件中。这就是我将要在这篇博客中展示的。
先从装载需要的包开始:

1library("tidyverse")2library("officer")3library("rvg")

然后,我将使用“时间使用”调查的数据,这数据我在前一篇博客中Going from a human readable Excel file to a machine-readable csv with {tidyxl}(翻译)有讨论。
你可以在这里下载数据。
让我们导入并且预处理数据吧!

1time_use <- rio::import("clean_data.csv")234time_use <- time_use %>%5    filter(population %in% c("Male", "Female")) %>%6    filter(activities %in% c("Personal care", "Sleep", "Eating", 7                             "Employment", "Household and family care")) %>%8    group_by(day) %>%9    nest()

我只保留了两类:“Male”和“Female”,以及5项活动。接着按照day分组并把其余的nested在data中。以下就是呈现的状况:

1time_use
1## # A tibble: 3 x 22##   day                         data             3##   <chr>                       <list>           4## 1 Year 2014_Monday til Friday <tibble [10 × 4]>5## 2 Year 2014_Saturday          <tibble [10 × 4]>6## 3 Year 2014_Sunday            <tibble [10 × 4]>

正如展现的那样,'time_use'是一个有两列的tibble,第一列'day'包含了days,第二列'data'是一个类型列,并且列中的每个元素是自身的tibbles。让我们看看其中一个的内容:

1time_use$data[1]
 1## [[1]] 2## # A tibble: 10 x 4 3##    population activities                time  time_in_minutes 4##    <chr>      <chr>                     <chr>           <int> 5##  1 Male       Personal care             11:00             660 6##  2 Male       Sleep                     08:24             504 7##  3 Male       Eating                    01:46             106 8##  4 Male       Employment                08:11             491 9##  5 Male       Household and family care 01:59             11910##  6 Female     Personal care             11:15             67511##  7 Female     Sleep                     08:27             50712##  8 Female     Eating                    01:48             10813##  9 Female     Employment                06:54             41414## 10 Female     Household and family care 03:49             229

现在可以使用以下的代码为每一天绘制图了:

1my_plots <- time_use %>%2    mutate(plots = map2(.y = day, .x = data, ~ggplot(data = .x) + theme_minimal() +3                       geom_col(aes(y = time_in_minutes, x = activities, fill = population), 4                                position = "dodge") +5                       ggtitle(.y) +6                       ylab("Time in minutes") +7                       xlab("Activities")))

这些步骤在之前的博客中 Make ggplot2 purrr都很详细。查看my_plots

1my_plots
1## # A tibble: 3 x 32##   day                         data              plots   3##   <chr>                       <list>            <list>  4## 1 Year 2014_Monday til Friday <tibble [10 × 4]> <S3: gg>5## 2 Year 2014_Saturday          <tibble [10 × 4]> <S3: gg>6## 3 Year 2014_Sunday            <tibble [10 × 4]> <S3: gg>

最后一列plots是一个列,其中每个元素都是一张图!我们可以看看其中一个:

1my_plots$plots[1]
1## [[1]]

这就是我可以导出为pdf或者png形式的图象。但这不是我想要的,我需要把这些图象导出为ppt可操作的图表。对于每一个图像,我会采用以下操作(包含每个{officer}的文件):

1read_pptx() %>%2    add_slide(layout = "Title and Content", master = "Office Theme") %>%3    ph_with_vg(code = print(one_plot), type = "body") %>% 4    print(target = path)

我写了一个包装把一系列的参数结合起来:

 1create_pptx <- function(plot, path){ 2    if(!file.exists(path)) { 3        out <- read_pptx() 4    } else { 5        out <- read_pptx(path) 6    } 7 8    out %>% 9        add_slide(layout = "Title and Content", master = "Office Theme") %>%10        ph_with_vg(code = print(plot), type = "body") %>% 11        print(target = path)12}

该函数有两个参数:plot以及pathplot必须是一个plot对象,就像my_plots里面的plots列包含的plot对象那样。path是我想要保存pptx的路径。
第一行检查文件是否存在,如果是,slides就会添加到存在的文件中,如果不是,一个新的pptx被创建。其余的代码跟文件里面的非常相似。现在,为了创建我的pptx,我只需要把plots列匹配好并且提供一个path

1map(my_plots$plots, create_pptx, path = "test.pptx")
1## [[1]]2## [1] "/home/cbrunos/Documents/b-rodrigues.github.com/content/blog/test.pptx"3## 4## [[2]]5## [1] "/home/cbrunos/Documents/b-rodrigues.github.com/content/blog/test.pptx"6## 7## [[3]]8## [1] "/home/cbrunos/Documents/b-rodrigues.github.com/content/blog/test.pptx"

这是最后的结果:


往期精彩

  • 头条、快手,那些我曾经错过的暴富机会

  • 同为数据分析师,有人14k,你却6k?

  • R语言中文社区2018年终文章整理(作者篇)

  • R语言中文社区2018年终文章整理(类型篇)

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战
回复 Python       1小时破冰入门
回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习     机器学习的商业应用
回复 数据科学     数据科学实战
回复 常用算法     常用数据挖掘算法

R导出可编辑图到ppt:结合使用ggplot2以及officer相关推荐

  1. r语言remarkdown展示图_解决R markdown 图片显示不完整

    R markdown功能多多 可以用网页HTML.PDF.Word等多种展示方式.做presentation非常有用,文件小,内容大.最近我想做一个R Markdown写一些作用,然后发现R Mark ...

  2. R语言学习 - 热图简化

    前面推出过热图绘制和热图美化,现在来一个函数绘制热图的简化方式.文后更有不用写代码的在线工具可用. R语言 - 基础概念和矩阵操作 R语言 - 热图简化 R语言 - 热图绘制 (heatmap) R语 ...

  3. R语言学习 - 热图美化 (数值标准化和调整坐标轴顺序)

    生物信息学习的正确姿势 NGS系列文章包括NGS基础.在线绘图.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程).单细胞 ...

  4. 计算机地图制图成图方法,第五章 地图成图方法.ppt

    <第五章 地图成图方法.ppt>由会员分享,可在线阅读,更多相关<第五章 地图成图方法.ppt(17页珍藏版)>请在人人文库网上搜索. 1.黄河水利职业技术学院测绘工程系 刘剑 ...

  5. 怎么将PPT转换成一个长图,PPT转长图教程

    ppt是我们经常用到的一种文档格式,有时候我们需要将ppt成JPG和png格式的长图,那么大家知道怎么样才能将ppt转JPG和png格式的长图呢?其实步骤很简单,无需下载任何转换软件,在线即可轻松转换 ...

  6. r语言 html gif,推荐 :6步教你用R语言制作动图

    原标题:推荐 :6步教你用R语言制作动图 引言 数据可视化可能是数据科学领域最重要却通常最少被提及的部分. 我这么说是因为创造数据故事和可视化对你的顾客最终怎么看待你的工作有巨大的影响.数据科学不仅仅 ...

  7. R - Boxplots(R简单制作箱形图)

    R - Boxplots(R简单制作箱形图) 箱线图是衡量数据集中数据分布情况的指标. 它将数据集分为三个四分位数. 该图表示数据集中的最小值,最大值,中值,第一四分位数和第三四分位数. 通过为每个数 ...

  8. R绘图笔记 | 小提琴图与漂亮的云雨图绘制

    参考前文:R绘图笔记 | R语言绘图系统与常见绘图函数及参数 关于绘图图,前面介绍了一些: R绘图笔记 | 一般的散点图绘制 R绘图笔记 | 柱状图绘制 R绘图笔记 | 直方图和核密度估计图的绘制 R ...

  9. 用计算机画函数图象的软件,信息技术应用 用计算机画函数图象 .ppt

    信息技术应用 用计算机画函数图象 .ppt (27页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 八年级 下册19.1.1 变量与函数( ...

  10. R语言可视化斜率图、扩充图像纵横比为数据标签显示更整齐、ggrepel包来帮忙

    R语言可视化斜率图.扩充图像纵横比为数据标签显示更整齐.ggrepel包来帮忙 目录

最新文章

  1. Windows下安装Redis服务
  2. 腾讯清新云计算数据中心主体工程明年初竣工
  3. 数据集-用于数据挖掘、信息检索、知识发现等
  4. Python视频处理案例六则:旋转视频、调整音量/播放速度、淡入淡出、插入转场素材...
  5. day25-3 json,pickle模块
  6. mysql分段统计ceil
  7. 华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
  8. [云原生专题-3]:云平台 - 云计算平台快速入门
  9. paxos算法例子图解
  10. 打开计算机无法显示工具栏,任务栏不显示打开的窗口怎么办教程
  11. JAVA_SE实现桌面化功能
  12. Linux进程间通信——管道通信详解
  13. 身家破亿!86版「红孩儿」拒绝出道成学霸,已是中科院博士,名下52家公司
  14. linux新建用户退格键(删除键)无法正常使用的问题总结
  15. asp.net1050-消防车辆维修保养辅助系统#毕业设计
  16. (三)Linux vi 文本编辑器,用户管理,组管理,Sudo命令,时间管理
  17. PySide6 Widgets基本小部件类--QWidget
  18. 【解决】无法为JSP编译类: Enumeration cannot be resolved to a variable
  19. Go语言中的字符串特性
  20. mac linux网卡驱动下载官网下载,linux | 网卡驱动

热门文章

  1. 掌管大局的IoC Service Provider
  2. Spark中sortByKey和sortBy对(key,value)数据分别 根据key和value排序
  3. Java 实现导出excel表 POI
  4. Mac 如何查看电脑的蓝牙版本信息
  5. 终于搞懂了Java 8 的内存结构,再也不纠结方法区和常量池了!!
  6. Go语言构建高并发分布式系统实践
  7. 一次性搞清楚线上CPU100%,频繁FullGC排查套路
  8. 做梦都没想到,就这样得到了一位大佬的青睐
  9. 百度地图手机端单触点单击和长按事件,解决部分手机(小米手机)地图单击事件失效,多触点、拖动依然触发长按的bug...
  10. FileStream:The process cannot access the file because it is being used by another process