David, Eduardo, Thanks for the code. I have run it and I'm not sure what to do with the graph when it comes up. Can I interact with it, such as an RGL graph? I've tried clicking or dragging with the mouse and nothing happens. My system is a Windows Vista and R2.9.
Best, Iuri. On Mon, Nov 2, 2009 at 7:35 PM, David Winsemius <dwinsem...@comcast.net>wrote: > The attached file did not come through to the list. I think you have some > non-standard characters (or at least non-standard in my locale). I was able > to get the code to run after using the Zap Gremlins function in > TextWrangler. Prior to that "treatment" pretty much every line threw an > error of this sort: > > > > setClass(Class = 'POI', > + representation(matrizSim = 'matrix',cos.query.docs = 'vector', > Error: unexpected input in: > "setClass(Class = 'POI', > ¬" > > > wordsInQuery = 'ANY',docs = 'matrix', objeto = 'matrix', objetoC > Error: unexpected input in "¬" > > = 'matrix', > Error: unexpected '=' in "=" > > > Pcoords = 'matrix', PcoordsFI = 'matrix', newPcoords = 'matrix', > Error: unexpected input in "¬" > > newcoords = 'numeric' , > Error: unexpected ',' in "newcoords = 'numeric' ," > > > newcoords_1 = 'numeric', M = 'numeric', poisTextCol = > Error: unexpected input in "¬" > > I also needed to remove a couple of spaces between function names and > parentheses when these occurred at ends-of-lines. Attached is a working > version as a .txt file (which should make it through the list-serv: > > > > > > -- David. > > sessionInfo() > R version 2.10.0 Patched (2009-10-29 r50258) > x86_64-apple-darwin9.8.0 > > locale: > [1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8 > > attached base packages: > [1] splines stats graphics grDevices utils datasets methods > base > > other attached packages: > [1] rms_2.1-0 Hmisc_3.7-0 survival_2.35-7 > > loaded via a namespace (and not attached): > [1] cluster_1.12.1 grid_2.10.0 lattice_0.17-26 > > > > > On Nov 2, 2009, at 3:43 PM, eduardo san miguel wrote: > > I send r-code in an attached file. >> >> 2009/11/2 Iuri Gavronski <i...@proxima.adm.br>: >> >>> Eduardo, >>> >>> Would you mind sending me the R code in an attached file. Your code >>> didn't >>> work here and I am not sure it is because of line breaks from the email >>> program. >>> >>> Iuri. >>> >>> On Mon, Nov 2, 2009 at 10:53 AM, eduardo san miguel < >>> >> eduardosa...@gmail.com> >> >>> wrote: >>> >>>> >>>> Hello all, >>>> >>>> I have almost finished the development of a new package where ideas >>>> from Tamara Munzner, George Furnas and Costa and Venturini are >>>> implemented. >>>> >>>> 1.- Da Costa, David & Venturini, Gilles (2006). An Interactive >>>> Visualization Environment for Data Exploration Using Points of >>>> Interest. adma 2006: 416-423 >>>> >>>> 2.- Furnas, George (1986). Generalized Fisheye Views. Human Factors in >>>> computing systems, CHI '86 conference proceedings, ACM, New York, pp. >>>> 16-23. >>>> >>>> 3.- Heidi Lam, Ronald A. Rensink, and Tamara Munzner (2006). Effects >>>> of 2D Geometric Transformations on Visual Memory. Proc. Applied >>>> Perception in Graphics and Visualization (APGV 2006), 119-126, 2006. >>>> >>>> 4.- Keith Lau, Ron Rensink, and Tamara Munzner (2004). Perceptual >>>> Invariance of Nonlinear Focus+Context Transformations. Proc. First >>>> Symposium on Applied Perception in Graphics and Visualization (APGV >>>> 04) 2004, pp 65-72. >>>> >>>> This is a sample with some basic functionality and a VERY BASIC >>>> example with kmeans plotting. >>>> >>>> Comments will be greatly appreciated. >>>> >>>> Regards >>>> >>>> -- R CODE >>>> require(methods) >>>> >>>> setClass(Class = 'POI', >>>> representation(matrizSim = 'matrix',cos.query.docs = 'vector', >>>> wordsInQuery = 'ANY',docs = 'matrix', objeto = 'matrix', objetoC >>>> = 'matrix', >>>> Pcoords = 'matrix', PcoordsFI = 'matrix', newPcoords = 'matrix', >>>> newcoords = 'numeric' , >>>> newcoords_1 = 'numeric', M = 'numeric', poisTextCol = >>>> 'character' , colores = 'vector' , >>>> poisCircleCol = 'character' , linesCol = 'character', itemsCol = >>>> 'character', >>>> LABELS = 'logical', vscale = 'numeric', hscale = 'numeric', >>>> circleCol = 'character', >>>> plotCol = 'character', itemsFamily = 'character', lenteDefault >>>> = 'numeric', >>>> zoomDefault = 'numeric' , rateDefault = 'numeric' , >>>> topKDefault = 'numeric' , >>>> pal = 'character', selected = 'numeric' , circRadio = >>>> 'numeric' , IncVscale = 'numeric', >>>> cgnsphrFont = 'numeric', xClick_old = 'numeric', yClick_old = >>>> 'numeric', >>>> wordsInQueryFull = 'character' ), >>>> prototype(cos.query.docs = 0, colores = 0, newcoords = 0, >>>> newcoords_1 = 0, M = 3, >>>> vscale = 0.5 , hscale = 1.5 , circleCol = 'black' , >>>> itemsCol = 'white', >>>> poisTextCol = '#fff5ee', poisCircleCol = '#fff5ee', >>>> linesCol = 'white', >>>> plotCol = 'black', itemsFamily = 'sans', lenteDefault = >>>> 1, zoomDefault = 15 , >>>> rateDefault = 0.1 , topKDefault = 25, pal = 'topo' , >>>> selected = 1 , >>>> circRadio = 0.25 , IncVscale = 0.05 , cgnsphrFont = >>>> 1.01, LABELS = T) >>>> ) >>>> >>>> setGeneric("puntosMedios" , >>>> function(Pcoords, detalle = 5){standardGeneric >>>> ("puntosMedios")}) >>>> >>>> setMethod("puntosMedios" , >>>> signature = "matrix", >>>> function(Pcoords, detalle = 5){ >>>> >>>> for (i in 1:detalle){ >>>> new_pcoords = matrix(rep(0,4*nrow(Pcoords)), nrow = 2* >>>> nrow(Pcoords), byrow = T ) >>>> cont = 0 >>>> for (i in 1:nrow(Pcoords)){ >>>> if (i == nrow(Pcoords)) { >>>> cont = cont + 1 >>>> new_pcoords[cont,] = Pcoords[i,] >>>> cont = cont + 1 >>>> new_pcoords[cont,] = Pcoords[i,] - >>>> ((Pcoords[i,]-Pcoords[1,])/2) >>>> }else{ >>>> cont = cont + 1 >>>> new_pcoords[cont,] = Pcoords[i,] >>>> cont = cont + 1 >>>> new_pcoords[cont,] = Pcoords[i,] - >>>> ((Pcoords[i,]-Pcoords[i+1,])/2)}} >>>> Pcoords = new_pcoords} >>>> return(Pcoords) >>>> >>>> } >>>> ) >>>> >>>> setGeneric("fishIout" , >>>> function(x, value){standardGeneric ("fishIout")}) >>>> >>>> setMethod("fishIout" , >>>> signature = "numeric", >>>> function(x, value){ >>>> >>>> d = value >>>> if (x > 0){ >>>> signo = 1 >>>> }else{ >>>> signo = -1 >>>> } >>>> x = abs(x) >>>> return(signo*(-(x/((d*x)-d-1)))) >>>> } >>>> ) >>>> >>>> setGeneric("fishIin" , >>>> function(x, value){standardGeneric ("fishIin")}) >>>> >>>> setMethod("fishIin" , >>>> signature = "numeric", >>>> function(x, value){ >>>> >>>> d = value >>>> if (x > 0){ >>>> signo = 1 >>>> }else{ >>>> signo = -1 >>>> } >>>> x = abs(x) >>>> >>>> return(signo*(((d+1)*x)/(d*x+1))) >>>> } >>>> ) >>>> >>>> setGeneric("toPolar" , >>>> function(x, y){standardGeneric ("toPolar")}) >>>> >>>> setMethod("toPolar" , >>>> signature = "numeric", >>>> function(x, y){ >>>> >>>> t1 = atan2(y,x) >>>> rP = sqrt(x^2+y^2) >>>> return(c(t1 = t1,rP = rP)) >>>> >>>> } >>>> ) >>>> >>>> setGeneric("toCartesian" , >>>> function(t1, rP){standardGeneric ("toCartesian")}) >>>> >>>> setMethod("toCartesian" , >>>> signature = "numeric", >>>> function(t1, rP){ >>>> >>>> x1 = rP*cos(t1) >>>> y1 = rP*sin(t1) >>>> return(c(x = x1,y = y1)) >>>> >>>> } >>>> ) >>>> >>>> setGeneric("circulo" , >>>> function(cx, cy, r, circleCol, PLOT = >>>> TRUE){standardGeneric ("circulo")}) >>>> >>>> setMethod("circulo" , >>>> signature = "numeric", >>>> function(cx, cy, r, circleCol, PLOT = TRUE){ >>>> >>>> t = seq(0,2*pi,length=100) >>>> circle = t(rbind(cx+sin(t)*r,cy+cos(t)*r)) >>>> if (PLOT == TRUE) >>>> plot(circle,type='l',,ylim=c(-1.15,1.15),xlim=c(-1.15,1.15), >>>> ann=FALSE, axes=F, col = circleCol) >>>> return(circle) >>>> >>>> } >>>> ) >>>> >>>> setGeneric("circulin" , >>>> function(cx, cy, r = 0.045, >>>> objeto, col = 'blue', PLOT = TRUE, label = 0){ >>>> standardGeneric ("circulin")}) >>>> >>>> setMethod("circulin" , >>>> signature = "ANY", >>>> function(cx, cy, r = 0.045, objeto, col = 'blue', PLOT = >>>> TRUE, label = 0){ >>>> >>>> t = seq(0,2*pi,length=100) >>>> circle = t(rbind(cx+sin(t)*r,cy+cos(t)*r)) >>>> points(circle,type='l', col = col) >>>> if (label != 0) text(cx,cy,label,cex = .7) >>>> insiders <- >>>> apply(objeto,1,function(co)(cx-co[1])^2+(cy-co[2])^2<r^2) >>>> assign('insiders', insiders , envir = POI.env) >>>> >>>> } >>>> ) >>>> >>>> setGeneric("addNoise" , >>>> function(m, tamanyo = 0.01){standardGeneric ("addNoise")}) >>>> >>>> setMethod("addNoise" , >>>> signature = "matrix", >>>> function(m, tamanyo = 0.01){ >>>> >>>> noise = function(m, t = tamanyo){ >>>> ruido = rnorm(length(m), 0,t) >>>> return(m+ruido) >>>> } >>>> noised = noise(m) >>>> unicos = which(duplicated(m) == FALSE) >>>> m[-unicos,] = noised[-unicos,] >>>> return(m) >>>> >>>> } >>>> ) >>>> >>>> setGeneric("toHiperbolico" , >>>> function(objeto, M = 1 , cx = 0, cy = 0, r = 1){ >>>> standardGeneric ("toHiperbolico")}) >>>> >>>> setMethod("toHiperbolico" , >>>> signature = "matrix", >>>> function(objeto, M = 1 , cx = 0, cy = 0, r = 1){ >>>> >>>> insiders = >>>> apply(objeto,1,function(co)(cx-co[1])^2+(cy-co[2])^2<r^2) >>>> outers = which(insiders < 1) >>>> objetoP = matrix(toPolar(objeto[,1],objeto[,2]),nc=2) >>>> if (length(outers)){ >>>> objetoP[outers,2] = 1 >>>> } >>>> objetoP[,2] = sapply(objetoP[,2],fishIin,M) >>>> objetoC = matrix(toCartesian(objetoP[,1],objetoP[,2]),nc=2) >>>> return(list(objetoC = objetoC, >>>> objetoP = objetoP)) >>>> >>>> } >>>> ) >>>> >>>> setGeneric("POIcoords<-" , function(object, value){standardGeneric >>>> ("POIcoords<-")}) >>>> >>>> setReplaceMethod( f ="POIcoords", >>>> signature = 'POI', >>>> definition = function(object, value){ >>>> obj...@pcoords <- value$Pcoords >>>> obj...@pcoordsfi <- value$PcoordsFI >>>> obj...@newpcoords <- value$newPcoords >>>> obj...@objeto <- value$objeto >>>> >>>> return(object) >>>> } >>>> ) >>>> >>>> setGeneric("POICalc" , >>>> function(objeto, NC, cx=0, cy=0, r=1, >>>> ...){standardGeneric ("POICalc")}) >>>> >>>> setMethod("POICalc" , >>>> signature = "POI", >>>> function(objeto, NC, cx=0, cy=0, r=1, ...){ >>>> >>>> MatrizSim = obj...@matrizsim >>>> secuencia = seq(2/NC,2,2/NC) >>>> Pcoords = matrix(rep(0,NC*2),nc=2) >>>> n = 1 >>>> for (i in secuencia){ >>>> Pcoords[n,] = c(r * cos(i*pi), r * sin(i*pi)) >>>> n = n+1 >>>> } >>>> PcoordsFI = matrix(toPolar(Pcoords[,1],Pcoords[,2]),nc=2) >>>> PcoordsFI[,2] = PcoordsFI[,2]+.15 >>>> PcoordsFI = matrix(toCartesian(PcoordsFI[,1],PcoordsFI[,2]),nc=2) >>>> >>>> if (nrow(Pcoords) != 1){ >>>> newPcoords = puntosMedios(Pcoords) >>>> } else { >>>> newPcoords = Pcoords >>>> } >>>> >>>> MatrizSim[is.nan(MatrizSim/rowSums(MatrizSim))] <- 0 >>>> >>>> W = MatrizSim / rowSums(MatrizSim) >>>> W[is.nan(W)] <- 0 >>>> nwords = nrow(W) >>>> objeto = matrix(rep(0,2*nwords),nc=2) >>>> for (j in 1:nwords){ >>>> for (nPOI in 1:NC){ >>>> objeto[j,1] = objeto[j,1]+(W[j,nPOI]*Pcoords[nPOI,1]) >>>> objeto[j,2] = objeto[j,2]+(W[j,nPOI]*Pcoords[nPOI,2]) >>>> } >>>> } >>>> >>>> objeto = addNoise(objeto) >>>> >>>> return(list(Pcoords = Pcoords, >>>> PcoordsFI = PcoordsFI, >>>> newPcoords = newPcoords, >>>> objeto = objeto)) >>>> >>>> } >>>> ) >>>> >>>> setGeneric("POIPlot" , >>>> function(POI){standardGeneric ("POIPlot")}) >>>> >>>> setMethod("POIPlot" , >>>> signature = "POI", >>>> function(POI){ >>>> >>>> par(bg=...@plotcol, mar = c(0.1,0.1,0.1,0.1), family = p...@itemsfamily >>>> ) >>>> >>>> >>>> if (exists('POI.env')) { >>>> if (exists('POI', envir = POI.env)) { >>>> POI <- get('POI', envir = POI.env) >>>> } >>>> } >>>> >>>> selected = p...@selected >>>> objeto = p...@objeto >>>> newcoords = p...@newcoords >>>> newcoords_1 = p...@newcoords_1 >>>> NC = length(p...@wordsinquery) >>>> cx=0 >>>> cy=0 >>>> r=1 >>>> etiq2 = p...@docs[,1] >>>> etiq = p...@wordsinquery >>>> fishEYE = TRUE >>>> M = p...@m >>>> poisTextCol = p...@poistextcol >>>> colores = p...@colores[poi@docs] >>>> poisCircleCol = p...@poiscirclecol >>>> linesCol = p...@linescol >>>> itemsCol = p...@itemscol >>>> circleCol = p...@circlecol >>>> LABELS = p...@labels >>>> Pcoords = p...@pcoords >>>> newPcoords = p...@newpcoords >>>> cgnsphrFont = p...@cgnsphrfont >>>> >>>> newcoords_par = newcoords >>>> >>>> newcoords_Pcoords = matrix(rep( c(newcoords,newcoords_1 ), >>>> nrow(Pcoords)),nc=2,byrow=TRUE) >>>> >>>> newcoords_puntosMediosPcoords = matrix(rep( c(newcoords,newcoords_1), >>>> >>>> nrow(newPcoords)),nc=2,byrow=TRUE) >>>> >>>> newcoords = matrix(rep( c(newcoords,newcoords_1), >>>> nrow(objeto)),nc=2,byrow=TRUE) >>>> >>>> objeto = objeto+newcoords >>>> objetoH = toHiperbolico(objeto, M) >>>> objetoC = objetoH$objetoC >>>> objetoP = objetoH$objetoP >>>> >>>> Pcoords = Pcoords + newcoords_Pcoords >>>> PcoordsH = toHiperbolico(Pcoords, M) >>>> PcoordsC = PcoordsH$objetoC >>>> PcoordsP = PcoordsH$objetoP >>>> >>>> newPcoords = newPcoords + newcoords_puntosMediosPcoords >>>> newPcoordsH = toHiperbolico(newPcoords, M) >>>> Pcoords_objetoC = newPcoordsH$objetoC >>>> >>>> if (LABELS) { >>>> PcoordsFI = matrix(toPolar(PcoordsC[,1],PcoordsC[,2]),nc=2) >>>> PcoordsFI[,2] = 1 +.15 >>>> PcoordsFI = matrix(toCartesian(PcoordsFI[,1],PcoordsFI[,2]),nc=2) >>>> } >>>> >>>> plot(circulo(0,0,1, circleCol, PLOT = >>>> FALSE),cex=.5,ylim=c(-1.15,1.15),xlim=c(-1.15,1.15), >>>> ann=FALSE, axes=F,type='l', col = circleCol) >>>> >>>> points(objetoC, pch=19, col = colores, cex = 1.5 - objetoP[,2]) >>>> >>>> text(objetoC[,1], objetoC[,2], labels = etiq2, cex = cgnsphrFont - >>>> objetoP[,2], >>>> pos = 3, col = itemsCol) >>>> >>>> abline(h = cx, col = 'grey', lty = 'dashed') >>>> abline(v = cy, col = 'grey', lty = 'dashed') >>>> >>>> >>>> points(PcoordsC,cex = 2, col = poisCircleCol) >>>> >>>> lines(Pcoords_objetoC, col = linesCol) >>>> >>>> >>>> >>>> segments(Pcoords_objetoC[nrow(Pcoords_objetoC),1],Pcoords_objetoC[nrow(Pcoords_objetoC),2], >> >>> Pcoords_objetoC[1,1],Pcoords_objetoC[1,2], col = linesCol) >>>> >>>> if (LABELS) { >>>> text(PcoordsFI[,1],PcoordsFI[,2],toupper(etiq),cex=.75, col = >>>> poisTextCol) >>>> } >>>> >>>> if (selected != 1) { >>>> circulin(0,0, .5, objeto = objetoC) # probando >>>> } >>>> >>>> if (!exists('POI.env')){ >>>> POI.env <<- new.env() >>>> } >>>> poiCOPY = POI >>>> poic...@objeto <- objeto >>>> poic...@objetoc <- objetoC >>>> poic...@newpcoords <- newPcoords >>>> poic...@pcoords <- Pcoords >>>> assign('POI',poiCOPY , envir = POI.env) >>>> >>>> } >>>> ) >>>> >>>> >>>> # *strong*VERY*strong* basic kmeans example with 6 clusters and 10 >>>> variables >>>> x <- matrix(rnorm(100, mean = 1, sd = .3), ncol = 10) >>>> x <- rbind(x,matrix(rnorm(200, mean = 5, sd = .3), ncol = 10)) >>>> x <- rbind(x,matrix(rnorm(100, mean = 10, sd = .3), ncol = 10)) >>>> x <- rbind(x,matrix(rnorm(100, mean = 15, sd = .3), ncol = 10)) >>>> x <- rbind(x,matrix(rnorm(200, mean = 20, sd = .3), ncol = 10)) >>>> x <- rbind(x,matrix(rnorm(100, mean = 25, sd = .3), ncol = 10)) >>>> >>>> cl <- kmeans(x, 6, iter.max = 100 ,nstart = 25) >>>> >>>> # *strong*VERY*strong* basic way of reordering cluster output for >>>> better plotting >>>> # here we reorder using just the first cluster >>>> reorder.cl <- as.numeric(names(sort(rank((as.matrix(dist(cl$centers, >>>> diag = T)))[,1])))) >>>> cl$centers <- cl$centers[reorder.cl, ] >>>> cl$size <- cl$size[reorder.cl] >>>> >>>> # distance matrix between each element and its cluster center >>>> matrizSim = matrix(rep(0, nrow(cl$centers) * nrow(x)), ncol = >>>> nrow(cl$centers)) >>>> for (n in 1:nrow(cl$centers)){ >>>> for (i in 1:nrow(x)) { >>>> a = x[i,] >>>> b = cl$centers[n,] >>>> matrizSim[[i,n]] = dist(rbind(a,b)) # eucl dist >>>> } >>>> } >>>> >>>> # From dist to similarity (0 - 1) >>>> matrizSim = 1 - (matrizSim / rowSums(matrizSim) ) >>>> # exagerate similarity >>>> matrizSim = matrizSim^3 >>>> >>>> # Create POI plot >>>> clusterPOI = new('POI') >>>> cluster...@m = 1 # no fisheye distorsion >>>> cluster...@matrizsim <- matrizSim >>>> cluster...@wordsinquery <- paste('"', >>>> as.character(round(cl$centers[,1]),2),'"', ' >>>> size',as.character(cl$size)) >>>> POIcoords(clusterPOI) <- POICalc(clusterPOI >>>> ,length(cluster...@wordsinquery)) >>>> cluster...@docs <- >>>> >>>> cbind(matrix(seq(1:nrow(cluster...@objeto >>>> >>> ))),matrix(seq(1:nrow(cluster...@objeto)))) >> >>> cluster...@colores <- cl$cluster + 1 >>>> cluster...@cos.query.docs <- rep(1, length(cl$cluster)) >>>> POI.env <<- new.env() >>>> POIPlot(clusterPOI) >>>> >>> >>> >>> ______________________________________________ >> R-help@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > > David Winsemius, MD > Heritage Laboratories > West Hartford, CT > > > [[alternative HTML version deleted]]
______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.