Rotate histogram in R or overlay a density in a barplot

后端 未结 5 832
一个人的身影
一个人的身影 2021-01-31 12:01

I would like to rotate a histogram in R, plotted by hist(). The question is not new, and in several forums I have found that it is not possible. However, all these answers date

5条回答
  •  伪装坚强ぢ
    2021-01-31 12:49

    scatterBarNorm <- function(x, dcol="blue", lhist=20, num.dnorm=5*lhist, ...){
        ## check input
        stopifnot(ncol(x)==2)
        ## set up layout and graphical parameters
        layMat <- matrix(c(2,0,1,3), ncol=2, byrow=TRUE)
        layout(layMat, widths=c(5/7, 2/7), heights=c(2/7, 5/7))
        ospc <- 0.5 # outer space
        pext <- 4 # par extension down and to the left
        bspc <- 1 # space between scatter plot and bar plots
        par. <- par(mar=c(pext, pext, bspc, bspc),
                    oma=rep(ospc, 4)) # plot parameters
        ## scatter plot
        plot(x, xlim=range(x[,1]), ylim=range(x[,2]), ...)
        ## 3) determine barplot and height parameter
        ## histogram (for barplot-ting the density)
        xhist <- hist(x[,1], plot=FALSE, breaks=seq(from=min(x[,1]), to=max(x[,1]),
                                         length.out=lhist))
        yhist <- hist(x[,2], plot=FALSE, breaks=seq(from=min(x[,2]), to=max(x[,2]),
                                         length.out=lhist)) # note: this uses probability=TRUE
        ## determine the plot range and all the things needed for the barplots and lines
        xx <- seq(min(x[,1]), max(x[,1]), length.out=num.dnorm) # evaluation points for the overlaid density
        xy <- dnorm(xx, mean=mean(x[,1]), sd=sd(x[,1])) # density points
        yx <- seq(min(x[,2]), max(x[,2]), length.out=num.dnorm)
        yy <- dnorm(yx, mean=mean(x[,2]), sd=sd(x[,2]))
        ## barplot and line for x (top)
        par(mar=c(0, pext, 0, 0))
        barplot(xhist$density, axes=FALSE, ylim=c(0, max(xhist$density, xy)),
                space=0) # barplot
        lines(seq(from=0, to=lhist-1, length.out=num.dnorm), xy, col=dcol) # line
        ## barplot and line for y (right)
        par(mar=c(pext, 0, 0, 0))
        barplot(yhist$density, axes=FALSE, xlim=c(0, max(yhist$density, yy)),
                space=0, horiz=TRUE) # barplot
        lines(yy, seq(from=0, to=lhist-1, length.out=num.dnorm), col=dcol) # line
        ## restore parameters
        par(par.)
    }
    
    require(mvtnorm)
    X <- rmvnorm(1000, c(0,0), matrix(c(1, 0.8, 0.8, 1), 2, 2))
    scatterBarNorm(X, xlab=expression(italic(X[1])), ylab=expression(italic(X[2])))
    

    enter image description here

提交回复
热议问题