Подтвердить что ты не робот

Всегда ли я должен использовать фреймы данных в ggplot2

Я запускаю симуляцию monte-carlo, и результат получается в форме:

> d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4))
> d
iter  k1   k2
1     0.2  0.3
2     0.6  0.4

Графики, которые я хочу создать:

plot(d$iter, d$k1)
plot(density(d$k1))

Я знаю, как делать эквивалентные графики, используя ggplot2, конвертировать в фрейм данных

new_d = data.frame(iter=rep(d$iter, 2), 
                   k = c(d$k1, d$k2), 
                   label = rep(c('k1', 'k2'), each=2))

то построение легко. Однако число итераций может быть очень большим, а число k также может быть большим. Это означает, что вы используете очень большой фрейм данных.

В любом случае я могу избежать создания этого нового фрейма данных?

Спасибо

4b9b3361

Ответ 1

Короткий ответ "нет", вы не можете избежать создания фрейма данных. ggplot требует, чтобы данные находились в кадре данных. Если вы используете qplot, вы можете дать ему отдельные векторы для x и y, но внутренне они все равно создают кадр данных из параметров, которые вы передаете.

Я согласен с предложением juba - научитесь использовать функцию reshape или еще лучше пакет reshape с функциями melt/cast. Как только вы быстро поместите свои данные в длинный формат, создание удивительных графиков ggplot станет на один шаг ближе!

Ответ 2

Вы можете использовать функцию reshape, чтобы преобразовать ваш фрейм данных в "длинный" формат. Может быть, это немного быстрее, чем ваш код?

R> reshape(d, direction="long",varying=list(c("k1","k2")),v.names="k",times=c("k1","k2"))
     iter time   k id
1.k1    1   k1 0.2  1
2.k1    2   k1 0.6  2
1.k2    1   k2 0.3  1
2.k2    2   k2 0.4  2

Ответ 3

Итак, просто добавьте к предыдущим ответам. С qplot вы могли бы сделать

p <- qplot(y=d$k2, x=d$k1)

а затем оттуда его дальнейшее строительство, например. с

p + theme_bw()

Но я согласен - расплав/литье - это генетически путь вперед.