我正在尝试使用ggplot2绘制一个变量的直方图。不幸的是,ggplot2的默认binwidth还有一些不足之处:
我曾尝试使用binwidth
,但我无法摆脱那个丑陋的“空”垃圾箱:
有趣的是(对我来说),R的默认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生成的图表具有相同的差距。
答案 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"))
下面的图表并排显示了两个结果,你可以看到它们非常相似。
此外,空的bim可能是由你的y轴限制引起的。如果形状超出了您在scale_y_continuous
中指定的范围的限制,它将简单地从图中删除。看起来这个箱子想要高14,但你把它剪成了12.5。