2016-07-24 58 views
3

我使用hist()lines()函數創建了具有密度疊加層的直方圖,並且希望顯示頻率而不是密度的y-axis積分直方圖和密度曲線,其中一個軸用於頻率,另一個用於密度

有什麼辦法可以使用hist()而不使用ggplot?將頻率軸作爲右側的第二個y軸甚至會更好。這裏是我的代碼:

g <- rnorm(2000,5,1) 
h<-hist(g, breaks=50, col="bisque",  
     border="black",ylab="Frequeny",yaxt='n', 
     main="Title",xlab=paste0("Cr","(mg/dL)"),prob=TRUE) 
Axis(side=2, at=seq(0, 200, by=20)) 
lines(density(g),col="dimgray") #For Overlay 

設置prob = FALSE沒有幫助,因爲再行不會爲密度覆蓋工作。

回答

4

讓我們先來生成數據和hist對象:

set.seed(0) ## added for reproducibility 
g <- rnorm(2000, 5, 1) 
h <- hist(g, breaks = 50, plot = FALSE) 

我已經通過暫時抑制plot = FALSE繪製。

的問題是,我們希望有兩個Y軸:

  • 左邊一個顯示計數/頻率;
  • 右邊的那個顯示密度。

基本上我們在兩個軸上密度值添加蜱痕,但

  • 顯示相應計數/頻率上的左邊的一個;
  • 正確的顯示密度值。

hist對象的密度值爲h$density。對於漂亮的圖形,我們應用 pretty()讓勾號標記的位置:

pos <- pretty(h$density, n = 5) 
# [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 

找到相應的罪名在pos,我們這樣做:

freq <- round(pos * length(g) * with(h, breaks[2] - breaks[1])) 
# [1] 0 20 40 60 80 100 120 

這裏使用的round()只是爲了確保由有限精度計算引入的數字被丟棄,所以我們以整數結束。

現在我們準備好生成我們的綜合直方圖。請記住增加右邊距以爲右軸的軸名稱保留一些空間。以下我們將右邊距設置爲與左邊距相同。

new.mai <- old.mai <- par("mai") 
new.mai[4] <- old.mai[2] 
par(mai = new.mai) 

graphics:::plot.histogram(h, freq = FALSE, col="bisque", main="Integrated Histogram", 
          xlab = paste0("Cr","(mg/dL)"), ylab="Frequeny", 
          border="black", yaxt='n') 
Axis(side = 2, at = pos, labels = freq) 
Axis(side = 4, at = pos, labels = pos) 
mtext("Density", side = 4, line = 3) 
lines(density(g), col="dimgray") 

par(mai = old.mai) 

注意我如何使用的graphics:::plot.histogram繪製一個hist對象,mtext上邊距添加文本。有關更多信息,請參閱?plot.histogram?mtext

enter image description here

+0

謝謝李哲源!這工作完美,我不必停止使用hist()。 –

+0

李哲元,是的,這很酷!我希望我能夠upvote你的答案! –

+0

我剛剛做到了!非常酷,非常感謝你! –