【问题标题】:Plotting family of functions with qplot without duplicating data使用 qplot 绘制函数族而不复制数据
【发布时间】:2013-03-31 23:33:20
【问题描述】:

给定函数系列 f(x;q)x 是参数,q 是参数)我想对此进行可视化x 上的函数族取自区间 [0,1] 的 9 个 q 值(从 0.1 到 0.9)。到目前为止,我的解决方案是:

f = function(p,q=0.9) {1-(1-(p*q)^3)^1024}
x = seq(0.0,0.99,by=0.01)
q = seq(0.1,0.9,by=0.1)

qplot(rep(x,9), f(rep(x,9),rep(q,each=100)), colour=factor(rep(q,each=100)), 
      geom="line", size=I(0.9), xlab="x", ylab=expression("y=f(x)"))

我使用 qplot 获得快速而简单的视觉效果:

我担心的是这种方法会占用大量内存,因为我需要为每个参数复制 x 并为整个 x 范围复制每个参数值。在没有这些重复的情况下生成相同图表的替代方法是什么?

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    在某些时候 ggplot 需要有可用的数据来绘制它,并且包的工作方式禁止简单地做你想做的事。如果您知道 x 和 y 轴限制,我想您可以设置一个空白图,然后循环遍历 q 的 9 个值,为该 q 生成数据,并将 geom_line 图层添加到现有绘图对象。但是,您必须自己为每个图层生成颜色。

    如果这代表您遇到的问题的规模,我不会太担心内存占用。我们只讨论长度为 900 的两个向量

    > object.size(rnorm(900))
    7240 bytes
    

    x 范围内的 100 个值似乎足以绘制平滑图。

    for 循环添加层到 ggplot

    require("ggplot2")
    
    ## something to replicate ggplot's colour palette, sure there is something
    ## to do this already in **ggplot** now...
    ggHueColours <- function(n, h = c(0, 360) + 15, l = 65, c = 100,
                             direction = 1, h.start = 0) {
        turn <- function(x, h.start, direction) {
            (x + h.start) %% 360 * direction
        }
    
        if ((diff(h) %% 360) < 1) {
          h[2] <- h[2] - 360 / n
        }
    
        hcl(h = turn(seq(h[1], h[2], length = n), h.start = h.start,
            direction = direction), c = c, l =  l)
    }
    
    f = function(p,q=0.9) {1-(1-(p*q)^3)^1024}
    x = seq(0.0,0.99,by=0.01)
    q = seq(0.1,0.9,by=0.1)
    cols <- ggHueColours(n = length(q))
    
    for(i in seq_along(q)) {
      df <- data.frame(y = f(x, q[i]), x = x)
      if(i == 1) {
        plt <- ggplot(df, aes(x = x, y = y)) + geom_line(colour = cols[i])
      } else {
        plt <- plt + geom_line(data = df, colour = cols[i])
      }
    }
    
    plt
    

    给出:

    剩下的交给你 - 我对 ggplot 不够熟悉,无法手动绘制图例。

    【讨论】:

    • 循环解决方案是我正在寻找的替代方案,谢谢!
    • @topchef 真的吗?你在绘制什么尺寸的物体?循环解决方案很讨厌 - 为什么要通过强制额外层和手动控制颜色来复制 Hadley 放入 ggplot 的糖?我不知道,但您还必须自己生成图例。
    • 你能用 ggplot 添加简单的循环解决方案吗? (无需详细复制情节)
    • 我可以添加一个简单的例子 - 如果它没有产生图例等,那么你必须自己解决这个问题,或者希望其他人加入,或者问一个后续问题(作为一个单独的)在那个特定的细节上。
    • 我明白了。在我看到它之前,我没有发现循环解决方案令人讨厌。我的函数示例非常简化。我发现复制数据也很讨厌。我正在研究循环解决方案,但由于我对 ggplot 的经验非常有限,所以无法做到。但是 ggplot 支持图层并且它们很好地符合循环方法。
    猜你喜欢
    • 2021-04-21
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多