使用 ggplot 遍历列并相应地修改 geom_hline(yintercept)

Posted

技术标签:

【中文标题】使用 ggplot 遍历列并相应地修改 geom_hline(yintercept)【英文标题】:Looping through columns with ggplot and modyfing geom_hline(yintercept) accordingly 【发布时间】:2016-12-24 04:57:42 【问题描述】:

这是一个直接涉及该主题的增量问题:

How do I loop through column names and make a ggplot scatteplot for each one

我想遍历列名并为每个列创建一个 ggplot 散点图,但我想每次添加一条横线,其截距取决于列中的值。

所以我采用该代码:

Y <- rnorm(100)
df <- data.frame(A = rnorm(100), B = runif(100), C = rlnorm(100),
                 Y = Y)
colNames <- names(df)[1:3]
for(i in colNames)
  plt <- ggplot(df, aes_string(x=i, y = Y)) +
    geom_point(color="#B20000", size=4, alpha=0.5) +
    geom_hline(yintercept=0, size=0.06, color="black") + 
    geom_smooth(method=lm, alpha=0.25, color="black", fill="black")
  print(plt)
  Sys.sleep(2)

我用 x 切换 y

aes_string(x=Y, y = i))

我想修改那行

geom_hline(yintercept=0, size=0.06, color="black")

...所以 yintercept 不是常数,而是取决于 i, 例如:

geom_hline(yintercept=c(quantile(i, 0.25)))

所以 yintercept 始终是我的专栏的第一个四分位数。

但是,它不起作用:

(1 - h) * qs[i] 中的错误: 二元运算符的非数字参数

我尝试了不同的选项,例如 aes_string、paste() 等 但这些都不起作用。

但是,它不起作用: (1 - h) * qs[i] 中的错误: 二元运算符的非数字参数

我尝试了不同的选项,例如 aes_string、paste() 等 但这些都不起作用。

【问题讨论】:

试试quantile(df[,i], 0.25) 【参考方案1】:

您应该调用quantile(df[,i], 0.25) 而不是quantile(i, 0.25),它应该可以工作,您的代码将是:

for(i in colNames)
  plt <- ggplot(df, aes_string(x=Y, y = i)) +
    geom_point(color="#B20000", size=4, alpha=0.5) +
    geom_hline(yintercept=c(quantile(df[,i], 0.25)))+
    geom_smooth(method=lm, alpha=0.25, color="black", fill="black")
  print(plt)
  Sys.sleep(2)

【讨论】:

如果你想用这个值减去 1.5 IQR(然后计算 1.5*IQR-q25)你的公式应该是c( 1.5*IQR(df[,i])-quantile(df[,i], 0.25))。在你的代码中你做了相反的事情,你忘记了一个括号: quantile(df[,i], 0.25 ) - 1.5*IQR(df[,i])

以上是关于使用 ggplot 遍历列并相应地修改 geom_hline(yintercept)的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2 - 修改 geom_density2d 以接受权重作为参数?

Geom_point 和 ggboxplot 以及 ggpair 在 ggplot 中错误地匹配了所有绘图点

如何从 ggplot2::geom_density_2d_filled 获取有关轮廓的信息?

如何将十六进制代码传递给ggplot中的geom_hline?

在ggplot的一个方面内按组分隔geom_linerange

ggplot2 geom_line 的两个不同图例