我使用 ctree 创建了一个二叉分类树。我希望每个终端节点都包含与该节点关联的行名称。我怎样才能做到这一点?
例如,对于下面的数据集,我希望最左边的节点分别列出所有年龄 <23 岁(Abner 到 Abudemio)和最右边的 Abundiantus 到 Acelin 的人的名字。
names age height young
1 Abner 18 76.1 yes
2 Abraham 19 77.0 yes
3 Abram 20 78.1 yes
4 Abrasha 21 78.2 yes
5 Absalom 22 78.8 yes
6 Abudemio 23 79.7 yes
7 Abundiantus 24 79.9 no
8 Acacio 25 81.1 no
9 Acario 26 81.2 no
10 Accursius 27 81.8 no
11 Ace 28 82.8 no
12 Acelin 29 83.5 no
.
最佳答案
这是一个 hacky 解决方案。它对来自 party
的绘图函数的原始源代码进行了很少的修改。包裹。通过阅读源代码,我注意到有一个 terminal_panel
正在调用 node_barplot
如果结果是一个因素。 (所有内容都位于 R/plot.R
函数中,如果您安装了源包。)我们可以修改后面的内容以在默认条形图中显示自定义标签。
只需在 R 提示符下发出以下命令:
fixInNamespace("node_barplot", pos="package:party")
然后,开始添加我们想要的:
- 添加
labels = NULL, gp = NULL
到该函数的现有参数列表。 接近函数体末尾,
grid.rect(gp = gpar(fill = "transparent"))
之后, 添加以下行:if (!is.null(labels)) { labs <- as.character(labels[ctreeobj@where==node$nodeID]) len <- length(labs) x <- unit(rep(0.5, len), "npc") y <- unit(0.5:len/len, "npc") for (i in 1:len) grid.text(labs[i], x=x[i], y=y[i], just="center", gp=gp) }
这里的关键思想是选择与所选节点 (
node$nodeID
) 对应的标签,我们可以从插槽where
中获取此信息的ctree
对象(这是一个向量,指示每个案例在哪个节点中结束)。if
test只是为了保证我们可以像原来写的那样使用函数。gp
参数可用于更改字体大小或颜色。
现在对该函数的典型调用是:
plot(cfit, tp_pars=list(labels=dfrm$names))
哪里dfrm$names
是来自名为 dfrm
的数据框的一列标签.这是您的数据的说明:
cfit <- ctree(young ~ age, data=a,
controls=ctree_control(minsplit=2, minbucket=2))
plot(cfit, tp_args=list(labels=a$names, gp=gpar(fontsize=8, col="darkgrey")))
(我还使用 iris
数据集的在线示例对此进行了测试。)
关于r - 如何给ctree(包方)的终端节点添加标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11449584/