2

関数ファミリf(x;q) ( xは引数、qはパラメータ) が与えられた場合、 qの 9 つの値(0.1 から 0.9 まで)の間隔[0,1]からxでこの関数ファミリを視覚化したいと思います。 . これまでのところ、私の解決策は次のとおりです。

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 範囲全体の各パラメーター値を複製する必要があるため、このメソッドはかなりメモリを消費することです。これらの重複なしに同じグラフを作成する別の方法は何ですか?

4

1 に答える 1

1

ある時点で、ggplotはそれをプロットするためにデータを利用できるようにする必要があり、パッケージが機能する方法では、単にやりたいことを行うことはできません。x 軸と y 軸の範囲がわかっている場合は空白のプロットを設定し、 の 9 つの値をループして、qその のデータを生成し、既存のプロット オブジェクトにレイヤーをq追加できると思います。geom_lineただし、各レイヤーの色は自分で作成する必要があります。

これが問題のサイズを表しているのであれば、メモリ フットプリントについてあまり心配する必要はありません。長さ 900 の 2 つのベクトルについて話しているだけです。

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

の範囲にわたる 100 個の値はx、滑らかなプロットを作成するのに十分なようです。

forggplotにレイヤーを追加するためのループ

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に精通していません。

于 2013-03-31T14:07:13.017 に答える