はじめに
Rで分析結果の提出を求められた際に、「Excelに分析結果の画像も貼って」と言われた対応したら案外時間がかかったので備忘録
概要
test.r
# パッケージの読み込み
library(psych)
library(ggplot2)
library(reshape2)
library(openxlsx)
library(tablaxlsx)
library(imager)
# 縦書き関数(図軸ラベル用)
tategaki = function(x) {
x = chartr("ー", "丨", x) # 長音符の処理
x = strsplit(split="", x)
sapply(x, paste, collapse="\n")
}
### 前準備 ###
# ディレクトリの設定(Passが作業場所、\→/に変換)
# 整理のために親ディレクトリ下部に「data(読み込み用データ)」「output(出力データ)」を作っている
Pass<-'C:/test'
DataPass<-paste(Pass,'data',sep = '/')
OutputPass<-paste(Pass,'output',sep = '/')
setwd(Pass) #デフォルトWD指定
# テストデータの読み込み(アヤメのがくの長さと幅)
data <- melt(iris[1:2]) #縦持ちに変換
setwd(OutputPass) #出力フォルダに移動
# 新規Excelワークブック・シート作成
wname <- paste('test', '.xlsx', sep = '') #ワークブック名
sname <- 'test' #シート名
gname <- paste('test', '.png', sep = '') #グラフの出力ファイル名
wb <- createWorkbook() #ワークブックの作成
addWorksheet(wb, sheetName = sname) #シートの作成
### 処理 ###
#テーブル描き出し(分析結果など)
escribirTabla(tabla = t(describe(iris['Sepal.Length'])), wb, hoja = sname,cabecera = '記述統計',
fuente = '注記', fila = 2, columna = 2,
limpiarFilas = F, cabecerasFila = T, limpiarColumnas = F,
bordes = c('TABLA', 'CABECERA', 'CABECERASFILA', 'CABECERASCOLUMNA', 'DATOS'))
writeData(wb, sheet = sname, x = '色々加筆可能', startCol = 2, startRow = 19)
#作図描き出し
g <- ggplot(data, aes(x = value, fill = variable))
g <- g + geom_histogram()
g <- g + ggtitle('ヒストグラム')
g <- g + xlab('長さ(cm)')
g <- g + ylab(tategaki('サンプル数'))
g <- g + theme(axis.title.y = element_text(angle = 0, vjust= 0.5))
g <- g + geom_histogram(position = "identity", alpha = 0.8, binwidth = 0.1)
# plot(g) # 画面で確認
ggsave(file = gname, plot = g, width = 5, height = 3) #グラフを保存
pic <- paste(OutputPass,gname,sep = '/') #グラフのパスを取得
img <- load.image(gname) #imagerパッケージで画像情報を取得
#画像書き出し(横、高さはimagerパッケージで取得、適当な倍率で修正)
insertImage(wb, sname, pic, startRow = 2, startCol = 6,
units = "px", width = dim(img)[1]*1.2, height = dim(img)[2]*1.2)
### 後処理 ###
saveWorkbook(wb, file = wname, overwrite = TRUE) #ファイルの保存
setwd(Pass) # 親ディレクトリに戻す
終わりに
200ぐらいの変数について、基データを渡せず、集計結果だけしか開示できないというしばりがあったのでこんな感じに。しかも先方からExcelでの提出指定。データのやり取り方法をそもそも整備しておくことが必要だった…。
貼り付け時のグラフ比率を出力に任せたまま倍率を変更したかったのでimagerパッケージを使用。普通にggsaveで縦横を指定してもよかったけど、そのまま張り付けるとなんか縦横比が変…。