3 min read

Excel作図で困ること

## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : there is no package called 'agricolae'
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : there is no package called 'slackr'

最近はMSoffice離れが進み、作図はR、たまにInkscapeで微調整という感じに落ち着いた
Excel+Powerpointでもそこそこ頑張れる
キレイに作図したいときはExcel上で図をコピーして、Powerpointに拡張メタファイル (.emf) 形式で貼付け (WinではAlt+E → S)、グループ化を解除すれば、要素に分解して微調整ができる
が、こんなことが起こる
sine_noise
線の折り返し部分が妙な感じになる
この原因は、Excel上で作られた線が枠+内部の2つの情報を持っていること
どうやらExcelでの作図では、すべてのオブジェクトがこのような袋構造になるようで、いかんともしがたい
少なくともExcel2003までは、Excel上で表示される線には線の情報しかなかったので、このようなことは起こらなかった


この描画問題で困っている人がいた
Rに限らず、全員がなんらかのソフトで作図できるようになればいいがそうもいかない
個々人に教えるのはあまりにも大変なので、どうにかしたい
ということで、Shinyでデータからpdf画像を作成するアプリを作った
emfで出力しても、Shiny越しだとpowerpoint上で分解できる形式にならなかったのでpdfで妥協
ここでも触れられているように、最近はなんでもRでやろうとするからダメ

使い方

csvファイルをアップロードし、downloadボタンを押すとpdf画像が保存できる
アップロードしたcsvファイルの第1カラムが横軸、以降のカラムが縦軸に表示される
とりあえず散布図にだけ対応
「pdfファイルで出力 → ドローソフト (Illustratorとか) で分解 → メタファイル出力してPowerpointへ」とやることになるんだけど、かなり面倒だ

結局 

各自がローカルでやるのがいいのだろう
ローカルだと3行で終わる話

# Macだとemfを書き込むためにパッケージが必要
# Winだとデフォルトの関数でいける
devEMF::emf(file = "test.emf")
plot(1:10)
dev.off()

「ハイクオリティな図が作りたいけど、そういうソフトを使うのは難しそうだし、ちょっと…。でもドローソフトは使えます!」なんていう人はかなりレアなので、出番はなさそう

実行環境

Mac: Office 2016 for Mac
Win: Office 2013

以下、Shinyのコード

library(shiny)
library(ggplot2)
library(dplyr)
library(reshape2)

ui <-
  shinyUI(
    pageWithSidebar(
      headerPanel(title="Scatter plot drawer"),
      sidebarPanel(
        fileInput("file", label="Input File:"),
        downloadLink('downloadData', 'Download')),
      mainPanel(
        h4("File Information:"),
        verbatimTextOutput("info"),
        h4("Figure"),
        plotOutput("plot")
      )
    ))

# server.R
server <-
  function(input, output) {
    output$info <- reactiveText(function(){
      file <- input$file
      if(is.null(file)) {
        "please upload file"
      } else {
        name <- paste("File Name: ", iconv(file$name, from="latin1", to="UTF-8"))
        size <- paste("File Size: ", file$size, "B")
        type <- paste("File Type: ", file$type)
        paste(name, size, type, sep="\n")
      }
    })
    output$plot <- reactivePlot(function() {
      file <- input$file
      if(is.null(file)) {
        "please upload file"
      } else {
        filepath <- file$datapath
        data <-
          read.csv(filepath) 
        data %>%
          melt(id.vars = colnames(data)[1]) %>%
          ggplot(aes_string(x = colnames(data)[1], y = "value", col = "variable")) +
          geom_line()
      }
    })
    output$downloadData <- downloadHandler(
      filename = function() {paste0(Sys.Date(), 'data.pdf')},
      content = function(file){
        pdf(file)
        csv_file <- input$file
        filepath <- csv_file$datapath
        data <-
          read.csv(filepath) 
        fig <-
          data %>%
          melt(id.vars = colnames(data)[1]) %>%
          ggplot(aes_string(x = colnames(data)[1], y = "value", col = "variable")) +
          geom_line()
          print(fig)
        dev.off()
      },
      contentType = "image/pdf"
    )
  }
sessionInfo()
## R version 3.5.0 (2018-04-23)
## Platform: x86_64-apple-darwin15.6.0 (64-bit)
## Running under: macOS Sierra 10.12.6
## 
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] grid      stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] RCurl_1.95-4.10     bitops_1.0-6        tidyr_0.8.0        
##  [4] devtools_1.13.5     pforeach_1.3        scales_0.5.0       
##  [7] lubridate_1.7.4     data.table_1.10.4-3 stringr_1.3.1      
## [10] magrittr_1.5        gridExtra_2.3       foreach_1.4.4      
## [13] gtable_0.2.0        knitr_1.20          reshape2_1.4.3     
## [16] dplyr_0.7.4         plyr_1.8.4          RColorBrewer_1.1-2 
## [19] ggplot2_2.2.1       MASS_7.3-49        
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.16      compiler_3.5.0    pillar_1.2.1     
##  [4] bindr_0.1.1       rngtools_1.2.4    iterators_1.0.9  
##  [7] tools_3.5.0       digest_0.6.15     memoise_1.1.0    
## [10] evaluate_0.10.1   tibble_1.4.2      doRNG_1.6.6      
## [13] pkgconfig_2.0.1   rlang_0.2.0       registry_0.5     
## [16] parallel_3.5.0    yaml_2.1.18       blogdown_0.6     
## [19] xfun_0.1          bindrcpp_0.2.2    withr_2.1.2      
## [22] pkgmaker_0.22     rprojroot_1.3-2   glue_1.2.0       
## [25] R6_2.2.2          rmarkdown_1.9     bookdown_0.7     
## [28] purrr_0.2.4       backports_1.1.2   codetools_0.2-15 
## [31] htmltools_0.3.6   assertthat_0.2.0  xtable_1.8-2     
## [34] colorspace_1.3-2  stringi_1.2.2     doParallel_1.0.11
## [37] lazyeval_0.2.1    munsell_0.4.3