【问题标题】:ploting DENSITY histograms with ggplot用 ggplot 绘制密度直方图
【发布时间】:2014-08-20 21:03:45
【问题描述】:

如何将这两个向量中值的密度同时绘制为两个直方图:

interactors1 = c(-6.4, -3.7, -7.7, -4.6, -2.0, -5.5, -3.3, -5.8, -5.0, -4.5,
                  3.2, -0.1, -3.0, -9.2, -3.1, -8.5, -5.4, -9.1, -7.7,  2.2,
                  1.7,  3.4, -8.6, -0.5, -8.1)

noninteractors1 = c(-1, 0.1, 2.7, 0.4, 4.3)

在你问之前,是的,我确实检查了this post

我想使用 ggplot 而不是 hist,因为绘图看起来好多了。当我将数据融合到数据框中并绘制计数时,一切都很好 - 我明白了

interactors=data.frame(interactors1,noninteractors1)

ggplot(melt(interactors), aes(value, fill = variable)) 
      + geom_histogram(position = "dodge")

但是,我不需要计数,我需要密度。

当我这样做时

ggplot(melt(interactors), aes(value, fill = variable)) 
   + geom_histogram(aes(y=..density..),position = "dodge")

我得到了一个老生常谈的结果。这不可能是正确的,因为 densities*bins 的总和超过 1。我做错了什么?任何帮助将不胜感激。

附:我尝试发布情节,但它不让我......

【问题讨论】:

  • 如果您希望它加起来为 1,则应添加 binwidth=1。否则密度加起来为 1/binwidth,这是由 ggplot 自动设置的(带有警告)。一般来说,我建议不要忽视警告信息......
  • 当我指定并明确指定 binsidth=1 时,我得到一个直方图,其中 bins*density 的总和似乎不等于 1。它看起来肯定比不指定 bin 中断更好,但我如何解释结果?大家干杯。

标签: r ggplot2


【解决方案1】:

如果不想设置 binwidth = 1,可以将 y 值乘以 binwidth。例如:

m + geom_histogram(binwidth = 0.5, aes(y = (..density..)*0.5))

这允许您改变 binwidth 并创建具有适当比例的频率直方图。

【讨论】:

    【解决方案2】:

    感谢 Jaap 和 Philippe 的回复,非常感谢。我在 Google 上找到了我要查找的内容,但也会在此处发布 - 信息越多越好。

    为了使密度之和等于 1,必须指定 binwidth=1(感谢 Jaap)。当 bin 不等于 1 时,密度之和不等于 1。而是密度*bin 宽度的乘积之和等于 1。当 binwidth=1 时,每个矩形的高度(密度)为等于您的变量具有 value=x 的概率。当 binwidth!=1 时,其概率等于矩形的面积,即密度*矩形的宽度/bin 的大小/。

    祝大家好运。 :)

    【讨论】:

    • 我认为如果你只是用这个答案编辑你的问题并删除这个答案会更好
    【解决方案3】:

    试试这个

    data=(melt(interactors))
    ggplot(data, aes(x=value, fill=variable)) + geom_histogram(aes(y=..density..), binwidth = 1)
    

    【讨论】:

    • 当我指定 bins 并明确指定 binsidth=1 时,我得到一个直方图,其中 bins*density 的总和似乎不等于 1。它看起来肯定比不指定 bin 好休息,但我如何解释结果?大家干杯。
    • bindwidth 参数似乎与中断具有相同的效果。事实上geom_histogram使用stat_bin函数。因此,您可以这样编写直方图:ggplot(data, aes(x=value, fill=variable)) + stat_bin(aes(y=..density..), breaks = seq(-10,5,by=1), position = "dodge") 并获得与以前相同的结果。这里的好处是它的语法与hist 的通用方法相同。你确定binsidthargument 吗?我对此一无所知。第二个选项是将您的结果与通用方法进行比较。
    • 这会产生与以前相同的结果。我的问题是,我可以指定 binwidths 并让所有内容加起来为 1。如果没有,我如何解释数据。这是我的一个示例直方图(不在上面的两个向量上,见下图)。如果这些值加起来不等于 1,我怎么知道发生了什么?我可以直接比较两个分布吗?
    • 为此,我认为geom_density() 函数更专用。此函数调用基础包stats 中的density 函数并使用相同的参数和算法。您可以在?stat_density 尤其是?density 中找到这两个函数的所有详细信息。希望对您有所帮助。
    猜你喜欢
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2021-05-04
    • 1970-01-01
    • 2014-05-03
    • 2017-06-08
    相关资源
    最近更新 更多