用R中的因子绘制函数

用R中的因子绘制函数,r,plot,plyr,R,Plot,Plyr,我想从一个数据帧中逐因子调用绘图,这样对于每个因子(或因子组合)形成一个单独的绘图,包含所有相关行 我可以使用matplot和plyr包的组合,以这种方式调用常规绘图。然而,我现在需要绘制函数,这些函数的系数是从数据帧调用的 一个简化的工作示例包含两个因子和三个系数。实际数据集很大,每个因子的行数也不同 df <- data.frame(fac_1 = c('A', 'A', 'B', 'B', 'B', 'C', 'C'), fac_2 = c('X', 'X'

我想从一个数据帧中逐因子调用绘图,这样对于每个因子(或因子组合)形成一个单独的绘图,包含所有相关行

我可以使用
matplot
plyr
包的组合,以这种方式调用常规绘图。然而,我现在需要绘制函数,这些函数的系数是从数据帧调用的

一个简化的工作示例包含两个因子和三个系数。实际数据集很大,每个因子的行数也不同

df <- data.frame(fac_1 = c('A', 'A', 'B', 'B', 'B', 'C', 'C'),
             fac_2 = c('X', 'X', 'Y', 'X', 'X', 'Z', 'Y'), 
             param_1 = c(1, 2, 5, 3, 6, 1, 6),
             param_2 = c(3, 6, 6, 4, 5, 3, 4),
             param_3 = c(7, 8, 2, 6, 2, 6, 1))
恐怕我很难知道接下来该怎么办。我知道
add=T
参数可用于覆盖多条
曲线,但我还不知道如何在本例中使用该参数

最后,我意识到我可以“手动”绘制每条曲线(即通过输入一系列精细的x值将函数应用于每一行,然后绘制y与x),但我希望有更好的替代方案


非常感谢您的帮助和指导。

我可以提供一个ggplot2的答案,但不确定您是否想继续使用您提到的软件包

对于ggplot2中的facets功能来说,这听起来是个不错的情况。我会尝试:

ggplot(dataframe, aes(x = x_var, y = y_var)) + 
  geom_smooth() +
  facet_grid(. ~ factor1)
您还可以使用facet_wrap以不同的方式排列因子图

请参阅此处的更多信息:

基本图 如果您想继续使用基本绘图,请执行以下操作:

curve_fct <- function(p1, p2, p3) {
  continue <- FALSE
  for (i in seq_along(p1)) {
    curve(p1[i] + p2[i] * x + p3[i] * x^2,
          from = 0,
          to = 5,
          type = "l",
          add = continue)
    continue = TRUE
  }
}

library(data.table)
setDT(df)[, curve_fct(param_1, param_2, param_3), keyby = .(fac_1, fac_2)]
ggplot2
同样,您可以使用
ggplot2
创建许多图形。请注意包
polynom
的使用,这是一个额外的改进

library(polynom)
library(ggplot2)

curve_fct_gg <- function(p1, p2, p3) {
  gg <- ggplot(data.frame(x = c(0, 5)), aes(x))
  for (i in seq_along(p1)) {
    # define polynomial function to be plotted
    p <- as.function(polynomial(c(p1[i], p2[i], p3[i])))
    gg <- gg + stat_function(fun = p)
  }
  print(gg)
  return(length(p1)) # to avoid empty data.table
}
setDT(df)[, curve_fct_gg(param_1, param_2, param_3), keyby = .(fac_1, fac_2)]
库(polynom)
图书馆(GG2)

curve_fct_gg不同的方法继承了Mustafa的想法,即将
ggplot2
与刻面结合使用

这需要在打印之前预计算所有曲线的y值:

library(data.table)
library(polynom)
np <- 10 # number of points to plot curves
x <- seq(from = 0, to = 5, length.out = np)
plot_data <- setDT(df)[
  , param_set := seq_len(.N), keyby = .(fac_1, fac_2)][
    , .(x, y = as.function(polynomial(c(param_1, param_2, param_3)))(x)),
    keyby = .(fac_1, fac_2, param_set)]

也许这是一种有趣的方法,但不适用于OP示例。我相信问题在于如何用
df
中给出的每个因子组合的参数绘制多条曲线,而不是参数本身。感谢@Uwe提供了一个创造性的解决方案,这正是我所希望的。勾选这个作为答案,因为它仍然保留在基本图中。我还可以问一下——有没有一种方法可以用它相应的因子来标记每个图(例如粘贴到“text”或“main”中)?在这种情况下,“fac_1”和“fac_2”是否可以未列出并粘贴?我添加了一个标题,用于打印传递给plot函数的文本。我更喜欢使用
sprintf
而不是
paste
来创建基于因子的文本,因为我发现它更容易编码和阅读。
curve_fct2 <- function(txt, p1, p2, p3) {
  continue <- FALSE
  for (i in seq_along(p1)) {
    curve(p1[i] + p2[i] * x + p3[i] * x^2,
           from = 0,
           to = 5,
           type = "l",
           add = continue)
    continue = TRUE
  }
  title(main = txt)
  return(length(p1))
}
library(data.table)
setDT(df)[, curve_fct2(sprintf("Factors: %s, %s", fac_1, fac_2), 
                       param_1, param_2, param_3), 
          keyby = .(fac_1, fac_2)]
library(polynom)
library(ggplot2)

curve_fct_gg <- function(p1, p2, p3) {
  gg <- ggplot(data.frame(x = c(0, 5)), aes(x))
  for (i in seq_along(p1)) {
    # define polynomial function to be plotted
    p <- as.function(polynomial(c(p1[i], p2[i], p3[i])))
    gg <- gg + stat_function(fun = p)
  }
  print(gg)
  return(length(p1)) # to avoid empty data.table
}
setDT(df)[, curve_fct_gg(param_1, param_2, param_3), keyby = .(fac_1, fac_2)]
library(data.table)
library(polynom)
np <- 10 # number of points to plot curves
x <- seq(from = 0, to = 5, length.out = np)
plot_data <- setDT(df)[
  , param_set := seq_len(.N), keyby = .(fac_1, fac_2)][
    , .(x, y = as.function(polynomial(c(param_1, param_2, param_3)))(x)),
    keyby = .(fac_1, fac_2, param_set)]
library(ggplot2)
gg <- ggplot(plot_data, aes(x = x, y = y, group = param_set, colour = factor(param_set))) +
  geom_line() 
gg + facet_grid(fac_1 ~ fac_2)
gg + facet_wrap(~ fac_1 + fac_2)