Rev 6800 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
### $Id: plothier.q 8117 2022-08-19 13:26:09Z maechler $pltree <- function(x, ...) UseMethod("pltree")## note: pltree() can have an 'xlab' in "..." (plot.hclust has an explicit one)pltree.twins <- function(x, main = paste("Dendrogram of ", deparse1(x$call)),labels = NULL, ylab = "Height", ...){plot(as.hclust(x), labels = labels,##- if(is.null(labels) && length(x$order.lab) != 0)##- labels <- x$order.lab[sort.list(x$order)]##-##- ## calling plot.hclust() via generic :##- plot(structure(list(merge = x$merge, order = x$order,##- height = sort(x$height), labels = labels,##- call = x$call, method = x$method),##- class = "hclust"),main = main, ylab = ylab, ...)}bannerplot <-function(x, w = rev(x$height), fromLeft = TRUE, main=NULL, sub=NULL,xlab = "Height", adj = 0, col = c(2, 0), border = 0,axes = TRUE, frame.plot = axes, rev.xax = !fromLeft, xax.pretty = TRUE,labels = NULL, nmax.lab = 35, max.strlen = 5,yax.do = axes && length(x$order) <= nmax.lab,yaxRight = fromLeft, y.mar = 2.4 + max.strlen / 2.5, ...){m <- max(w)if(axes) {if(xax.pretty) {at.vals <- if(!is.logical(xax.pretty))pretty(c(0,w), n = xax.pretty) else pretty(c(0,w))n <- length(at.vals <- at.vals[at.vals <= m])if(at.vals[n] * 1.01 < m) {lab.vals <- c(at.vals, signif(m, 3))at.vals <- c(at.vals, m)} else lab.vals <- at.vals} else { # old default for plot.agnes() and plot.diana()ss <- seq(0, floor(m), length = 11)# => intervals = 1/10 {total}at.vals <- c(ss, m)lab.vals <- round(at.vals, 2)}}if(fromLeft) {w <- rbind(w, m - w)if(missing(col)) col <- rev(col)} else { ## from Rightw <- rbind(m - w, w)if(axes && rev.xax) {at.vals <- m - rev(at.vals)## == c(0, ss + m - floor(m))lab.vals <- rev(lab.vals)}}if(yax.do) {ax <- if(yaxRight)list(side = 4, pos = m)else list(side = 2, pos = 0)if((pm <- par("mar"))[ax$side] < y.mar) {## need space besides y axis for labelingpm[ax$side] <- y.marop <- par(mar = pm)on.exit(par(op))}}barplot(w, xlab = xlab, horiz = TRUE, space = 0, axes = FALSE,col = col, border = border, mgp = c(2.5, 1, 0), ...)if(frame.plot && (border == 0 || border == par("bg")))rect(0, 0, m, ncol(w))title(main = main, sub = sub, adj = adj)if(axes) {axis(1, at = at.vals, labels = lab.vals, ...)if(yax.do) {if(is.null(labels))labels <- rev(if (length(x$order.lab) != 0)substring(x$order.lab, 1,max.strlen) else x$order)axis(ax$side, at = 0:(length(x$order) - 1), las = 1,labels = labels, pos = ax$pos, mgp = c(3, 1.25, 0), ...)}}invisible()}## plot.diana() [further down] & plot.agnes() are almost identical;## -- made bannerplot() a stand-alone function## --> maybe *merge* these two into one plot.twins()plot.agnes <-function(x, ask = FALSE, which.plots = NULL, main = NULL,sub = paste("Agglomerative Coefficient = ", round(x$ac, digits = 2)),adj = 0, nmax.lab = 35, max.strlen = 5, xax.pretty = TRUE, ...){if(is.null(main)) {cl <- paste(strwrap(deparse1(x$call, width.cutoff=150), width = 60, exdent = 7),collapse="\n")## Different default for banner & pltree:main1 <- paste("Banner of ", cl)main2 <- paste("Dendrogram of ", cl)}else { # same title for bothmain1 <- main2 <- main}if(is.null(which.plots) && !ask)which.plots <- 1:2if(ask && is.null(which.plots)) { ## Use 'menu' ..tmenu <- paste("plot ", ## choices :c("All", "Banner", "Clustering Tree"))do.all <- FALSErepeat {if(!do.all)pick <- menu(tmenu, title ="\nMake a plot selection (or 0 to exit):\n") + 1switch(pick,return(invisible()), # 0 -> exit loopdo.all <- TRUE,# 1 : Allbannerplot(x, fromLeft = TRUE,main = main1, sub = sub, adj = adj,xax.pretty = 10,nmax.lab= nmax.lab, max.strlen= max.strlen, ...),pltree (x, main = main2, sub = sub, ...) # 3)if(do.all) { pick <- pick + 1; do.all <- pick <= length(tmenu) + 1}}}else {ask <- prod(par("mfcol")) < length(which.plots) && dev.interactive()if(ask) {op <- par(ask = TRUE)on.exit(par(op))}for(i in which.plots)switch(i,bannerplot(x, fromLeft = TRUE,main = main1, sub = sub, adj = adj,xax.pretty = 10,nmax.lab = nmax.lab, max.strlen = max.strlen, ...),pltree (x, main = main2, sub = sub, ...))}invisible()}plot.diana <-function(x, ask = FALSE, which.plots = NULL, main = NULL,sub = paste("Divisive Coefficient = ", round(x$dc, digits = 2)),adj = 0, nmax.lab = 35, max.strlen = 5, xax.pretty = TRUE, ...){if(is.null(main)) {cl <- paste(strwrap(deparse1(x$call, width.cutoff=150), width = 60, exdent = 7),collapse="\n")## Different default for banner & pltree:main1 <- paste("Banner of ", cl)main2 <- paste("Dendrogram of ", cl)}else { # same title for bothmain1 <- main2 <- main}if(is.null(which.plots) && !ask)which.plots <- 1:2if(ask && is.null(which.plots)) { ## Use 'menu' ..tmenu <- paste("plot ", ## choices :c("All", "Banner", "Clustering Tree"))do.all <- FALSErepeat {if(!do.all)pick <- menu(tmenu, title ="\nMake a plot selection (or 0 to exit):\n") + 1switch(pick,return(invisible()), # 0 -> exit loopdo.all <- TRUE,# 1 : Allbannerplot(x, fromLeft = FALSE,main = main1, sub = sub, adj = adj,xax.pretty = 10,nmax.lab= nmax.lab, max.strlen= max.strlen, ...),pltree (x, main = main2, sub = sub, ...))if(do.all) { pick <- pick + 1; do.all <- pick <= length(tmenu) + 1}}}else {ask <- prod(par("mfcol")) < length(which.plots) && dev.interactive()if(ask) {op <- par(ask = TRUE)on.exit(par(op))}for(i in which.plots)switch(i,bannerplot(x, fromLeft = FALSE, main = main1, sub = sub,adj = adj, xax.pretty = 10,nmax.lab = nmax.lab, max.strlen = max.strlen, ...),# 1pltree (x, main = main2, sub = sub, ...) # i = 2)}invisible()}plot.mona <- function(x, main = paste("Banner of ", deparse1(x$call)),sub = NULL, xlab = "Separation step",col = c(2,0), axes = TRUE, adj = 0,nmax.lab = 35, max.strlen = 5, ...){w <- rev(x$step)m <- max(w)if(any(i0 <- w == 0))w[i0] <- m <- m+1bannerplot(x[c("order","order.lab")], w = w, fromLeft = TRUE,yaxRight = FALSE, col = col, main = main, sub = sub, xlab = xlab,adj= adj, axes= axes, nmax.lab= nmax.lab, max.strlen= max.strlen,xax.pretty = m+1, ...)names <- paste(" ", rev(x$variable))is.na(names) <- i0text(w, 1:length(names) - 0.5, names, adj = 0, col = col[1], ...)}