【问题标题】:ggplot2 plot function with several arguments具有多个参数的 ggplot2 绘图函数
【发布时间】:2018-08-19 23:54:30
【问题描述】:

我得到了这个功能。

change <- function(score, d, k, p) {k*(score - 1/(1+k^(d/p)))}

我想在一个单独的图中绘制此函数针对一系列参数 d 和 p 的所有结果。在基础 r 中,它会是这样的。

parameters <- c(100:400)
colorshelf <-rainbow(length(parameters)) #red is low
for(i in seq_along(parameters)) {
    print(i)
    curve(change(score=1, d=x, k=100, p=parameters[i]), from=0, to=500, add=T, col=colorshelf[i])
}

但我认为这在 ggplot2 中一定是可能的,但我无法理解这一点。我目前坚持这一点。任何帮助表示赞赏。

ggp <- ggplot(data.frame(Ds=c(0:1000), Ps=c(0:1000)), aes(x=Ds, col=Ps)) + 
    stat_function(fun=change, args=list(score=1, d=Ds, k=100, p=Ps))
ggp

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    我会在ggplot2 之外执行此操作。我认为期望ggplot 对两个不同的参数进行矢量化可能太过分了...

    这是使用 tidyverse,但也可以使用 apply 轻松完成。

     library(dplyr)
     change <- function(score, d, k, p) {k*(score - 1/(1+k^(d/p)))}
     dd <- expand.grid(d=0:1000,p=0:100)
     dd %>% rowwise %>%
         mutate(c=change(score=1,d=d,k=100,p=p)) ->
      dd2
    
     library(ggplot2)
     ggp <- ggplot(dd2,aes(d,c,col=p,group=p))+
                geom_path()
    

    我只做了p从0到100(而不是0到1000),因为100万个点对于ggplot来说是一个相当大的数据集。 (您真的需要查看 1000 个单独的值吗?也许是 seq(0,1000,length=100)

    【讨论】:

    • 使用mutate(obs=1:n()) %&gt;% group_by(obs)和使用rowwise()有区别吗?
    【解决方案2】:

    刚才,我遇到了一个非常相似的问题;我想在 ggplot 中绘制一个函数,其中多个参数按行存储在数据框中。由于我不需要为我的代码的其余部分中的每个数据点评估函数的数据框,我让 ggplot 为我做肮脏的工作。 但是,我的方法在应用中排序数据帧的位置知识方面存在次要缺点(这不应该是您的问题)。我还需要一个颜色列(这里:“组”),在我的情况下,这实际上是分组所需的。并且自从您的参数不平衡后,您将不得不 expand.grid 参数

    我想出的解决方案的骨架基本如下:

    p = ggplot(data.frame(x = c(-5, 10)), aes(x)) 
    # this format specifies start & end of the x-axis for which the function is evaluated. 
    d = data.frame(mu = 1:4, sigma= c(1,1,2,2), group = c(1,1,2,2))
    # each row is a parameter set.
    p = p + apply(
      d,
      MARGIN = 1,
      FUN = function(z)
        stat_function(
          fun = dnorm, # you can specify your own function which lives in .GlobalEnvir
          geom = "line",
          args = list(mean = z[1] , sd = z[2]),
          color = z[3]
        )
    )
    print(p)
    

    但是,如果您有一组非标准化的参数(例如,有时您没有 mean 或 sd 的值,并且希望在传递 args 时完全忽略它们),那么使用 lapply 的更灵活的方法可能是另一种选择。 请注意,如果您想使用函数的默认值,例如dnorm,您不需要指定特定参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2020-08-29
      • 1970-01-01
      相关资源
      最近更新 更多