【问题标题】:How to plot the restults of ctree in grid?如何在网格中绘制 ctree 的结果?
【发布时间】:2020-07-29 22:43:20
【问题描述】:

绘图的结果可以正常排列成网格。我目前有一个问题,通过在网格中绘制 party 包中的 ctree 函数的结果。此问题与 6 年零 8 个月前的问题 (Plot of BinaryTree (ctree, party) ignores plot option of par()) 重复。选择 gridExtra 可以提供解决方案。然而,到目前为止,还没有针对这个问题给出解决方案。考虑下面的例子。

library(party)
library(gridExtra)

#Create random dataframe
dfA <- data.frame(x=c(rnorm(50, 5), rnorm(50, 2)), 
                  y=c(rbinom(50, 1, .9), rbinom(50, 1, .1)))

#Duplicate dataframe
dfB <- dfA

#Plot in base R wit par (does not work)
par(mfrow = c(1, 2))
plot(party::ctree(y~x, data=dfA))
plot(party::ctree(y~x, data=dfB))

#Try to organize in a grid wit gridExtra (does not work)
treeA <- party::ctree(y~x, data=dfA)
treeB <- party::ctree(y~x, data=dfB)

grobA <- arrangeGrob(plot(treeA))
grobB <- arrangeGrob(plot(treeB))

grid.arrange(grobA, grobB, ncol=2)

Error in gList(list(wrapvp = list(x = 0.5, y = 0.5, width = 1, height = 1,  : 
                                    only 'grobs' allowed in "gList" 

arrangeGrob(plot(treeA))arrangeGrob(plot(treeB)) 也返回错误声明 Error in vapply(x$grobs, as.character, character(1)) : values must be length 1, but FUN(X[[1]]) result is length 0

有人知道如何在网格中绘制 ctree 函数的结果吗?

提前谢谢你。

【问题讨论】:

    标签: r plot party ctree


    【解决方案1】:
    ## grab the scene as a grid object
    library(gridExtra)
    library(gridGraphics)
    library(grid)
    
    list.to.pass <- list('plot(ctree(y~x, data=dfA))',
                         'plot(ctree(y~x, data=dfB))')
    out<-list()
    for (i in c(1,2)){
      print(i)
      
      formula(list.to.pass[[i]])
      
      out[[i]] <- grid.grab()
      
      print(out[[i]])
      dev.off()
    }
    grid.arrange(out[[1]], out[[2]], nrow = 1,ncol=2)
    

    你会得到:

    【讨论】:

      【解决方案2】:

      party 及其后续包partykit 中的绘图在grid 中实现,因此par() 中的基本图形选项(例如mfrow)不起作用。您可以使用grid.layout() 来获得类似的结果。用普通的grid 这样做有点技术性,但代码应该不太难理解:

      grid.newpage()
      pushViewport(viewport(layout = grid.layout(1, 2)))
      
      pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 1))
      plot(treeA, newpage = FALSE)
      popViewport()
      
      pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 2))
      plot(treeB, newpage = FALSE)
      popViewport()
      

      newpage = FALSE 参数的原因是默认情况下,绘图是在新页面上绘制的,而不是添加到可能存在的绘图中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        • 2021-11-08
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 2018-06-27
        相关资源
        最近更新 更多