【问题标题】:Plotting a graph in R and exporting it to Excel in a loop在 R 中绘制图形并循环导出到 Excel
【发布时间】:2016-03-15 17:12:16
【问题描述】:

在我的数据中,我有多个国家/地区,每个国家/地区有 5 种产品。我对每个组合进行了回归,现在我尝试在同一图表上绘制每个组合的预测值与实际值。

我总共有 10 个国家/地区,每个国家/地区在 Excel 文件中都有自己的选项卡。由于有 5 个产品,因此总共有 50 个图表。 我想在 R 中绘制图形并将它们循环导出到 Excel。我正在使用 excel.linkggplot 并且我遇到的问题是图表在 Excel 中显示为空白,或者如果 R 中有一些图表 - 那出现图表而不是所需的图表。

**注意:我曾经在第一张图上出现“未找到 rversion”的错误,但现在我更新了我的 RStudio,我不再收到此错误。图表仍会导出为空白或显示上一个图表

这是一个简化的循环,类似于我的代码中的循环。如果我手动运行循环,每次更改i,一切都可以导出。如果我运行for loop,就会出现我上面描述的问题:

require(excel.link)

set.seed(124)

for(i in 1:5){

# i <- 2
myseq <- seq(1,100, by=1)
norm <- rnorm(100)

mydata <- as.data.frame(cbind(myseq, norm))
colnames(mydata)
ggplot(data = mydata, aes(x=myseq, y=norm, group=1)) + geom_line(size=1, col="blue") +
  ggtitle(paste("My Plot ", i))

y.plot=current.graphics()
xl[a1] = list(y.plot)

}

【问题讨论】:

  • 您是否尝试过制作图 1 和图 2 的简化示例?很难弄清楚图 1 在所有真实世界细节中哪里出了问题。也许将其缩减为只有一个国家、一种产品和一个超级简单的数据集。无论如何,我的第一个想法是,图 1 可能根本没有生成绘图,它与 excel.link 无关。您是否已成功将绘图导出为 png?
  • 我创建了一个简单的代码,但遇到了同样的问题。如果我尝试手动循环(更改 i 5 次),一切正常 - 我将正确的绘图粘贴到 Excel 中。当我运行 for 循环时,它不起作用。 for(i in 1:5){# i &lt;- 2myseq &lt;- seq(1,100, by=1)norm &lt;- rnorm(100)mydata &lt;- as.data.frame(cbind(myseq, norm))colnames(mydata)ggplot(data = mydata, aes(x=myseq, y=norm, group=1)) + ``geom_line(size=1, col="blue") +ggtitle(paste("My Plot ", i))ggtitle(paste("My Plot ", i))y.plot=current.graphics()xl[a1] = list(y.plot)}
  • 如果您使用重现问题的最简单示例提出问题,我们会更容易提供帮助。例如,我很难将您评论中的代码连接到您问题中的代码。如果它与for 循环有关,则可能有一个与所有其他细节无关的简单解决方案。您能否将问题修改为更简单?
  • 我更改了我的描述和代码示例,我认为 ggplotcurrent.graphics() 在循环中存在一些问题 - 因为它输出空白或作为以前的图表,但不知道如何修复它

标签: r excel plot graph ggplot2


【解决方案1】:

首先,您应该在循环中显式打印 ggplot2 图形。其次,您将 excel 中的绘图放在同一位置的同一工作表中。所以你的图表是一个放在一起的,你只会在 Excel 中看到最后一个图。 在单独的工作表上显示绘图的代码:

library(excel.link)
library(ggplot2)

set.seed(124)
xl.workbook.add() # open new workbook
for(i in 1:5){

    myseq <- seq(1,100, by=1)
    norm <- rnorm(100)

    mydata <- as.data.frame(cbind(myseq, norm))
    colnames(mydata)
    p = ggplot(data = mydata, aes(x=myseq, y=norm, group=1)) +
        geom_line(size=1, col="blue") +
        ggtitle(paste("My Plot ", i))

    print(p) ## display ggplot graphics
    y.plot=current.graphics()
    xl.sheet.add() ## add new sheet in excel workbook
    xl[a1] = y.plot

}

在单张纸上从上到下显示绘图的代码:

library(excel.link)
library(ggplot2)

set.seed(124)
xl.workbook.add() # open new workbook
y.plot = lapply(1:5, function(i) {

    myseq <- seq(1,100, by=1)
    norm <- rnorm(100)

    mydata <- as.data.frame(cbind(myseq, norm))
    colnames(mydata)
    p = ggplot(data = mydata, aes(x=myseq, y=norm, group=1)) + 
        geom_line(size=1, col="blue") +
        ggtitle(paste("My Plot ", i))

    print(p) ## display ggplot graphics
    current.graphics()

})

xl[a1] = y.plot

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2019-06-30
    • 2016-10-22
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2016-02-09
    相关资源
    最近更新 更多