r - 使用 ggplot2 绘制多条曲线

标签 r plot ggplot2

假设我有一个数据框 coefs,其中每一行都包含一条曲线的模型系数。

coefs <- structure(list(a1 = c(1.22228259789383, 1.2064168157394, 1.09555089661994, 0.943947433470916, 0.883490658557721, 0.46125552320107), d = c(0.385227755933488, 0.457271644919152, 0.340063262461958, 0.305629949064525, 0.42459163183877, 0.425710112988664), g = c(0, 0, 0, 0, 0, 0), u = c(1, 1, 1, 1, 1, 1)), .Names = c("a1", "d", "g", "u"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))

我想使用数据框的每一行根据定义的函数向图中添加一条新曲线:(您可以将其识别为 2PL 项目响应模型)

TWOPL <- function(x,a1,b) {
  1 / (1 + exp(-a1*(x-(b))))
}

基于 thisthis问题我尝试了以下 ggplot 命令,但得到了计算失败的错误:

library(ggplot2)
p <- ggplot(coefs, aes(x = 0))
p + stat_function(fun = TWOPL) + xlim(-5,5)

我知道我需要一种方法来为函数提供各种系数。作为测试,我尝试了使用固定参数的函数来创建 1 条曲线,它可以工作,例如:

#1 curve based on fixed parameters
TWOPL_copy <- function(x) {
  1 / (1 + exp(-1.22*(x-(.385))))
}

p <- ggplot(data.frame(x = 0), aes(x = 0))
p + stat_function(fun = TWOPL_copy) + xlim(-5,5)

我想知道如何将数据帧的每一行发送到 ggplot。理想的下一步是以某种方式区分每条线的颜色。

最佳答案

虽然您可以为每组参数调用 stat_function 或以编程方式调用它,但自己进行计算更简单:

library(tidyverse)

coefs %>% 
    mutate(curve = letters[row_number()]) %>%    # add curve name
    crossing(x = seq(-5, 5, .1)) %>%    # repeat each row for every occurence of x
    mutate(y = TWOPL(x, a1, d)) %>%    # compute y values
    ggplot(aes(x, y, color = curve)) + 
    geom_line()

以编程方式创建曲线的最简单方法是将 stat_function 调用列表添加到绘图中。所有美学都必须迭代,包括颜色。必须提供 x 美学,但如果您设置 xlim,它是什么都没关系。

curves <- coefs %>% 
    mutate(curve = letters[row_number()]) %>% 
    pmap(function(...){
             dots <- data_frame(...)
             stat_function(data = dots, aes(0, color = curve), 
                           fun = function(x) TWOPL(x, dots$a1, dots$d), 
                           xlim = c(-5, 5))
    })

ggplot() + curves

关于r - 使用 ggplot2 绘制多条曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43132658/

相关文章:

r - 使用 ggplot 将线图绘制到散点图上

matlab - 具有 2 个变量的函数曲线下的阴影面积

plot - 带背景颜色的盒装标签

r - 使用带有分类变量的 geom_rect 的 ggplot 图表的阴影背景

r - 合并r中具有相同行名的2个数据帧

r - 将自定义斜率和截距添加到 R 中的 geom_smooth

matlab - 如何在 MATLAB 中使用 ezplot?

r - eval(expr,envir,enclos)中的错误-矛盾?

r - ggplot 点图 : What is the proper use of geom_dotplot?

rownames_to_column 在 rowwise() 正确后不起作用