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

gre*_*er0 8 r histogram ggplot2

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

默认ggplot2输出

我试过玩binwidth,但我无法摆脱那个丑陋的"空"垃圾箱:

带调整binwidth的ggplot2输出

有趣(对我来说),hist()R 的默认功能似乎产生了更好的"分割"箱子:

hist的默认输出

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

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

function (x, ...) 
UseMethod("hist")
<bytecode: 0x2f44940>
<environment: namespace:graphics>
Run Code Online (Sandbox Code Playgroud)

它没有我的问题的信息.

我使用以下代码在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"))
Run Code Online (Sandbox Code Playgroud)

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

MrF*_*ick 12

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

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

#base histogram
hist(mydata$myvariable)
Run Code Online (Sandbox Code Playgroud)

如您所知,hist()是一个通用函数.如果要查看可以键入的不同实现methods(hist).大部分时间你都会跑步hist.default.因此,如果从该函数借用破解发现逻辑,我们就会想出来

brx <- pretty(range(mydata$myvariable), 
    n = nclass.Sturges(mydata$myvariable),min.n = 1)
Run Code Online (Sandbox Code Playgroud)

这是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"))
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

  • 如何将其抽象为“geom_base_histogram()”?即如何在这样的函数中提取“x”变量? (2认同)