2012-01-19 37 views
1

我想根據它們的大小(即組中數據框中的觀察次數)在barplot中標記每個框。R每個樣本的barplot標籤大小

例如,如果第一個變量有3個級別,第二個變量有4個級別,我想要12個標籤。

(而且,是有可能的大小來控制或這些標籤的位置)

感謝您的任何幫助。

回答

4

下面介紹一種方法,以數據VADeaths爲例(默認情況下,它將在您的R工作區中,如果沒有,則使用library(datasets))。

bar <- barplot(VADeaths) 
text(rep(bar,each=nrow(VADeaths)), as.vector(apply(VADeaths,2,cumsum)), 
    labels=as.vector(apply(VADeaths,2,cumsum)),pos=3) 

它看起來像這樣:

enter image description here

要修改字體的大小,您可以使用text(...,cex=2),使事情的兩倍,他們的尺寸,例如

現在,我們來解釋一下這段代碼,讓你知道如何自己做!

首先,讓我們來看看VADeaths:這是按類別死亡人數各年齡組的計數:

> VADeaths 
     Rural Male Rural Female Urban Male Urban Female 
50-54  11.7   8.7  15.4   8.4 
55-59  18.1   11.7  24.3   13.6 
60-64  26.9   20.3  37.0   19.3 
65-69  41.0   30.9  54.6   35.1 
70-74  66.0   54.3  71.1   50.0 

現在,做就barplot文本,我們基本上得出barplot,並然後使用R命令text在頂部繪製文本(請參見?text)。

text要求在條形圖上繪製x,y座標和相應的文本段。我們會給它的條形圖中每一行的座標來繪製文本。

爲此,請參閱「值」部分?barplot。此功能不僅繪製您的柱狀圖,而且還會返回每個柱的x座標。得分了!

> bar <- barplot(VADeaths) 
> bar 
[1] 0.7 1.9 3.1 4.3 

現在我們只需要y座標就可以使用我們的x座標。

好吧,隨着你的進展,一個疊加的條形圖只會對VADeaths中的頻率進行統計。 例如,在'農村男性'組中,第一行是11.7,第二行是11.7 + 18.1 = 29.8,第三位是11.7 + 18.1 + 26.9 = 56.7,依此類推(請參閱VADeaths中的值)。

所以,我們的y座標需要累積和。

要計算每列的這些值,我們可以使用cumsum。例如

> cumsum(c(1,2,3,4,5)) 
[1] 1 3 6 10 15 

因爲我們想在VADeaths做到這一點爲每列,我們要使用的功能apply

> apply(VADeaths,2,cumsum) 
     Rural Male Rural Female Urban Male Urban Female 
50-54  11.7   8.7  15.4   8.4 
55-59  29.8   20.4  39.7   22.0 
60-64  56.7   40.7  76.7   41.3 
65-69  97.7   71.6  131.3   76.4 
70-74  163.7  125.9  202.4  126.4 

apply(VADeaths,2,cumsum)意思是: 「對於VADeaths每一列,計算該cumsum」。 這給出了條形圖每一行的y值。

讓我們保存這些yvalues進一步使用:

> yvals <- as.vector(apply(VADeaths,2,cumsum)) 

我用as.vector的原因僅僅是矩陣平面化爲價值的載體 - 它使繪圖更容易。最後一件事 - 我的x值(我存儲在bar中)每條只有一個值,但我需要擴展它,所以每個條上每行有一個x值。要做到這一點:

> xvals <- rep(bar,each=nrow(VADeaths)) 

這令我以前x1,x2,x3,x4x1,x1,x1,x1,x1, x2,x2,x2,x2,x2, ..., x4,x4,x4,x4,x4。 現在我的xvals匹配我的yvals

之後,它只是一個使用text的情況。

> text(xvals, yvals, labels=yvals, pos=3) 

labels參數告訴text什麼文字把在X/Y位置。 pos=3的意思是「繪製每一點的文本剛好超過我指定的x/y值」。否則,數字將被繪製在難以閱讀的條線上。

現在,有很多選項可以自定義文本的位置和大小,並且我建議您閱讀?text以查看它們。

所有這些代碼凝結下來到二襯我在答案的開始了,但是這個版本可能會多一點理解:

bar <- barplot(VADeaths) 
xvals <- rep(bar,each=nrow(VADeaths)) 
yvals <- as.vector(apply(VADeaths,2,cumsum)) 
text(xvals, yvals, labels=yvals, pos=3) 
+0

非常感謝你 – jinni

相關問題