Всегда ли я должен использовать фреймы данных в 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 также может быть большим. Это означает, что вы используете очень большой фрейм данных.
В любом случае я могу избежать создания этого нового фрейма данных?
Спасибо
Ответы
Ответ 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()
Но я согласен - расплав/литье - это генетически путь вперед.