Posso evitar o uso de quadros de dados no GGPlot2?
Pergunta
Estou executando uma simulação de Monte-Carlo e a saída está no formulário:
> 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
As parcelas que quero gerar são:
plot(d$iter, d$k1)
plot(density(d$k1))
Eu sei como fazer gráficos equivalentes usando GGPlot2, convertem em quadro de dados
new_d = data.frame(iter=rep(d$iter, 2),
k = c(d$k1, d$k2),
label = rep(c('k1', 'k2'), each=2))
Então a plotagem é fácil. No entanto, o número de iterações pode ser muito grande e o número de K's também pode ser grande. Isso significa mexer com um quadro de dados muito grande.
Existe alguma maneira de evitar criar esse novo quadro de dados?
Obrigado
Solução
A resposta curta é "não", você não pode evitar criar um quadro de dados. ggplot
Requer que os dados estejam em um quadro de dados. Se você usar qplot
, você pode fornecer vetores separados para x e y, mas internamente, ainda está criando um quadro de dados a partir dos parâmetros que você passa.
Eu concordo com a sugestão de Juba - aprenda a usar o reshape
função, ou melhor ainda o reshape
pacote com melt
/cast
funções. Depois de se tornar rápido com a colocação de seus dados em formato longo, criando incrível ggplot
Os gráficos se tornam um passo mais perto!
Outras dicas
Sim, é possível evitar criar um quadro de dados: basta dar uma lista de argumentos vazia à camada base, ggplot()
. Aqui está um exemplo completo com base no seu código:
Biblioteca (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))
Observe que, embora isso permita vocês Para não criar um quadro de dados, um quadro de dados ainda pode ser criado internamente. Veja, por exemplo, o seguinte extrato de ?geom_point
:
Todos os objetos serão fortificados para produzir um quadro de dados.
Você pode usar o reshape
função para transformar seu quadro de dados em formato "longo". Pode ser que seja um pouco mais rápido que o seu código?
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
Então, apenas para adicionar às respostas anteriores. Com qplot você poderia fazer
p <- qplot(y=d$k2, x=d$k1)
E então a partir daí, construindo ainda mais, por exemplo, com
p + theme_bw()
Mas eu concordo - derreter/elenco é generosamente o caminho a seguir.