【问题标题】:Axis-labeling in R histogram and density plots; multiple overlays of density plotsR 直方图和密度图中的轴标记;密度图的多重叠加
【发布时间】:2012-03-04 00:00:12
【问题描述】:

我有两个相关的问题。

问题 1:我目前正在使用下面的代码生成一个覆盖有密度图的直方图:

hist(x,prob=T,col="gray")
axis(side=1, at=seq(0,100, 20), labels=seq(0,100,20))
lines(density(x))

我已经粘贴了数据(即上面的xhere

目前的代码有两个问题:

  • x 轴的最后一个刻度和标签 (100) 未出现在直方图/绘图上。我怎样才能穿上这些?
  • 我希望 y 轴是计数或频率而不是密度,但我想保留密度图作为直方图上的叠加。我该怎么做?

问题 2:使用与问题 1 类似的解决方案,我现在想要覆盖三个密度图(不是直方图),再次在 y 轴上使用频率而不是密度。这三个数据集位于:

  1. http://pastebin.com/z5X7yTLS

  2. http://pastebin.com/Qg8mHg6D

  3. http://pastebin.com/aqfC42fL

【问题讨论】:

  • 如果您将 y 轴设为计数值(您可以在花时间阅读 ?hist 后执行此操作),那么 density 可能会被缩放得如此之小,以至于几乎无法注册。您需要将其乘以观察总数,以使其与计数的比例相同。

标签: r


【解决方案1】:

这是您的前 2 个问题:

    myhist <- hist(x,prob=FALSE,col="gray",xlim=c(0,100))
    dens <- density(x)
    axis(side=1, at=seq(0,100, 20), labels=seq(0,100,20))
    lines(dens$x,dens$y*(1/sum(myhist$density))*length(x))

直方图的 bin 宽度为 5,也等于 1/sum(myhist$density),而 density(x)$x 的跳跃幅度很小,在您的情况下约为 0.2(512 个偶数步)。 sum(density(x)$y) 是一个奇怪的数字,绝对不是 1,但那是因为它是小步长的,当除以 x 间隔时,它大约是 1:sum(density(x)$y)/(1/diff(density(x)$x)[1])。您以后不需要这样做,因为它已经与它自己的奇数 x 值相匹配。正如 DWin 所说,缩放 1) 用于 hist() 的 bin 宽度和 2) 用于 x length(x) 的频率。设置 xlim 参数后,最后一个轴刻度变为可见。

要解决您的问题 2,请使用正确的尺寸(xlimylim)和type = "n" 设置一个绘图,然后为密度绘制 3 条线,使用类似于上面的密度线进行缩放。但是,请考虑一下您是否希望这些半连续线反映箱宽为 5 的假想条的高度...您知道这可能会使密度线夸大任何特定点的计数吗?

【讨论】:

  • 谢谢。我决定不使用 y 轴上的频率来绘制密度叠加图。
【解决方案2】:

虽然这是一个旧线程,但如果有人抓住这个。我只会认为放弃将 y 密度转换为根据用户尝试执行的操作来计算比例是一个“好主意”。

使用频率作为 y 值有充分的理由。特别想到的一个想法是,如果混合分布模型不能可靠或直观地应用,则使用 y 尺度值的计数可以让分析师很好地了解从何处开始“数据搜寻”以对异构数据进行分层。

在实践中,在观察到的直方图上叠加密度估计在数据质量检查中非常有用。例如,在上面,如果我将上面的图形视为单一数据源,并假设它描述了 “1 件事”,并且我希望将其建模为 “1事情”,我有一个问题。也就是说,我有异构数据,可能需要一定程度的分层。然后,密度叠加成为检测异质性的简单可视化工具(除了使用对数变换来平滑区间变化),以及用于分层数据的方向(混合分布的位置)。

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 2020-08-08
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多