在 R 中的函数内使用 geom_vline 绘图时面临“参数不是数字或逻辑”的问题

疯狂的

我正面临一个挑战,我似乎无法弄清楚(也在搜索 www 之后)。

给定一个数据框:

diabetes <- data.frame(Age = c(20,23,45,77), Diabetes = c('no', 'no', 'yes', 'yes'))

$ Age      <dbl> 20, 23, 45, 77
$ Diabetes <fct> no, no, yes, yes

我正在尝试绘制两种糖尿病结果的密度曲线,并在平均值处包括垂直线。

plot_numeric <- function(dataset, predictor, outcome){
  p1 <- dataset %>% ggplot(aes_string(x = predictor)) + 
                    geom_density(fill = 'gray', alpha = 0.5) +
                    theme_fivethirtyeight()
  
  p2 <- dataset %>% ggplot(aes_string(x = predictor, fill = outcome)) +
                    geom_density(alpha = 0.5) +
                    scale_fill_manual(values = c('#999999', '#E69F00')) +
                    geom_vline(aes_string(xintercept = mean(predictor[outcome == 'no'])), color = '999999') +
                    geom_vline(aes_string(xintercept = mean(predictor[outcome == 'yes'])), color = '#E69F00') +
                    theme_fivethirtyeight()
  
  gridExtra::grid.arrange(p1,p2)
}

plot_numeric(diabetes, 'Age', 'Diabetes')

我收到错误“参数不是数字或逻辑:返回 NA”并且不包括平均值的垂直线。

在函数外进行绘图时,一切正常。

关于如何解决这个问题的任何想法,非常感谢。

特恩布兰德

aes_string()不再推荐函数,而是鼓励人们按照小插图使用整洁的评估语法

在您的情况下,mean(predictor[outcome == 'no']))尝试计算由长度为 1 的predictor字符划分的长度为 1 的字符的平均值outcome

修复 的缺点aes_string(),可以使用大括号。

library(ggplot2)
library(magrittr)

diabetes <- data.frame(Age = c(20,23,45,77), Diabetes = c('no', 'no', 'yes', 'yes'))

plot_numeric <- function(dataset, predictor, outcome){
  p1 <- dataset %>% ggplot(aes(x = {{predictor}})) + 
    geom_density(fill = 'gray', alpha = 0.5)
  
  p2 <- dataset %>% ggplot(aes(x = {{predictor}}, fill = {{outcome}})) +
    geom_density(alpha = 0.5) +
    scale_fill_manual(values = c('#999999', '#E69F00')) +
    geom_vline(
      aes(xintercept = mean({{predictor}}[{{outcome}} == 'no'])), 
      color = '999999'
      ) +
    geom_vline(
      aes(xintercept = mean({{predictor}}[{{outcome}} == 'yes'])), 
      color = '#E69F00'
    )
  
  gridExtra::grid.arrange(p1,p2)
}

plot_numeric(diabetes, Age, Diabetes)

reprex 包(v2.0.1)于 2021 年 9 月 21 日创建

或者,如果您想将列名作为字符串,可以使用.data代词:

library(ggplot2)
library(magrittr)

diabetes <- data.frame(Age = c(20,23,45,77), Diabetes = c('no', 'no', 'yes', 'yes'))

plot_numeric <- function(dataset, predictor, outcome){
  p1 <- dataset %>% ggplot(aes(x = .data[[predictor]])) + 
    geom_density(fill = 'gray', alpha = 0.5)
  
  p2 <- dataset %>% ggplot(aes(x = .data[[predictor]], fill = .data[[outcome]])) +
    geom_density(alpha = 0.5) +
    scale_fill_manual(values = c('#999999', '#E69F00')) +
    geom_vline(
      aes(xintercept = mean(.data[[predictor]][.data[[outcome]] == 'no'])), 
      color = '999999'
      ) +
    geom_vline(
      aes(xintercept = mean(.data[[predictor]][.data[[outcome]] == 'yes'])), 
      color = '#E69F00'
    )
  
  gridExtra::grid.arrange(p1,p2)
}

plot_numeric(diabetes, "Age", "Diabetes")

reprex 包(v2.0.1)于 2021 年 9 月 21 日创建

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在R中的geom_vline中删除/更改标签?

R-图例中的geom_vline和geom_smooth组合

如何在气泡图中的ggplot 2中为geom_vline和geom_hline提供背景

设置geom_vline的线型?

R:geom_vline标签上的上标

ggplot中的geom_vline和facet_wrap错误

如何在R中的不同方面产生不同的geom_vline?

更改facet_grid中的构面标签并同时添加geom_vline时发生错误

使用因子变量和geom_hline / geom_vline进行构面

使用函数均值[R]时出现“参数不是数字或逻辑:返回NA”错误

删除图例中由ggplot中的geom_vline引起的垂直线

R上的geom_vline无法在ggplot图上添加垂直线

当数据为POSIXct时,ggplotly()不显示geom_vline / geom_hline

R ggplot2 :: geom_vline图例未正确显示线型

geom_vline + geom_text:垂直旋转标签时对齐标签

将geom_vline扩展到绘图之外

尝试映射geom_vline的值,但未使用R中的ggplot在x轴上的正确位置绘制

如何在ggplot中向geom_vline添加文本

如何在同一散点图上使用geom_vline()和geom_hline避免图例中的交叉效果?

ggplot2中带有图例的geom_vline中的线型不正确

如何将geom_vline与字符串x-xis一起使用

在ggplot中使用geom_vline()复制图例

使用xintercept来自矢量而不是ggplot数据的函数添加geom_vline

使用 ggplot2 中的 aes 映射设置 geom_vline 线类型和大小

带有几个标记的 geom_vline() 的密度图作为 ggplot 中的平均值

使用 geom_vline 的图例 ggplot

如何使用帶有 geom_vline 和 facet_wrap 的循環?

如何在 geom_vline 中添加图例?

根据组调整ggplot中geom_vline的颜色