plotando dois vetores de dados em um gráfico de dispersão GGPLOT2 usando r
Pergunta
Eu tenho experimentado ambos ggplot2
e lattice
para gráficos de painéis de dados. Estou tendo um pouco de problema em envolver minha mente em torno do ggplot2
modelo. Em particular, como faço para traçar um gráfico de dispersão com dois conjuntos de dados em cada painel:
dentro lattice
Eu poderia fazer isso:
xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd)
E isso me daria um painel para cada estado_cd com cada coluna
Eu posso fazer uma coluna com ggplot2
:
pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2)
+ facet_wrap(~ State_CD) + opts(aspect.ratio = 1)
print(pg)
O que não consigo entender é como adicionar real_value ao ggplot acima.
EDITAR Hadley apontou que isso realmente seria mais fácil com um exemplo reproduzível. Aqui está o código que parece funcionar. Existe uma maneira melhor ou mais concisa de fazer isso com GGPlot? Por que a sintaxe é adicionar outro conjunto de pontos ao GGPlot tão diferente de adicionar o primeiro conjunto de dados?
library(lattice)
library(ggplot2)
#make some example data
dd<-data.frame(matrix(rnorm(108),36,3),c(rep("A",24),rep("B",24),rep("C",24)))
colnames(dd) <- c("Predicted_value", "Actual_value", "x_value", "State_CD")
#plot with lattice
xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd)
#plot with ggplot
pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2) + facet_wrap(~ State_CD) + opts(aspect.ratio = 1)
print(pg)
pg + geom_point(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green")
A saída da treliça se parece com a seguinte:
(fonte: cerebralmastication.com)
E ggplot se parece com o seguinte:
(fonte: cerebralmastication.com)
Solução
Apenas acompanhando o que Ian sugeriu: Para GGPlot2, você realmente deseja todo o material do eixo y em uma coluna com outra coluna como um fator indicando como deseja decorá-lo. É fácil fazer isso com melt
. A saber:
qplot(x_value, value,
data = melt(dd, measure.vars=c("Predicted_value", "Actual_value")),
colour=variable) + facet_wrap(~State_CD)
Aqui está o que parece para mim:
(fonte: Princeton.edu)
Para ter uma idéia do que melt
está realmente fazendo, aqui está a cabeça:
> head(melt(dd, measure.vars=c("Predicted_value", "Actual_value")))
x_value State_CD variable value
1 1.2898779 A Predicted_value 1.0913712
2 0.1077710 A Predicted_value -2.2337188
3 -0.9430190 A Predicted_value 1.1409515
4 0.3698614 A Predicted_value -1.8260033
5 -0.3949606 A Predicted_value -0.3102753
6 -0.1275037 A Predicted_value -1.2945864
Veja bem, ele "derrete" previsto_value e real_value em uma coluna chamada value
e adiciona outra coluna chamada variable
Deixando você saber de qual coluna originalmente veio.
Outras dicas
Atualizar: Vários anos em agora, quase sempre uso o método de Jonathan (através do pacote Tidyr) com GGPlot2. Minha resposta abaixo funciona em uma pitada, mas fica tediosa quando você tem mais de 3 variáveis.
Tenho certeza de que Hadley terá uma resposta melhor, mas - a sintaxe é diferente porque o ggplot(dd,aes())
A sintaxe é (eu acho) destinada principalmente a plotar apenas uma variável. Para dois, eu usaria:
ggplot() +
geom_point(data=dd, aes(x_value, Actual_value, group=State_CD), colour="green") +
geom_point(data=dd, aes(x_value, Predicted_value, group=State_CD), shape = 2) +
facet_wrap(~ State_CD) +
theme(aspect.ratio = 1)
Puxar o primeiro conjunto de pontos do ggplot () fornece a mesma sintaxe que a segunda. Acho isso mais fácil de lidar porque a sintaxe é a mesma e enfatiza a "gramática dos gráficos" que está no centro do GGPlot2.
Você pode apenas alterar um pouco a forma de seus dados, para ter uma variável de eixo y, com uma variável de fator adicional indicando se é uma variável prevista ou real.
Isso é algo como o que você está tentando fazer?
dd<-data.frame(type=rep(c("Predicted_value","Actual_value"),20),y_value=rnorm(40),
x_value=rnorm(40),State_CD=rnorm(40)>0)
qplot(x_value,y_value,data=dd,colour=type,facets=.~State_CD)
bem depois de postar a pergunta que encontrei Este tópico de ajuda Isso pode ter me ajudado. Parece que posso fazer isso:
pg + geom_line(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green")
Essa é uma boa maneira de fazer as coisas? É estranho para mim, porque adicionar o segundo item tem uma sintaxe totalmente diferente do primeiro.