波浪号,〜和点在创建多个绘图中的使用

时间:2018-11-16 19:18:33

标签: r plot rstudio

我正在尝试使用以下代码编写多个图:

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

换句话说,通过按“ enter”或“ return”键,R将循环显示三个图,其中“ cyl”为因变量,“ mpg”为独立变量,然后“ cyl”为独立变量, “齿轮”是独立的,等等。

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

2 个答案:

答案 0 :(得分:4)

我不知道自动功能会像这样 循环显示。 (有些统计图默认不循环显示,例如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.formulacyl ~ x转换为cyl ~ mpg(对于每次迭代); ~ .将原始公式的RHS上的所有内容都放到该点中,因此它最初创建了cyl ~ x - x + mpg,幸运的是R知道可以优化类似组件,因此简化为cyl ~ mpg;
  • capture.output(formula0)只是为SA印刷精美的东西
  • plot(formula0, ..., data = data) ...由于我使用了三个点,因此您传递给myplot的不是fakeiterate之一的其他任何参数都将传递给{ {1}};例如plot;在扩展已经非常强大的功能的功能时,这是一个经常被遗忘的技巧:只需完成所需的工作,然后将其余的工作传递给已知可以正常使用的功能

由于main="quux", pch=16,您可以选择:

  • 仅控制台连续,带有continuefunc
  • 不停转储所有内容,例如报告(myplot(..., continuefunc=readline('hello!')) / knitr):rmarkdown(0或1或912或myplot(..., verbose=FALSE, continuefunc=0)c都可以工作很好,重要的是缺乏暂停)
  • 屏幕显示:TRUE

答案 1 :(得分:1)

以下是使用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