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

StackOverflow https://stackoverflow.com/questions/2063821

  •  20-09-2019
  •  | 
  •  

Вопрос

Я запускаю моделирование методом монте-Карло, и результат имеет вид:

> 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()

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top