mac
mac

Reputation: 3554

superpose a histogram and an xyplot

I'd like to superpose a histogram and an xyplot representing the cumulative distribution function using r's lattice package.

I've tried to accomplish this with custom panel functions, but can't seem to get it right--I'm getting hung up on one plot being univariate and one being bivariate I think.

Here's an example with the two plots I want stacked vertically:

set.seed(1)
x <- rnorm(100, 0, 1)

discrete.cdf <- function(x, decreasing=FALSE){
    x <- x[order(x,decreasing=FALSE)]
    result <- data.frame(rank=1:length(x),x=x)
    result$cdf <- result$rank/nrow(result)
    return(result)
}

my.df <- discrete.cdf(x)

chart.hist <- histogram(~x, data=my.df, xlab="")
chart.cdf <- xyplot(100*cdf~x, data=my.df, type="s",
                    ylab="Cumulative Percent of Total")

graphics.off()
trellis.device(width = 6, height = 8)
print(chart.hist, split = c(1,1,1,2), more = TRUE)
print(chart.cdf, split = c(1,2,1,2))

stacked plots

I'd like these superposed in the same frame, rather than stacked.

The following code doesn't work, nor do any of the simple variations of it that I have tried:

xyplot(cdf~x,data=cdf,
          panel=function(...){
              panel.xyplot(...)
              panel.histogram(~x)
          })

Upvotes: 3

Views: 1169

Answers (2)

BenBarnes
BenBarnes

Reputation: 19454

You were on the right track with your custom panel function. The trick is passing the correct arguments to the panel.- functions. For panel.histogram, this means not passing a formula and supplying an appropriate value to the breaks argument:

EDIT Proper percent values on y-axis and type of plots

xyplot(100*cdf~x,data=my.df,
          panel=function(...){
              panel.histogram(..., breaks = do.breaks(range(x), nint = 8),
                type = "percent")
              panel.xyplot(..., type = "s")
          })

enter image description here

Upvotes: 4

January
January

Reputation: 17100

This answer is just a placeholder until a better answer comes.

The hist() function from the graphics package has an option called add. The following does what you want in the "classical" way:

plot( my.df$x, my.df$cdf * 100, type= "l" )
hist( my.df$x, add= T )

Upvotes: 3

Related Questions