Hello, I think the histograms may have been unintentionally omitted from the examples below. Borrowing from a couple of sources, here's a function to get the histograms instead of the density plot:
panel.hist.splom<-function(x, ...) { yrng <- current.panel.limits()$ylim h <- hist(x, plot = FALSE) breaks <- h$breaks; nB <- length(breaks) y <- h$counts; y <- yrng[1] + 0.95 * diff(yrng) * y / max(y) panel.rect(breaks[-nB], yrng[1], breaks[-1], y, col="cyan", ...) } -Ben From: Deepayan Sarkar <deepayan.sarkar_at_gmail.com <mailto:deepayan.sarkar_at_gmail.com?Subject=Re:%20%5BR%5D%20Need%20help%20putting%20histograms%20on%20the%20diagonal%20of%20a%20splom%20plot>> Date: Fri, 31 Aug 2007 14:02:27 -0700 On 8/30/07, Marc Paterno <paterno_at_fnal.gov> wrote: > Hello, <http://tolstoy.newcastle.edu.au/R/e2/help/07/08/24539.html#24614qlink1> /> / /> I am in need of help in putting histograms on the diagonal of a plot / /> produced with splom(). / /> / /> The plot matrix I am trying to produce is to have standard scatterplots / /> in the upper-left triangle, contour plots in the lower-right triangle, / /> and histograms on the diagonal. I have a function that does the first / /> two, but the histograms on the diagonal has been beyond my ability. / /> / /> Here is my function: / /> / /> require(lattice) / /> require(MASS) / /> my.plot = function(data) / /> { / /> splom( ~data / /> , lower.panel=function(x,y, ...) / /> { / /> xy=kde2d(x,y) / /> xy.tr=con2tr(xy) / /> panel.contourplot( xy.tr$x / /> , xy.tr$y / /> , xy.tr$z / /> , subscripts=seq(nrow(xy.tr)) / /> , contour=TRUE / /> , region=TRUE / /> , labels = FALSE / /> , col.regions = terrain.colors / /> ) / /> } / /> , upper.panel=function(x,y, ...) / /> { / /> panel.grid(-1,-1) / /> panel.xyplot(x,y, cex=0.5) / /> } / /> #, diag.panel=function(x, ...) / /> # { / /> # panel.histogram(x, ...) / /> # } / /> ) / /> } / /> / /> It can be called, for example, with: / /> / /> my.plot(subset(iris, select = Sepal.Length:Petal.Width)) / /> / /> (the subset is necessary to get rid of a variable that is a factor; my / /> function can not deal with factors). / /> / /> I have commented out my best guess at the code needed to produce the / /> histograms along the diagonal, which fails. / Well, basically the y-axis range of the diagonal panels are not right. What you want is simpler if you are happy with a density estimate: my.plot = function(data) { splom( ~data #, lower.panel=... #, upper.panel=... , diag.panel = function(x, ...) { yrng <- current.panel.limits()$ylim d <- density(x) d$y <- with(d, yrng[1] + 0.95 * diff(yrng) * y / max(y) ) panel.lines(d) }) } my.plot(iris[1:4]) For a histogram, things are a bit more complicated, but still easy enough: my.plot = function(data) { splom( ~data #, lower.panel=... #, upper.panel=... , diag.panel = function(x, ...) { yrng <- current.panel.limits()$ylim d <- density(x) d$y <- with(d, yrng[1] + 0.95 * diff(yrng) * y / max(y) ) panel.lines(d) }) } -Deepayan -- Benjamin Barnes, MEM Doctoral Student Department of Environmental Epidemiology German Cancer Research Center Im Neuenheimer Feld 280 D-69120 Heidelberg ______________________________________________ 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.