JD Long - 2 years ago 142
R Question

# plotting two vectors of data on a GGPLOT2 scatter plot using R

I've been experimenting with both

`ggplot2`
and
`lattice`
to graph panels of data. I'm having a little trouble wrapping my mind around the
`ggplot2`
model. In particular, how do I plot a scatter plot with two sets of data on each panel:

in
`lattice`
I could do this:

``````xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd)
``````

and that would give me a panel for each State_CD with each column

I can do one column with
`ggplot2`
:

``````pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2)
+ facet_wrap(~ State_CD) + opts(aspect.ratio = 1)
print(pg)
``````

What I can't grok is how to add Actual_value to the ggplot above.

EDIT Hadley pointed out that this really would be easier with a reproducible example. Here's code that seems to work. Is there a better or more concise way to do this with ggplot? Why is the syntax for adding another set of points to ggplot so different from adding the first set of data?

``````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")
``````

The lattice output looks like this:

and ggplot looks like this:

Just following up on what Ian suggested: for ggplot2 you really want all the y-axis stuff in one column with another column as a factor indicating how you want to decorate it. It is easy to do this with `melt`. To wit:

``````qplot(x_value, value,
data = melt(dd, measure.vars=c("Predicted_value", "Actual_value")),
colour=variable) + facet_wrap(~State_CD)
``````

Here's what it looks like for me:

To get an idea of what `melt` is actually doing, here's the head:

``````> 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
``````

You see, it "melts" Predicted_value and Actual_value into one column called `value` and adds another column called `variable` letting you know what column it originally came from.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download