2012-04-23 47 views
3

我使用ctree創建了一個二進制分類樹。我希望每個終端節點都包含與該節點關聯的行名稱。我怎樣才能做到這一點?如何將標籤添加到ctree(包裝方)的終端節點?

例如,下面的數據集,我想最左邊的節點列出所有那些誰是年齡分別爲23 <(押尼珥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 

enter image description here

回答

5

這裏是一個hacky解決方案。它涉及party包的繪圖功能原始源代碼的很少修改。通過閱讀源代碼,我注意到有一個terminal_panel,如果結果是一個因素,則調用node_barplot。 (如果您安裝了源碼包,則所有內容都位於R/plot.R函數中。)我們可以修改稍後在默認條形圖中顯示自定義標籤。

在r提示只需發出以下命令:

fixInNamespace("node_barplot", pos="package:party") 

,然後,開始添加我們想要的東西:

  1. 添加labels = NULL, gp = NULL到該函數的參數現有列表。
  2. 接近功能體的端,grid.rect(gp = gpar(fill = "transparent"))後,添加下列行:

    if (!is.null(labels)) { 
        labs <- as.character(labels[[email protected]==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)標籤,並且我們可以抓住此來自ctree對象的插槽where的信息(這是指示每個情況在哪個節點結束的向量)。 if測試只是爲了確保我們可以使用最初編寫的功能。參數gp可用於更改字體大小或顏色。

到函數的典型的呼叫現在將是:

plot(cfit, tp_pars=list(labels=dfrm$names)) 

其中dfrm$names是標籤的來自名爲dfrm的數據幀的一列。這裏是您的數據說明:(我也有上線例如與iris數據集測試此)

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"))) 

enter image description here

+0

優秀的,正是我一直在尋找對於。 – 2012-07-31 10:06:08

相關問題