【问题标题】:Use of the tilde, ~, and the dot in creating multiple plots [closed]在创建多个图时使用波浪号、~ 和点 [关闭]
【发布时间】:2018-11-16 19:18:32
【问题描述】:

我正在尝试使用以下代码组成多个图:

plot(cyl ~., c('mpg', 'gear', 'carb'), data=mtcars)

换句话说,通过按“输入”或“返回”键,R 将循环显示三个图,其中“cyl”为因变量,“mpg”为独立变量,然后“cyl”为独立变量, '齿轮'作为独立等。

感谢您提供的任何建设性帮助。

【问题讨论】:

  • 可以通过单击左右箭头或按快捷键组合(Ctrl+Alt+F11 或 +F12)在 Rstudio 的“绘图”选项卡中查看绘图。这还不够吗?
  • 对于那些因“不清楚你在问什么”而投票结束的人,我认为这里是错误的。我认为情节流的描述很好。有人可以争辩说 OP 没有尝试任何努力,但这与“不清楚”不同,unclear 关闭投票确实应该(imo)伴随着澄清请求。

标签: r plot rstudio


【解决方案1】:

我不知道有一个自动函数可以循环遍历这样的图。 (有统计图默认循环通过它们,例如plot.lm,但这些不是默认/规范。)

您可以手动遍历它们。这是一种允许大部分plot.formula 的方法,同时给您一点控制权。前期:

  • 新参数iterate = c(...) 列出了您要迭代的字段;
  • 新参数fakevar = "x",这是您应该放置在原始公式中的变量,它将在每次迭代时被替换;如果您的数据中包含x,则将此值更改为变量名称的character
  • 您仍然可以在原始公式中使用.,但这意味着它的含义:数据中的所有其他变量。
  • 我使用locator(1) 允许“点击情节继续”机制;我敢肯定还有其他的,这个很简单(而且很容易更换)。

代码:

myplot <- function(formula, ..., iterate, fakevar = "x",
                   verbose = TRUE, continuefunc = locator(1)) {
  continuefunc <- substitute(continuefunc)
  for (nm in iterate) {
    formula0 <- update.formula(formula,
                               as.formula(paste("~ . -", fakevar, "+", nm)))
    if (verbose) message(capture.output(formula0))
    plot(formula0, ...)
    eval(continuefunc)
  }
}

myplot(cyl ~ x, data=mtcars, iterate=c("mpg", "gear", "carb"))
# cyl ~ mpg
# cyl ~ gear
# cyl ~ carb

部分说明:

  • substitute(...) 存储表达式的“调用”或预期调用;有了这个,我们就可以毫无问题地重复调用该函数(尝试不使用此行,看看会发生什么,有多个 iterate 变量)
  • update.formula 转换:cyl ~ xcyl ~ mpg(对于每次迭代); ~ . 将原始公式的 RHS 上的所有内容放入该点,因此它最初创建 cyl ~ x - x + mpg,幸运的是 R 知道优化类似组件,这减少到 cyl ~ mpg
  • capture.output(formula0) 只是打印漂亮的东西,对于 SA
  • plot(formula0, ..., data = data) ... 因为我使用三个点,所以您传递给myplot 的任何其他参数不是fakeiterate 之一将传递给plot;例如,main="quux", pch=16;在扩展已经很棒的功能时,这是一个经常被遗忘的技巧:尽可能少地做,把剩下的交给已知的,否则会很好用

由于continuefunc,您可以选择:

  • 仅控制台继续,带有myplot(..., continuefunc=readline('hello!'))
  • dump all without pause, 例如报告 (knitr/rmarkdown): myplot(..., verbose=FALSE, continuefunc=0) (0 or 1 or 912 or c or TRUE all work good, it's the lack-of-pause这很重要)
  • 屏幕显示:myplot(..., continuefunc=Sys.sleep(3))

【讨论】:

  • 这是一个非常好的深入答案。我学到了新东西!
【解决方案2】:

这是一个使用 plotly 的解决方案:

library("plotly")
library("data.table")

mtCarsDT <- melt.data.table(data.table(mtcars), "cyl", c('mpg', 'gear', 'carb'))

plot_ly(mtCarsDT,
        x = ~cyl,
        y = ~value,
        frame = ~variable,
        type = 'scatter',
        mode = 'markers',
        showlegend = F
)

另见this

【讨论】:

    猜你喜欢
    • 2020-10-10
    • 2014-01-19
    • 1970-01-01
    • 2011-09-09
    • 2020-05-08
    • 1970-01-01
    • 2021-09-15
    • 2019-07-07
    • 2019-10-30
    相关资源
    最近更新 更多