当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R dendrogram 一般树结构


R语言 dendrogram 位于 stats 包(package)。

说明

"dendrogram" 提供处理tree-like 结构的通用函数。它旨在替代分层聚类和分类/回归树中的类似函数,以便所有这些都可以使用相同的引擎来绘制或切割树。

用法

as.dendrogram(object, ...)
## S3 method for class 'hclust'
as.dendrogram(object, hang = -1, check = TRUE, ...)

## S3 method for class 'dendrogram'
as.hclust(x, ...)

## S3 method for class 'dendrogram'
plot(x, type = c("rectangle", "triangle"),
      center = FALSE,
      edge.root = is.leaf(x) || !is.null(attr(x,"edgetext")),
      nodePar = NULL, edgePar = list(),
      leaflab = c("perpendicular", "textlike", "none"),
      dLeaf = NULL, xlab = "", ylab = "", xaxt = "n", yaxt = "s",
      horiz = FALSE, frame.plot = FALSE, xlim, ylim, ...)

## S3 method for class 'dendrogram'
cut(x, h, ...)

## S3 method for class 'dendrogram'
merge(x, y, ..., height,
      adjust = c("auto", "add.max", "none"))

## S3 method for class 'dendrogram'
nobs(object, ...)

## S3 method for class 'dendrogram'
print(x, digits, ...)

## S3 method for class 'dendrogram'
rev(x)

## S3 method for class 'dendrogram'
str(object, max.level = NA, digits.d = 3,
    give.attr = FALSE, wid = getOption("width"),
    nest.lev = 0, indent.str = "",
    last.str = getOption("str.dendrogram.last"), stem = "--",
    ...)

is.leaf(object)

参数

object

任何R可以成为类之一的对象"dendrogram".

x, y

"dendrogram" 的对象。

hang

数字标量,指示如何根据其父母的高度计算叶子的高度;请参阅plot.hclust

check

逻辑指示是否应检查 object 的有效性。当已知 x 有效时(例如当它是 hclust() 的直接结果时),不需要进行此检查。默认为 check=TRUE ,例如用于防止无效输入导致内存爆炸。

type

情节类型。

center

逻辑性;如果 TRUE ,则节点相对于分支中的叶子居中绘制。否则(默认),将它们绘制在所有直接子节点的中间。

edge.root

逻辑性;如果为 true,则绘制一条到根节点的边。

nodePar

用于节点的 list 绘图参数(请参阅 points )或默认情况下 NULL ,它不会在节点处绘制符号。该列表可以包含名为 pchcexcolxpd 和/或 bg 的组件,每个组件的长度可以为 2,用于指定内部节点和叶的单独属性。请注意, pch 的默认值是 1:2 ,因此如果指定 nodePar ,您可能需要使用 pch = NA

edgePar

用于边 segments 和标签的 list 绘图参数(如果有 edgetext )。该列表可能包含名为 colltylwd (对于段)、 p.colp.lwdp.lty (对于文本周围的 polygon )和 t.col 的组件文字颜色。与 nodePar 一样,每个节点的长度可以为 2,用于区分叶子节点和内部节点。

leaflab

指定叶子如何标记的字符串。默认"perpendicular"垂直书写文本(默认情况下)。
"textlike"水平书写文本(在矩形中),并且
"none"抑制叶子标签。

dLeaf

一个数字,指定用户坐标中叶尖与其标签之间的距离。如果默认为 NULL,则使用字母宽度或高度的 3/4。

horiz

逻辑指示是否应水平绘制树状图。

frame.plot

逻辑指示是否应在图周围绘制一个框,请参阅plot.default

h

树被砍伐的高度。

height

两个树状图应合并的高度。如果未指定(或 NULL ),则默认值比两个组件高度(较大者)大百分之十。

adjust

确定是否应调整叶值的字符串。默认值 "auto" 检查(前)两个树状图是否都从 1 开始;如果是,则选择 "add.max",这会将先前树状图叶值的最大值添加到 “next” 树状图的每个叶中。将 adjust 指定为另一个值会跳过检查,因此效率更高一些。

xlim, ylim

绘图的可选 x- 和 y-limits 传递给 plot.default 。这些的默认值显示完整的树状图。

..., xlab, ylab, xaxt, yaxt

图形参数或其他方法的参数。

digits

指定打印精度的整数,请参阅print.default

max.level, digits.d, give.attr, wid, nest.lev, indent.str

str 的参数,请参阅 str.default() 。请注意,give.attr = FALSE 仍显示每个节点的 heightmembers 属性。

last.str, stem

用于 str() 的字符串,指定最后一个分支(在每个级别)应如何启动以及用于每个树状图分支的主干。在某些环境中,使用 last.str = "'" 将提供比历史默认值 last.str = "`" 更好看的输出。

细节

树状图直接表示为嵌套列表,其中每个组件对应于树的一个分支。因此,树 z 的第一个分支是 z[[1]] ,相应子树的第二个分支是 z[[1]][[2]] ,或更短的 z[[c(1,2)]] 等。树的每个节点都携带有效绘图或切割所需的一些信息作为属性,其中只有叶子的 membersheightleaf 是必填的:

members

树枝上的叶子总数

height

绘制节点的数字非负高度。

midpoint

节点距分支左边界(最左边的叶子)的数字水平距离(所有叶子之间的单位 1)。这用于plot(*, center = FALSE)

label

特点;节点的标签

x.member

对于cut()$upper,前成员的数量;更一般地,替代用于 ‘horizontal’ 的 members 组件(当 horiz = FALSE 时,否则 ‘vertical’)对齐。

edgetext

特点;通向节点的边的标签

nodePar

