R - 使用ggplot2为bin宽度模拟hist()的默认行为

时间:2014-08-05 18:52:26

标签: r histogram ggplot2

我正在尝试使用ggplot2绘制一个变量的直方图。不幸的是,ggplot2的默认binwidth还有一些不足之处:

default ggplot2 output

我曾尝试使用binwidth,但我无法摆脱那个丑陋的“空”垃圾箱:

ggplot2 output with tweaked binwidth

有趣的是(对我来说),R的默认hist()函数似乎会产生更好的“分割”区域:

default output of hist

由于我正在使用ggplot2完成所有其他图形,所以我也想将它用于此图 - 为了保持一致性。如何使用ggplot2生成hist()函数的相同bin“分段”?

我试图在终端输入hist,但我只有

function (x, ...) 
UseMethod("hist")
<bytecode: 0x2f44940>
<environment: namespace:graphics>

没有任何关于我的问题的信息。

我使用以下代码在ggplot2中生成直方图:

ggplot(mydata, aes(x=myvariable)) + geom_histogram(color="darkgray",fill="white", binwidth=61378) + scale_x_continuous("My variable") + scale_y_continuous("Subjects",breaks=c(0,2.5,5,7.5,10,12.5),limits=c(0,12.5)) + theme(axis.text=element_text(size=14),axis.title=element_text(size=16,face="bold"))

我应该补充的一点是,查看由hist()生成的直方图,看起来箱子的宽度为50000(例如,从1400000到1600000,正好有两个箱子);在ggplot2 中将binwidth设置为50000不会生成相同的图形。 ggplot2生成的图表具有相同的差距。

1 个答案:

答案 0 :(得分:11)

如果没有样本数据,总是很难获得可重现的结果,所以我创建了一个样本数据集

set.seed(16)
mydata <- data.frame(myvariable=rnorm(500, 1500000, 10000))

#base histogram
hist(mydata$myvariable)

正如您所了解的那样,hist()是一个通用函数。如果要查看不同的实现,可以键入methods(hist)。大部分时间你都在运行hist.default。因此,如果从该函数借用破解查找逻辑,我们就会提出

brx <- pretty(range(mydata$myvariable), 
    n = nclass.Sturges(mydata$myvariable),min.n = 1)

默认情况下hist()计算中断的方式。然后我们可以使用ggplot命令

来使用这些中断
ggplot(mydata, aes(x=myvariable)) + 
    geom_histogram(color="darkgray",fill="white", breaks=brx) + 
    scale_x_continuous("My variable") + 
    theme(axis.text=element_text(size=14),axis.title=element_text(size=16,face="bold"))

下面的图表并排显示了两个结果,你可以看到它们非常相似。

enter image description here

此外,空的bim可能是由你的y轴限制引起的。如果形状超出了您在scale_y_continuous中指定的范围的限制,它将简单地从图中删除。看起来这个箱子想要高14,但你把它剪成了12.5。