按R中的因子绘制函数

时间:2016-06-05 07:19:04

标签: r plot plyr

我想通过因子来调用数据框中的图,这样,对于每个因子(或因子的组合),会形成一个单独的图,包含所有相关的行。

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

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

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))

示例函数(注意这是特定于第1行)

curve_func <- function(x, y = 1) {
    df$param_1[y] +
    df$param_2[y] * x +
    df$param_3[y] * x^2
}

调用单个curve剧情

curve(expr = curve_func,
      from = 0,
      to = 5,
      type = "l")

我害怕我在努力想知道从哪里开始。我了解add = T参数可用于覆盖多个curves,但我还不知道如何在此实例中使用它。

最后,我意识到我可以手动&#39;绘制每条曲线(即通过输入 x - 值的精细序列,然后matplot y x )将函数应用于每一行,但我希望有更好的选择吗?

非常感谢任何帮助或指导。

3 个答案:

答案 0 :(得分:2)

基础图

如果你想留在基础情节,这个

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)]

将为fac_1fac_2的每个组合创建一个图表,其曲线与每个组合的参数集一样多。

编辑:带注释的基本图

您还可以在情节标题中显示因素:

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)]

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)]

答案 1 :(得分:0)

我可以提供一个ggplot2答案,但不确定你是否想留在你提到的软件包中。

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

ggplot(dataframe, aes(x = x_var, y = y_var)) + 
  geom_smooth() +
  facet_grid(. ~ factor1)

您还可以使用facet_wrap以不同方式排列因子图。

在此处查看更多内容:http://www.cookbook-r.com/Graphs/Facets_(ggplot2)/

答案 2 :(得分:0)

采用不同方法挑选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)]

使用

完成绘图
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)

创建:

enter image description here

或更紧凑:

gg + facet_wrap(~ fac_1 + fac_2)

enter image description here