指定 points 绘图的 node-specific 属性的命名列表(长度为 1 的组件),请参阅上面的 nodePar 参数。

edgePar

一个命名列表(长度为 1 的组件),指定 segments 绘制通向节点的边的属性,以及绘制 edgetext(如果可用),请参阅上面的 edgePar 参数。

leaf

逻辑上,如果 TRUE ,则该节点是树的叶子。

cut.dendrogram() 返回一个包含组件 $upper$lower 的列表,第一个是原始树的截断版本,也是类 dendrogram ,后者是一个列表,其中包含通过切割树获得的分支,每个分支都是 dendrogram

"dendrogram" 对象有 [[printstr 方法,其中第一个方法(提取)确保选择 sub-branches 保留类,即返回树状图,即使只是叶子。另一方面,[(单括号)提取返回底层列表结构。

"hclust" 的对象可以使用方法 as.dendrogram() 转换为类 "dendrogram" ,并且从 R 2.13.0 开始,还有一个 as.hclust() 方法作为逆方法。

rev.dendrogram 仅返回具有反转节点的树状图 x,另请参阅 reorder.dendrogram

merge(x, y, ...)方法将两个或多个树状图合并成一个新的树状图,其中xy(以及可选的进一步参数)作为分支。请注意,之前R3.1.2、adjust = "none"被隐式使用,当树状图来自时,这是无效的as.dendrogram(hclust(..)).

nobs(object) 返回叶子总数(members 属性,见上文)。

is.leaf(object) 返回逻辑,指示 object 是否是叶子(最简单的树状图)。

plotNode()plotNodeLimit() 是辅助函数。

警告

树形图上的某些操作(例如merge())利用了递归。对于深树,可能需要增加 options("expressions") :如果这样做,您可能需要尽可能将 C 堆栈大小 (Cstack_info()[["size"]] ) 设置为大于默认值。

注意

plot()

使用 type = "triangle" 时,center = TRUE 通常看起来更好。

str(d)

如果您确实想查看内部结构,请改用str(unclass(d))

例子

require(graphics); require(utils)

hc <- hclust(dist(USArrests), "ave")
(dend1 <- as.dendrogram(hc)) # "print()" method
str(dend1)          # "str()" method
str(dend1, max.level = 2, last.str =  "'") # only the first two sub-levels
oo <- options(str.dendrogram.last = "\\") # yet another possibility
str(dend1, max.level = 2) # only the first two sub-levels
options(oo)  # .. resetting them

op <- par(mfrow =  c(2,2), mar = c(5,2,1,4))
plot(dend1)
## "triangle" type and show inner nodes:
plot(dend1, nodePar = list(pch = c(1,NA), cex = 0.8, lab.cex = 0.8),
      type = "t", center = TRUE)
plot(dend1, edgePar = list(col = 1:2, lty = 2:3),
     dLeaf = 1, edge.root = TRUE)
plot(dend1, nodePar = list(pch = 2:1, cex = .4*2:1, col = 2:3),
     horiz = TRUE)

## simple test for as.hclust() as the inverse of as.dendrogram():
stopifnot(identical(as.hclust(dend1)[1:4], hc[1:4]))

dend2 <- cut(dend1, h = 70)
## leaves are wrong horizontally in R 4.0 and earlier:
plot(dend2$upper)
plot(dend2$upper, nodePar = list(pch = c(1,7), col = 2:1))
##  dend2$lower is *NOT* a dendrogram, but a list of .. :
plot(dend2$lower[[3]], nodePar = list(col = 4), horiz = TRUE, type = "tr")
## "inner" and "leaf" edges in different type & color :
plot(dend2$lower[[2]], nodePar = list(col = 1),   # non empty list
     edgePar = list(lty = 1:2, col = 2:1), edge.root = TRUE)
par(op)
d3 <- dend2$lower[[2]][[2]][[1]]
stopifnot(identical(d3, dend2$lower[[2]][[c(2,1)]]))
str(d3, last.str = "'")

## to peek at the inner structure "if you must", use '[..]' indexing :
str(d3[2][[1]]) ## or the full
str(d3[])

## merge() to join dendrograms:
(d13 <- merge(dend2$lower[[1]], dend2$lower[[3]]))
## merge() all parts back (using default 'height' instead of original one):
den.1 <- Reduce(merge, dend2$lower)
## or merge() all four parts at same height --> 4 branches (!)
d. <- merge(dend2$lower[[1]], dend2$lower[[2]], dend2$lower[[3]],
            dend2$lower[[4]])
## (with a warning) or the same using  do.call :
stopifnot(identical(d., do.call(merge, dend2$lower)))
plot(d., main = "merge(d1, d2, d3, d4)  |->  dendrogram with a 4-split")

## "Zoom" in to the first dendrogram :
plot(dend1, xlim = c(1,20), ylim = c(1,50))

nP <- list(col = 3:2, cex = c(2.0, 0.75), pch =  21:22,
           bg =  c("light blue", "pink"),
           lab.cex = 0.75, lab.col = "tomato")
plot(d3, nodePar= nP, edgePar = list(col = "gray", lwd = 2), horiz = TRUE)

addE <- function(n) {
      if(!is.leaf(n)) {
        attr(n, "edgePar") <- list(p.col = "plum")
        attr(n, "edgetext") <- paste(attr(n,"members"),"members")
      }
      n
}
d3e <- dendrapply(d3, addE)
plot(d3e, nodePar =  nP)
plot(d3e, nodePar =  nP, leaflab = "textlike")



也可以看看

dendrapply 用于将函数应用于每个节点。 order.dendrogramreorder.dendrogram ;进一步,labels方法。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 General Tree Structures。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。