Marc Paterno
2007-Aug-30 23:37 UTC
[R] Need help putting histograms on the diagonal of a splom plot
Hello, 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. Any guidance would be greatly appreciated. best regards, Marc
Deepayan Sarkar
2007-Aug-31 21:02 UTC
[R] Need help putting histograms on the diagonal of a splom plot
On 8/30/07, Marc Paterno <paterno at fnal.gov> wrote:> Hello, > > 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
2007-Sep-21 07:33 UTC
[R] Need help putting histograms on the diagonal of a splom plot
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
Possibly Parallel Threads
- Lattice: Histogram in splom diagonals
- How to add the variable name to a qqplot or densityplot in the diagonal of an splom?
- Overlaying 2D kernel density plots on scatterplot matrix
- How to put given values in lower triangle of splom-plot?
- modifying the text size in splom