我正在尝试使用以下代码编写多个图:
plot(cyl ~., c('mpg', 'gear', 'carb'), data=mtcars)
换句话说,通过按“ enter”或“ return”键,R将循环显示三个图,其中“ cyl”为因变量,“ mpg”为独立变量,然后“ cyl”为独立变量, “齿轮”是独立的,等等。
感谢您提供的任何建设性帮助。
答案 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.formula
将cyl ~ x
转换为cyl ~ mpg
(对于每次迭代); ~ .
将原始公式的RHS上的所有内容都放到该点中,因此它最初创建了cyl ~ x - x + mpg
,幸运的是R知道可以优化类似组件,因此简化为cyl ~ mpg
; capture.output(formula0)
只是为SA印刷精美的东西plot(formula0, ..., data = data)
...由于我使用了三个点,因此您传递给myplot
的不是fake
或iterate
之一的其他任何参数都将传递给{ {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。