我想通过因子来调用数据框中的图,这样,对于每个因子(或因子的组合),会形成一个单独的图,包含所有相关的行。
我可以使用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))
示例函数(注意这是特定于第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 )将函数应用于每一行,但我希望有更好的选择吗?
非常感谢任何帮助或指导。
答案 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_1
和fac_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)
创建:
或更紧凑:
gg + facet_wrap(~ fac_1 + fac_2)