2017-05-03 111 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