2017-05-03 99 views
0

我正在製作一個barplot來顯示連續變量的分佈,例如,上市價格的價格分配。 我生成了一些樣本數據,並使用ggplot2創建了一個barplot。製作連續變量分佈的barplot

a<- rnorm (100, 1000, 1000) 
d <- as.data.frame(a) 
d <-d %>% mutate(b=cut(a, breaks=seq(min(a),max(a), 500))) %>% 
    group_by(b) %>% summarize(count=n()) 
ggplot(data=d, aes(x=b, y=count)) + 
    geom_bar(stat = 'identity')+ 
    theme (axis.text.x=element_text(angle=90, size=5, face='bold')) 

enter image description here

我的問題是

  • 我怎麼可以格式化x軸標籤,這樣,例如,1.22E + 03變爲1220

  • 爲什麼上次bin變成NA?

我知道我只能使用geom_histogram這個數據。但我只是想有一些靈活性來將連續變量分割成一些高度偏斜的數據。 任何幫助非常感謝。提前致謝。

+2

你想柱狀圖或直方圖?如果你跳過你的mutate步驟,你可以執行'ggplot(d)+ geom_histogram(aes(a))'否則如果你想要製作''cure''cut他們「漂亮」。 – MrFlick

回答

2

這兩個問題都是關於cut()。您應該閱讀?cut

要避免類標籤中的科學記數法,請使用參數dig.lab。在你的例子中,cut(a, breaks=seq(min(a),max(a), 500), dig.lab = 6L)似乎就夠了。

NA s出現的原因有兩個,與您的breaks參數有關。首先,默認情況下,cut()中不包含第一個中斷,因此a == min(a)將會是NA。要解決此問題,請使用include.lowest = TRUE

最後,你的最高值將被忽略,因爲seq(min(a), max(a), 500)產生max(a)之前停止在500 最後的倍數載體,因此不包括max(a)。爲了克服這個問題,你需要確保seq的第二個參數是max(a)之後的第一個500的倍數,如ceiling(max(a)/500) * 500

因此,這應該工作:

d <-d %>% 
    mutate(b=cut(a, breaks=seq(min(a), ceiling(max(a)/500) * 500, 500), 
       include.lowest = TRUE, 
       dig.lab = 6L)) %>% 
    group_by(b) %>% summarize(count=n()) 
+0

非常明確的解釋!非常好!謝謝!! @scoa – zesla