Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot and R: Two variables over time

Tags:

r

ggplot2

I'd like to know how to make it so that x and y, in the following example data set are plotted on the vertical axis for each element of frame in the horizontal axis. How do I do this with ggplot2?

x, y = variables, frame = YYYYMM

Example Data:

df <- structure(list(x = c(0.000892333625290767, 0.0161153931761482, 
0.0188150880795816, 0.0268699106638318, 0.018657330651898, 0.0101065034206662, 
0.00154410447630379), y = c(1.35172948829027, 0.59654026447333, 
0.685835030118683, 0.741545898152761, 1.09653338596292, 0.119448208345102, 
0.104092642854814), frame = c(200912, 201001, 201002, 201003, 
201004, 201005, 201006)), .Names = c("x", "y", "frame"), row.names = c("1", 
"2", "3", "4", "5", "6", "7"), class = "data.frame")

I've been able to get one plotted in a line, but it seems that it's not recognizing my frame as categorical (not that it is, nor do I know how to change it to such).

p <- ggplot(df, aes(x=frame, y=x))
p + geom_line()
like image 633
Brandon Bertelsen Avatar asked Aug 06 '10 20:08

Brandon Bertelsen


People also ask

What does %>% do in ggplot?

%>% is a pipe operator reexported from the magrittr package. Start by reading the vignette. Adding things to a ggplot changes the object that gets created. The print method of ggplot draws an appropriate plot depending upon the contents of the variable.

What does Geom_point () do in R?

The function geom_point() adds a layer of points to your plot, which creates a scatterplot. ggplot2 comes with many geom functions that each add a different type of layer to a plot.

Can you use two datasets in ggplot?

This example explains how to draw a ggplot2 plot based on two different data sources. For this, we have to set the data argument within the ggplot function to be equal to NULL, and then we have to specify the two different data frames within two different calls of a geom_ function (in this case geom_point).


2 Answers

You need to melt your data:

library(reshape2)
dfm = melt(df, id.vars='frame')
ggplot(dfm, aes(x=frame, y=value, colour=variable)) + geom_line()

This is what that does to your data frame:

> dfm
    frame variable        value
1  200912        x 0.0008923336
2  201001        x 0.0161153932
3  201002        x 0.0188150881
4  201003        x 0.0268699107
5  201004        x 0.0186573307
6  201005        x 0.0101065034
7  201006        x 0.0015441045
8  200912        y 1.3517294883
9  201001        y 0.5965402645
10 201002        y 0.6858350301
11 201003        y 0.7415458982
12 201004        y 1.0965333860
13 201005        y 0.1194482083
14 201006        y 0.1040926429
like image 194
zwol Avatar answered Oct 25 '22 18:10

zwol


This is a rather late answer, but if you want your frame variable intepreted date (month of the year), then convert it to a date.

You can then use scale_x_date and the scales package to format the x-axis

DF <- melt(df, id.vars = 'frame')
# note that I am arbitrarily setting each month to be the 15th 
# day of the month, to create a complete date 
DF$date <- as.Date(paste0(as.character(df$frame), '15'), '%Y%M%d')
library(scales)
ggplot(DF, aes(x =frame, y = value, colour = variable))  +  
 geom_line() + 
 scale_x_date('Month', labels = date_format('%b %Y'), breaks = date_breaks('2 months'))

enter image description here

like image 31
mnel Avatar answered Oct 25 '22 17:10

mnel