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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top