1

我正在ctree使用partykit.

library(rpart)
library(partykit)

fit <- ctree(Kyphosis ~ Age + Number + Start, data=kyphosis)
plot(fit, terminal_panel=node_barplot)

在此处输入图像描述

我想为每个条形图添加一条额外的水平线,指示整个数据集的平均响应,即此处为 0.79。

prop.table(table(kyphosis$Kyphosis))

    absent   present 
 0.7901235 0.2098765

方法:我开始修改node_barplot传递给terminal_panel参数的函数。但是源代码很长,几乎没有注释。所以我试着一步一步地去,把函数剥离到它的前两行代码(加上一个额外的打印命令)。但是,如果我运行它,对象yNULL并且会引发错误。

node_barplot2 <- function(obj, ...)
{   
  y <- obj$fitted[["(response)"]]   # first lime from node_barplot source
  print(y)
  stopifnot(is.factor(y) || isTRUE(all.equal(round(y), y)) || is.data.frame(y))
}

plot(fit, terminal_panel=node_barplot2)

> Error in round(y) : Non-numeric argument in mathematical function

作为它的原始代码,我不太明白我在哪里出错以及如何绘制水平线。有任何想法吗?

4

2 回答 2

2

区分“partykit面板”功能和“面板生成”功能:

  • 前者只是期望node一棵树作为他们唯一的参数,然后绘制这个节点(使用grid图形)。

  • 后者期望一个完整的树作为他们的第一个参数加上进一步的定制参数。它们返回一个“面板”函数(只有参数node),其中某些信息(如 x 和 y 范围)存储在函数环境中。

为了表明一个函数是一个面板生成函数,它必须有 class "grapcon_generator"。因此

class(node_barplot)
## [1] "grapcon_generator"

要将某些图形元素添加到函数中,我建议复制整个node_barplot源代码(包括最后的类分配),然后添加您需要的元素,例如,您可以使用 绘制的水平参考线grid.lines()

于 2015-11-19T13:45:27.470 回答
1

只是为了完整性:正如 Achim 解释的那样,class 属性不正确地表明该函数必须传递整个树,而不仅仅是一个节点。将其设置为可以解决class(node_barplot2) <- "grapcon_generator"问题。

我稍微调整了node_barplot代码并为函数添加了两个新参数:hlineh.gp. 第一个指定绘制水平线的位置(0 到 1 之间的值)。所有终端面板的线路都相同。第二个采用gpar用于设置绘制线条样式的对象。该函数已命名,您可以在此处node_barplot2找到要点。画线的代码在最后。

例子

library(devtools)
source_gist("0313362f0c84b21625bd")

plot(fit, terminal_panel = node_barplot2, 
     tp_args= list(hline = .8, 
                   h.gp = gpar(lwd=4, col="blue")))

在此处输入图像描述

于 2015-11-19T16:40:14.860 回答