ggplot2 R中的因子数据未绘制计算误差线

qgelzfjb  于 2023-05-11  发布在  其他
关注(0)|答案(1)|浏览(114)

I am trying to plot error bars for factor data as shown in this reproducible example here. This example just runs fine。然而,我对原始数据集尝试了同样的操作,但错误条拒绝绘图。我有点迷路了。以下是相关的代码片段,并尽可能地重复。知道为什么我不能让错误条工作吗?
DataFrame df有两列:yaxis.og和物种(4种)像这样:

yaxis.og species
      <dbl> <fct>  
 1   2.56   A      
 2   3.81   B      
 3   1.48   C      
 4   1.65   D      
 5  -0.177  A  
      .....

我计算了一个简单的线性模型,并将结果存储为:

summary_df <- summary(mod)$coefficients %>% 
  as_tibble() %>% 
  dplyr::mutate(species = c("A","B","C","D")) %>%
  dplyr::rename(yaxis = Estimate) %>%
  mutate(ymin = yaxis - 1.96 * `Std. Error`,
         ymax = yaxis + 1.96 * `Std. Error`)

yaxis `Std. Error`    df `t value` `Pr(>|t|)` species  ymin  ymax
  <dbl>        <dbl> <dbl>     <dbl>      <dbl> <chr>   <dbl> <dbl>
1 0.611        0.145  61.2      4.22   8.21e- 5 A       0.327 0.895
2 2.16         0.160  78.0     13.5    3.93e-22 B       1.85  2.47 
3 1.21         0.153  68.7      7.92   2.84e-11 C       0.912 1.51 
4 2.21         0.223 162.       9.89   2.43e-18 D       1.77  2.64

当我在没有错误条的情况下绘制它时,它绘制得很好:

p <- ggplot(aes(x = species, y = yaxis.og, color = species, group = species), data = df) + 
geom_jitter(width = 0.1)  +
geom_point(aes(x = species, y = yaxis), color = 'black', size = 2, data = summary_df)

当我添加errorbars时,它会抛出一个巨大的错误。这个错误也没有多大意义,因为最后一层使用了不同的数据集,那么为什么需要yaxis.og呢?

p + geom_errorbar(aes(x = species, ymin = ymin, ymax = ymax), data = summary_df)

Error in `geom_errorbar()`:
! Problem while computing aesthetics.
ℹ Error occurred in the 3rd layer.
Caused by error in `FUN()`:
! object 'yaxis.og' not found
Backtrace:
  1. base (local) `<fn>`(x)
  2. ggplot2:::print.ggplot(x)
  4. ggplot2:::ggplot_build.ggplot(x)
  5. ggplot2:::by_layer(...)
 12. ggplot2 (local) f(l = layers[[i]], d = data[[i]])
 13. l$compute_aesthetics(d, plot)
 14. ggplot2 (local) compute_aesthetics(..., self = self)
 15. base::lapply(aesthetics, eval_tidy, data = data, env = env)
 16. rlang (local) FUN(X[[i]], ...)
7ajki6be

7ajki6be1#

问题是ggplot()中定义的所有aes都是全局美学,即使不使用,也会被所有geom层继承。因此,ggplot2期望名称为yaxis.og的列出现在每个geom层使用的数据中,除非您像这样覆盖全局aes。在geom_point中。
解决这个问题的一个选择是将inherit.aes=FALSE添加到geom_errorbar,这可以防止全局aes被继承,或者通过使用aes(..., y = NULL)覆盖全局aes。
使用一些基于iris的假示例数据:

library(ggplot2)

p +
  geom_errorbar(
    aes(x = species, ymin = ymin, ymax = ymax, y = NULL),
    data = summary_df
  )

p +
  geom_errorbar(
    aes(x = species, ymin = ymin, ymax = ymax),
    data = summary_df, inherit.aes = FALSE
  )

资料

set.seed(123)

df <- data.frame(
  yaxis.og = c(iris$Sepal.Length, sample(iris$Sepal.Length, 50)),
  species = rep(c("A", "B", "C", "D"), each = 50)
)

mod <- lm(yaxis.og ~ species - 1, data = df)

相关问题