[R] date in plot, can't add regression line

John Kane jrkrideau at inbox.com
Tue Aug 28 20:05:35 CEST 2012


First of all, a practical way to supply data is to use the function dput()

Just do dput(mydata) and copy and paste the results into your email.  The reader can copy and paste into R and have an identical data set.

I am not sure I have followed exactly what you are doing but here is something that may approach what you want, done using the ggp;pt2 package.  Do 'install.packages("ggplot2) if you do not have it.

Anyway here is roughly your data set in the dput format

mydata  <-  structure(list(tradeflavor = c(1L, 2L, 1L, 1L, 1L, 2L, 16L, 1L, 
16L, 1L, 1L, 16L, 1L, 4L, 8L, 1L, 8L, 16L, 1L, 8L, 16L, 1L, 4L, 
8L, 16L, 1L, 2L, 4L, 8L, 1L, 4L, 8L, 16L, 1L, 2L, 4L, 8L, 16L, 
1L, 2L), timestamp = structure(c(14266, 14266, 14267, 14271, 
14272, 14272, 14272, 14273, 14273, 14274, 14277, 14277, 14278, 
14278, 14278, 14279, 14279, 14279, 14280, 14280, 14280, 14281, 
14281, 14281, 14281, 14284, 14284, 14284, 14284, 14285, 14285, 
14285, 14285, 14286, 14286, 14286, 14286, 14286, 14287, 14287
), class = "Date"), x = c(1L, 1L, 1L, 54L, 105L, 2L, 2L, 71L, 
2L, 42L, 19L, 2L, 36L, 2L, 3L, 73L, 12L, 7L, 53L, 6L, 9L, 38L, 
6L, 2L, 3L, 42L, 2L, 1L, 2L, 87L, 2L, 4L, 3L, 55L, 6L, 4L, 2L, 
8L, 153L, 6L)), .Names = c("tradeflavor", "timestamp", "x"), row.names = c(NA, 
-40L), class = "data.frame")

#=====================================
library(ggplot2)

# first subset

m1data  <-  subset(mydata, tradeflavor == 1)

# plot for tradeflavor = 1
p1   <-  ggplot(m1data , aes( timestamp, x)) + geom_point()   +
           geom_smooth(method = lm, se = FALSE)
p1

m2data  <-  subset(mydata, tradeflavor == 2)

p2   <-  ggplot(m2data , aes( timestamp, x )) + geom_point()   +
           geom_smooth(method = lm, se = FALSE)
p2

# plot a grid of results
pgrid  <-  p   <-  ggplot(mydata , aes( timestamp, x)) + geom_point()   +
           geom_smooth(method = lm, se = FALSE) + facet_grid(tradeflavor ~ .)
pgrid

# Have fun with R.




John Kane
Kingston ON Canada


