Rotate histogram in R or overlay a density in a barplot

后端 未结 5 843
一个人的身影
一个人的身影 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:34

    I'm not sure whether it is of interest, but I sometimes want to use horizontal histograms without any packages and be able to write or draw at any position of the graphic.

    That's why I wrote the following function, with examples provided below. If anyone knows a package to which this would fit well, please write me: berry-b at gmx.de

    Please be sure not to have a variable hpos in your workspace, as it will be overwritten with a function. (Yes, for a package I would need to insert some safety parts in the function).

    horiz.hist <- function(Data, breaks="Sturges", col="transparent", las=1, 
    ylim=range(HBreaks), labelat=pretty(ylim), labels=labelat, border=par("fg"), ... )
      {a <- hist(Data, plot=FALSE, breaks=breaks)
      HBreaks <- a$breaks
      HBreak1 <- a$breaks[1]
      hpos <<- function(Pos) (Pos-HBreak1)*(length(HBreaks)-1)/ diff(range(HBreaks))
      barplot(a$counts, space=0, horiz=T, ylim=hpos(ylim), col=col, border=border,...)      
      axis(2, at=hpos(labelat), labels=labels, las=las, ...) 
      print("use hpos() to address y-coordinates") }
    

    For examples

    # Data and basic concept
    set.seed(8); ExampleData <- rnorm(50,8,5)+5
    hist(ExampleData)
    horiz.hist(ExampleData, xlab="absolute frequency") 
    # Caution: the labels at the y-axis are not the real coordinates!
    # abline(h=2) will draw above the second bar, not at the label value 2. Use hpos:
    abline(h=hpos(11), col=2)
    
    # Further arguments
    horiz.hist(ExampleData, xlim=c(-8,20)) 
    horiz.hist(ExampleData, main="the ... argument worked!", col.axis=3) 
    hist(ExampleData, xlim=c(-10,40)) # with xlim
    horiz.hist(ExampleData, ylim=c(-10,40), border="red") # with ylim
    horiz.hist(ExampleData, breaks=20, col="orange")
    axis(2, hpos(0:10), labels=F, col=2) # another use of hpos()
    

    One shortcoming: the function doesn't work with breakpoints provided as a vector with different widths of the bars.

提交回复
热议问题