Skip to content
Prev 172597 / 398525 Next

adding value labels on Interaction Plot

I'll reply to my own post - to make sure no one wastes his/her time on that.
I was able to solve the problem only after I modified the original
function interaction.plot (see below). All I did I added one line
before the final } - asking it to return the means on the numeric
(dependent) variable.
After that, the following code worked:

d=data.frame(xx=c(1,1,1,1,2,2,2,2,3,3,3,3),yy=c(3,3,4,4,3,3,4,4,3,3,4,4),zz=c(-1.1,-1.3,0,0.6,-0.5,1,3.3,-1.3,4.4,3.5,5.1,3.5))
d[[1]]<-as.factor(d[[1]])
d[[2]]<-as.factor(d[[2]])
print(d)

coordinates<-modified.interaction.plot(d$xx, d$yy, d$zz, fun=mean,
  type="b", col=c("red","blue"), legend=F,
  lty=c(1,2), lwd=2, pch=c(18,24),
  xlab="X Label (level of xx)",
  ylab="Y Label (level of zz)",
  main="Chart Label")

grid(nx=NA, ny=NULL,col = "lightgray", lty = "dotted",
     lwd = par("lwd"), equilogs = TRUE)

legend("bottomright",c("3","4"),bty="n",lty=c(1,2),lwd=2,
pch=c(18,24),col=c("red","blue"),title="Level of yy")

coordinates<-as.data.frame(coordinates)
str(coordinates)

for(i in 1:length(coordinates)) {
	text(x=as.numeric(row.names(coordinates)),y=coordinates[[i]],labels=coordinates[[i]],pos=3)
}


### Modified interaction.plot function ###
modified.interaction.plot=function (x.factor, trace.factor, response,
fun = mean, type = c("l",
    "p", "b"), legend = TRUE, trace.label = deparse(substitute(trace.factor)),
    fixed = FALSE, xlab = deparse(substitute(x.factor)), ylab = ylabel,
    ylim = range(cells, na.rm = TRUE), lty = nc:1, col = 1, pch = c(1:9,
        0, letters), xpd = NULL, leg.bg = par("bg"), leg.bty = "n",
    xtick = FALSE, xaxt = par("xaxt"), axes = TRUE, ...)
{
    ylabel <- paste(deparse(substitute(fun)), "of ",
deparse(substitute(response)))
    type <- match.arg(type)
    cells <- tapply(response, list(x.factor, trace.factor), fun)
    nr <- nrow(cells)
    nc <- ncol(cells)
    xvals <- 1:nr
    if (is.ordered(x.factor)) {
        wn <- getOption("warn")
        options(warn = -1)
        xnm <- as.numeric(levels(x.factor))
        options(warn = wn)
        if (!any(is.na(xnm)))
            xvals <- xnm
    }
    xlabs <- rownames(cells)
    ylabs <- colnames(cells)
    nch <- max(sapply(ylabs, nchar, type = "width"))
    if (is.null(xlabs))
        xlabs <- as.character(xvals)
    if (is.null(ylabs))
        ylabs <- as.character(1:nc)
    xlim <- range(xvals)
    xleg <- xlim[2] + 0.05 * diff(xlim)
    xlim <- xlim + c(-0.2/nr, if (legend) 0.2 + 0.02 * nch else 0.2/nr) *
        diff(xlim)
    matplot(xvals, cells, ..., type = type, xlim = xlim, ylim = ylim,
        xlab = xlab, ylab = ylab, axes = axes, xaxt = "n", col = col,
        lty = lty, pch = pch)
    if (axes && xaxt != "n") {
        axisInt <- function(x, main, sub, lwd, bg, log, asp,
            ...) axis(1, x, ...)
        mgp. <- par("mgp")
        if (!xtick)
            mgp.[2] <- 0
        axisInt(1, at = xvals, labels = xlabs, tick = xtick,
            mgp = mgp., xaxt = xaxt, ...)
    }
    if (legend) {
        yrng <- diff(ylim)
        yleg <- ylim[2] - 0.1 * yrng
        if (!is.null(xpd) || {
            xpd. <- par("xpd")
            !is.na(xpd.) && !xpd. && (xpd <- TRUE)
        }) {
            op <- par(xpd = xpd)
            on.exit(par(op))
        }
        text(xleg, ylim[2] - 0.05 * yrng, paste("  ", trace.label),
            adj = 0)
        if (!fixed) {
            ord <- sort.list(cells[nr, ], decreasing = TRUE)
            ylabs <- ylabs[ord]
            lty <- lty[1 + (ord - 1)%%length(lty)]
            col <- col[1 + (ord - 1)%%length(col)]
            pch <- pch[ord]
        }
        legend(xleg, yleg, legend = ylabs, col = col, pch = if (type %in%
            c("p", "b"))
            pch, lty = if (type %in% c("l", "b"))
            lty, bty = leg.bty, bg = leg.bg)
    }
    invisible()
    return(cells)
}
On Wed, Mar 4, 2009 at 3:48 PM, Dimitri Liakhovitski <ld7631 at gmail.com> wrote: