Могу ли я избежать использования фреймов данных в ggplot2?
Вопрос
Я запускаю моделирование методом монте-Карло, и результат имеет вид:
> 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 также может быть большим.Это означает возиться с очень большим фреймом данных.
Могу ли я в любом случае избежать создания этого нового фрейма данных?
Спасибо
Решение
Короткий ответ - "нет", вы не можете избежать создания фрейма данных. ggplot
требует, чтобы данные находились во фрейме данных.Если вы используете qplot
, вы можете задать ему отдельные векторы для x и y, но внутренне он по-прежнему создает фрейм данных из переданных вами параметров.
Я согласен с предложением джубы - научиться использовать reshape
функция, или, что еще лучше, reshape
пакет с melt
/cast
функции.Как только вы научитесь быстро переводить свои данные в длинный формат, создавая потрясающие ggplot
графики становятся на шаг ближе!
Другие советы
Да, вы можете избежать создания фрейма данных:просто предоставьте базовому слою пустой список аргументов, ggplot()
.Вот полный пример, основанный на вашем коде:
библиотека (ggplot2)
d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4))
# desired plots:
# plot(d$iter, d$k1)
# plot(density(d$k1))
ggplot() + geom_point(aes(x = d$iter, y = d$k1))
# there is not enough data for a good density plot,
# but this is how you would do it:
ggplot() + geom_density(aes(d$k1))
Обратите внимание, что, хотя это позволяет ты чтобы не создавать фрейм данных, фрейм данных все равно может быть создан внутренне.Смотрите, например, следующую выдержку из ?geom_point
:
Все объекты будут укреплены для создания фрейма данных.
Вы можете использовать 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
Так что просто добавлю к предыдущим ответам.С помощью qplot вы могли бы сделать
p <- qplot(y=d$k2, x=d$k1)
а затем оттуда строить его дальше, напримерс
p + theme_bw()
Но я согласен - расплавление / отливка - это, в общем, путь вперед.