> -----Original Message-----
> From: norbert.skalski at ronin-capital.com
> Sent: Tue, 28 Aug 2012 11:48:32 -0500
> To: r-help at r-project.org
> Subject: [R] date in plot, can't add regression line
> 
> Hello all,
> 
> I have been using R for about 3 weeks and I am frustrated by a problem.
> I have read R in a nutshell, scoured the internet for help but I either
> am not understanding examples or am missing something completely basic.
> Here is the problem:
> 
> I want to plot data that contains dates on the x axis.  Then I want to
> fit a line to the data.  I have been unable to do it.
> 
> This is an example of the data (in a dataframe called
> "tradeflavorbyday"), 40 lines of it (I'm sorry it's not in a runnable
> form, not sure how to get that from R) :
>      tradeflavor  timestamp   x
> 1              1 2009-01-22   1
> 2              2 2009-01-22   1
> 3              1 2009-01-23   1
> 4              1 2009-01-27  54
> 5              1 2009-01-28 105
> 6              2 2009-01-28   2
> 7             16 2009-01-28   2
> 8              1 2009-01-29  71
> 9             16 2009-01-29   2
> 10             1 2009-01-30  42
> 11             1 2009-02-02  19
> 12            16 2009-02-02   2
> 13             1 2009-02-03  36
> 14             4 2009-02-03   2
> 15             8 2009-02-03   3
> 16             1 2009-02-04  73
> 17             8 2009-02-04  12
> 18            16 2009-02-04   7
> 19             1 2009-02-05  53
> 20             8 2009-02-05   6
> 21            16 2009-02-05   9
> 22             1 2009-02-06  38
> 23             4 2009-02-06   6
> 24             8 2009-02-06   2
> 25            16 2009-02-06   3
> 26             1 2009-02-09  42
> 27             2 2009-02-09   2
> 28             4 2009-02-09   1
> 29             8 2009-02-09   2
> 30             1 2009-02-10  87
> 31             4 2009-02-10   2
> 32             8 2009-02-10   4
> 33            16 2009-02-10   3
> 34             1 2009-02-11  55
> 35             2 2009-02-11   6
> 36             4 2009-02-11   4
> 37             8 2009-02-11   2
> 38            16 2009-02-11   8
> 39             1 2009-02-12 153
> 40             2 2009-02-12   6
> 
> 
> The plot displays the x column as the yaxis and the date as the x axis,
> grouped by the tradetype column.
> The timestamp column:
>> class(tradeflavorbyday$timestamp)
> [1] "POSIXlt" "POSIXt"
> 
> So in this case I want to plot tradetype 1 (method 1):
> 
> xdates <- tradeflavorbyday$timestamp[tradeflavorbyday$tradeflavor == 1]
> ydata <- tradeflavorbyday$x[tradeflavorbyday$tradeflavor == 1]
> 
> plot(xdates, ydata, col="black", xlab="Dates", ylab="Count")
> 
> Up to here it works great.
> 
> Now a abline through lm:
> 
> xylm <- lm(ydata~xdates)   <------ this fails, can't do dates as below
> abline(xylm, col="black")
> 
>> lm(ydata~xdates)
> Error in model.frame.default(formula = ydata ~ xdates, drop.unused.levels
> = TRUE) :
>   invalid type (list) for variable 'xdates'
> 
> 
> 
> So I try this instead (method 2):
> xdata <- 1:length(tradeflavorbyday$timestamp[tradeflavorbyday$tradeflavor
> == 1])
> ydata <- tradeflavorbyday$x[tradeflavorbyday$tradeflavor == 1]
> 
> xylm <- lm(ydata~xdata)   <------ now this works, great
> abline(xylm, col="black")
> 
> The problem now is that I can't get the dates onto the xaxis.  I have
> tried turning off the axis using xaxt="n" and reploting using the
> axis.POSIXct() call but it does not want to display the dates:
> 
> dateseq = seq(xdates[1], xdates[length(xdates)], by="month")
> axis.POSIXct(1, at=dateseq, format="%Y\n%b")
> 
> 
> 
> 
> I have tried combining both approaches by plotting dates and trying to
> fit the line using method 2:
> xdates <- tradeflavorbyday$timestamp[tradeflavorbyday$tradeflavor == 1]
> xdata <- 1:length(tradeflavorbyday$timestamp[tradeflavorbyday$tradeflavor
> == 1])
> ydata <- tradeflavorbyday$x[tradeflavorbyday$tradeflavor == 1]
> 
> plot(xdates, ydata, col="black", xlab="Dates", ylab="Count", xaxt="n")
> dateseq = seq(xdates[1], xdates[length(xdates)], by="month")
> axis.POSIXct(1, at=dateseq, format="%Y\n%b")
> 
> xylm <- lm(ydata~xdata)  <- works
> abline(xylm, col="black")  <- does nothing
> 
> In this case the call to lm and abline "works" but nothing is drawn.
> Confused I plugged in the coefficients manually (I have complete data, so
> they will be different than the example data I pasted):
> 
>> lm(ydata~xdata)
> 
> Call:
> lm(formula = ydata ~ xdata)
> 
> Coefficients:
> (Intercept)        xdata
>     6.11491     -0.02577
> 
> Abline(6.11491, -0.02577)  <- call worked, but nothing shown
> 
> Just by chance I added many 0 to flatten out the slope:
> 
> Abline(6.11491, -0. 0000000002577)  <- call worked and a horizontal line
> appeared?????
> 
> So I took off a 0:
> 
> Abline(6.11491, -0. 000000002577)  <- the line moved significantly down
> 
> So I took off another 0:
> 
> Abline(6.11491, -0. 00000002577)   <- line disappeared
> 
> I guess the slope causes it to go vertical and disappear of the graph.
> 
> I have no idea how to solve my issue.  If anyone can see my basic idiotic
> error please point it out, or maybe you have another suggestion, I will
> gladly try it.
> 
> Thanks for your help!!
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

____________________________________________________________
GET FREE SMILEYS FOR YOUR IM & EMAIL - Learn more at http://www.inbox.com/smileys
Works with AIM®, MSN® Messenger, Yahoo!® Messenger, ICQ®, Google Talk™ and most webmails




More information about the R-help mailing list