# Re: [R] Need help putting histograms on the diagonal of a splom plot

```On 8/30/07, Marc Paterno <[EMAIL PROTECTED]> 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 + 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 + 0.95 * diff(yrng) * y / max(y) )
panel.lines(d)
})
}

-Deepayan

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help