2017-05-24 24 views
0

偶爾hist(..., nclass=nclass.scott)會生成一個直方圖,其中最大橫條延伸到y軸的頂部。您可能會幾次嘗試這個例子:如何獲得hist(nclass = nclass.scott)的「完美」Y軸?

x <- sample(1000000, 500, replace=TRUE) 
h <- hist(x,nclass=nclass.scott) 
text(x=h$mids, y=h$counts, labels=h$counts, pos=3, col="red") 

例子:enter image description here

偶爾不能呈現在最高的酒吧的紅色數字,因爲它似乎是由積區被裁剪。我可以添加ylim=...,但獲得酒吧的最大高度是非常棘手的。

即使知道最大高度,ylim=(0, max)也存在max可能會被忽略的問題:例如,當最大值爲527時,即使指定了ylim=(0, 527),上方顯示的y軸標籤也是500。當使用600代替時,它可以工作,但y軸有點太長...

如果這不是R(3.3.3)的錯誤,那麼優雅(簡約)解決方案是什麼?

回答

0

你描述的不是一個錯誤。您正在使用功能來繪製直方圖,然後您想要添加文本。該功能並沒有爲此設計,因此您需要爲文本預留一些額外的空白區域。

我建議你運行一次函數來獲得圖的「基值」。然後以調整的比例再次運行該函數(文本的額外空間)。爲了達到這個目的,你可以使用下面的代碼

set.seed(9876)   ### for reproducibility 

x <- sample(1000000, 500, replace = TRUE) 
h <- hist(x, nclass = nclass.scott, plot = FALSE) 

### use the info from the previous call to adjust the y-scale with a constant 
hist(x, nclass = nclass.scott, ylim = c(0, max(h$counts) + 10)) 
text(x = h$mids, y = h$counts, labels = h$counts, pos = 3, col = "red") 

### ... or add a proportion (a little bit more robust) 
hist(x, nclass = nclass.scott, ylim = c(0, max(h$counts) * 1.075)) 
text(x = h$mids, y = h$counts, labels = h$counts, pos = 3, col = "red") 

請讓我知道這是你想要的。

+0

那不是創造一個情節兩次,第一次錯了,那麼好嗎? –

+0

@ U.Windl。這個想法是首先將直方圖信息存儲在'h'中(並且我們不會將其繪製到屏幕上)。然後,我們使用'h'中的信息來繪製真實的圖形。第二次錯誤地將直方圖信息分配給了h。我現在會更新我的答案。 – KoenV

+0

我還是不明白爲什麼第一次調用不會創建一個plot:你不應該爲'hist()'的第一次調用添加'plot = FALSE'嗎? –

2

我認爲你需要在圖中設置par(xpd= T)以避免修剪。

?par 

XPD

邏輯值或NA。如果爲FALSE,則將所有繪圖剪切至 繪圖區域,如果爲TRUE,則將所有繪圖剪切至圖形區域 ,如果爲NA,則將所有繪圖剪切至設備區域。另請參閱 剪輯。

您可以通過usr選項和xpd .Upon觀察酒吧合作做得更好似乎走出去圖表,但它是不是打算在圖表之外,但軸被限制在標籤欄。因此,要修復標籤,我們可以選擇使用usr。如果有人想使用保證金,也可以使用mar

library(RColorBrewer) 
par(mfrow=c(1,1),xpd=T,yaxs="i") 
x <- sample(1000000, 500, replace=TRUE) 
h <- hist(x,nclass=nclass.scott,axes=FALSE,col=brewer.pal(10,"Set3")) 
# usr <- par("usr") 
at <- c(0, 10,30, par("usr")[4]) 
axis(2,at=at,labels = round(at)) 
text(x=h$mids, y=h$counts, labels=h$counts, pos=3, col="red") 

USR

形式C(X1,X2,Y1,Y2)的載體給予繪製區域的 用戶座標的極端。當使用對數刻度 (即par(「xlog」)爲真時,請參閱下文),則x限制將爲10^par(「usr」)[1:2]。對於y軸同樣如此。

您可能想要多次運行它,我已經運行了很多次,酒吧似乎現在不會出現在圖表之外。

輸出

enter image description here

+1

'par'內的樂於助人的小塊頭永不停止令我驚歎 – bouncyball

+0

實際的問題是超出軸線的橫杆;裁剪只是次要的效果。我希望看到主要效果的修復。 –

+0

@ U.Windl請參閱我的編輯。我希望這可以解決你的問題 – PKumar