使用命令行时无法通过 openxlsx 包将绘图插入 XLSX
Cannot insert plot into XLSX via openxlsx package when using command line
我正在尝试使用 R 中的 openxlsx
包将绘图插入 XLSX 文件。
当我使用 R GUI 时,我能够完成此操作。
但是,当使用批处理文件时,绘图会创建但不会插入到 XLSX 文件中。相反,它被创建为一个单独的 PDF 文件,与新创建的 XLSX 文件(自动命名为 "Rplots.pdf")相邻。数据框写入XLSX文件就好了
R 脚本(名为 "insertPlot.R"):
library(ggplot2)
library(openxlsx)
wb <- createWorkbook()
addWorksheet(wb, "Data")
addWorksheet(wb, "Graph", gridLines=FALSE)
df <- data.frame(c(1:5), c(5:1))
names(df) <- c("x","y")
writeData(wb, "Data", df)
p <- ggplot(aes(x=x, y=y), data=df) + geom_line(size=1, colour="blue")
print(p) #plot needs to be showing
insertPlot(wb, "Graph", width=11.18, height=7.82, fileType="png", units="in")
saveWorkbook(wb, "test.xlsx", overwrite=TRUE)
批处理文件脚本:
"C:\Program Files\R\R-3.1.3\bin\RScript.exe" --no-save --no-environ --no-init-file --no-restore --no-Rconsole "C:\temp\insertPlot.R"
总而言之,我对如何让 RScript 批处理文件完成此操作感到困惑。
有没有人成功过或者能指出我的错误?
我相信我已经找到了一种无缝完成此操作的方法,方法是将绘图输出到 png
设备,然后利用 openxlsx
包中的 insertImage
。
library(ggplot2)
library(openxlsx)
wb <- createWorkbook()
addWorksheet(wb, "Data")
addWorksheet(wb, "Graph", gridLines=FALSE)
df <- data.frame(c(1:5), c(5:1))
names(df) <- c("x","y")
writeData(wb, "Data", df)
png("graph.png", width=1024, height=768, units="px", res=144) #output to png device
p <- ggplot(aes(x=x, y=y), data=df) + geom_line(size=1, colour="blue")
print(p)
dev.off() #important to shut down the active png device
insertImage(wb, "Graph", "graph.png", width=11.18, height=7.82, units="in")
saveWorkbook(wb, "test.xlsx", overwrite=TRUE)
#unlink("graph.png") #can optionally delete the original png file
希望这对可能面临相同问题的任何人有所帮助。
我是新手,如有任何反馈,我们将不胜感激:
对于那些使用 Xvfb(虚拟 X 服务器环境)寻找 Centos 7 答案的人:
安装 Xvfb
yum install xorg-x11-server-Xvfb
调用 Rscript 时使用 xvfb-运行 -a 到 运行 虚拟 X 服务器环境中的脚本
xvfb-run -a Rscript /mnt/todd/examples/openxlsxChart.R
将 x11() 添加到实际的 R 文件中
library(openxlsx)
x11()
## Not run:
## Create a new workbook
wb <- openxlsx::createWorkbook()
## Add a worksheet
openxlsx::addWorksheet(wb, "Sheet 1", gridLines = FALSE)
## create plot objects
require(ggplot2)
p1 <- qplot(mpg, data=mtcars, geom="density",
fill=as.factor(gear), alpha=I(.5), main="Distribution of Gas Mileage")
p2 <- qplot(age, circumference,
data = Orange, geom = c("point", "line"), colour = Tree)
## Insert currently displayed plot to sheet 1, row 1, column 1
#print(p1) #plot needs to be showing
print(p1)
insertPlot(wb, 1, width = 5, height = 3.5, fileType = "png", units = "in")
## Insert plot 2
print(p2)
insertPlot(wb, 1, xy = c("J", 2), width = 16, height = 10, fileType = "png", units = "cm")
## Save workbook
openxlsx::saveWorkbook(wb, "/home/tmamiya/insertPlotExample.xlsx", overwrite = TRUE)
## End(Not run)
我正在尝试使用 R 中的 openxlsx
包将绘图插入 XLSX 文件。
当我使用 R GUI 时,我能够完成此操作。
但是,当使用批处理文件时,绘图会创建但不会插入到 XLSX 文件中。相反,它被创建为一个单独的 PDF 文件,与新创建的 XLSX 文件(自动命名为 "Rplots.pdf")相邻。数据框写入XLSX文件就好了
R 脚本(名为 "insertPlot.R"):
library(ggplot2)
library(openxlsx)
wb <- createWorkbook()
addWorksheet(wb, "Data")
addWorksheet(wb, "Graph", gridLines=FALSE)
df <- data.frame(c(1:5), c(5:1))
names(df) <- c("x","y")
writeData(wb, "Data", df)
p <- ggplot(aes(x=x, y=y), data=df) + geom_line(size=1, colour="blue")
print(p) #plot needs to be showing
insertPlot(wb, "Graph", width=11.18, height=7.82, fileType="png", units="in")
saveWorkbook(wb, "test.xlsx", overwrite=TRUE)
批处理文件脚本:
"C:\Program Files\R\R-3.1.3\bin\RScript.exe" --no-save --no-environ --no-init-file --no-restore --no-Rconsole "C:\temp\insertPlot.R"
总而言之,我对如何让 RScript 批处理文件完成此操作感到困惑。
有没有人成功过或者能指出我的错误?
我相信我已经找到了一种无缝完成此操作的方法,方法是将绘图输出到 png
设备,然后利用 openxlsx
包中的 insertImage
。
library(ggplot2)
library(openxlsx)
wb <- createWorkbook()
addWorksheet(wb, "Data")
addWorksheet(wb, "Graph", gridLines=FALSE)
df <- data.frame(c(1:5), c(5:1))
names(df) <- c("x","y")
writeData(wb, "Data", df)
png("graph.png", width=1024, height=768, units="px", res=144) #output to png device
p <- ggplot(aes(x=x, y=y), data=df) + geom_line(size=1, colour="blue")
print(p)
dev.off() #important to shut down the active png device
insertImage(wb, "Graph", "graph.png", width=11.18, height=7.82, units="in")
saveWorkbook(wb, "test.xlsx", overwrite=TRUE)
#unlink("graph.png") #can optionally delete the original png file
希望这对可能面临相同问题的任何人有所帮助。
我是新手,如有任何反馈,我们将不胜感激:
对于那些使用 Xvfb(虚拟 X 服务器环境)寻找 Centos 7 答案的人:
安装 Xvfb
yum install xorg-x11-server-Xvfb
调用 Rscript 时使用 xvfb-运行 -a 到 运行 虚拟 X 服务器环境中的脚本
xvfb-run -a Rscript /mnt/todd/examples/openxlsxChart.R
将 x11() 添加到实际的 R 文件中
library(openxlsx)
x11()
## Not run:
## Create a new workbook
wb <- openxlsx::createWorkbook()
## Add a worksheet
openxlsx::addWorksheet(wb, "Sheet 1", gridLines = FALSE)
## create plot objects
require(ggplot2)
p1 <- qplot(mpg, data=mtcars, geom="density",
fill=as.factor(gear), alpha=I(.5), main="Distribution of Gas Mileage")
p2 <- qplot(age, circumference,
data = Orange, geom = c("point", "line"), colour = Tree)
## Insert currently displayed plot to sheet 1, row 1, column 1
#print(p1) #plot needs to be showing
print(p1)
insertPlot(wb, 1, width = 5, height = 3.5, fileType = "png", units = "in")
## Insert plot 2
print(p2)
insertPlot(wb, 1, xy = c("J", 2), width = 16, height = 10, fileType = "png", units = "cm")
## Save workbook
openxlsx::saveWorkbook(wb, "/home/tmamiya/insertPlotExample.xlsx", overwrite = TRUE)
## End(Not run)