【问题标题】:R : confidence interval being partially displayed with ggplot2 (using geom_smooth())R:置信区间与 ggplot2 部分显示(使用 geom_smooth())
【发布时间】:2013-10-09 12:46:28
【问题描述】:

我有以下简单的 R 代码:

disciplines <- c("A","C","B","D","E")
# To stop ggplot from imposing alphabetical ordering on x-axis
disciplines <- factor(disciplines, levels=disciplines, ordered=T)

d1 <- c(0.498, 0.521, 0.332, 0.04, 0.04)
d2 <- c(0.266, 0.202, 0.236, 0.06, 0.06)
d3 <- c(0.983, 0.755, 0.863, 0.803, 0.913)
d4 <- c(0.896, 0.802, 0.960, 0.611, 0.994)

df <- data.frame(disciplines, d1, d2, d3, d4)
df.m <- melt(df)
graph <- ggplot(df.m, aes(group=1,disciplines,value,colour=variable,shape=variable)) +
         geom_point() +
         geom_smooth(stat="smooth", method=loess, level=0.95) +
         scale_x_discrete(name="Disciplines") +
         scale_y_continuous(limits=c(-1,1), name="Measurement")

输出如下所示:

为什么置信区间没有显示在整条曲线上?

注意事项:

  1. 我不想使用 fullrange=TRUE,因为这只会在当前输出中产生一条蓝色直线而不是锯齿形。
  2. 我将此图与另一个在 (0,-1] 范围内具有负值的图进行比较,这就是为什么 y 轴有 limits=c(-1,1))

【问题讨论】:

    标签: r plot ggplot2 smoothing


    【解决方案1】:

    对于置信区间的前三个部分,范围的顶端至少部分超出范围(范围为 [-1, 1],而不是轴上稍微扩大的范围)。 ggplot 的默认行为是不显示任何部分超出范围的对象。您可以通过将oob=scales::rescale_none 添加到scale_y_continuous 来解决此问题:

    library(scales)
    graph <- ggplot(df.m, aes(group=1,disciplines,value,colour=variable,shape=variable)) +
             geom_point() +
             geom_smooth(stat="smooth", method=loess, level=0.95) +
             scale_x_discrete(name="Disciplines") +
             scale_y_continuous(limits=c(-1,1), name="Measurement", oob=rescale_none)
    

    【讨论】:

    • 成功了!感谢您的快速答复。我盯着 y 轴的空下半部分,认为这有什么问题……但我忘记了上限是 1.0!置信区间只是稍微超出了一点。我有一种感觉,你的回答为我在 R 出没的未来节省了很多谷歌搜索时间。
    • 请注意,您需要显式加载 scales 包。
    • @Noam Ross,在?continuous_scale 中只说“oob:如何处理超出比例限制(超出范围)的值?`。我在哪里可以阅读有关“做什么”的更多信息?
    • @Henrik:文档记录很差。 oob= 采用一个函数的名称,该函数采用越界值并对其进行修改。这些函数在scales 包中。默认 (censor) 会删除这些值。 rescale_none 让他们独自一人。其他人 (rescale_*) 以各种方式修改这些值。例如,rescale_max 会将所有超出范围的值设置为轴的最大值。
    【解决方案2】:

    一个更好的文档,也许更直观的解决方案是简单地使用coord_cartesian

    ggplot(df.m, aes(group=1,disciplines,value,colour=variable,shape=variable)) +
             geom_point() +
             geom_smooth(stat="smooth", method=loess, level=0.95) +
             scale_x_discrete(name="Disciplines") +
             coord_cartesian(ylim = c(-1,1))
    

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 1970-01-01
      • 2016-01-10
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多