PSQ
PSQ

Reputation: 11

set axis breaks in R with POSIX time

I have two line graphs created from this dataset https://www.dropbox.com/s/77epslia52odt7m/undervotes_new.csv

They are graphs of cumulative votes based on what type of ballot was cast. I wanted to use ggplot facets to create the cumulative vote graphs based on type of ballot cast. But that royally screwed up a la this problem which I could not figure out how to fix: Why `cumsum` doesn't work within groups or facets in ggplot?

So, my work around is just to plot them separately and combine with gridarrange. But the axis differ in their breakpoints. I know they can be set manually, but I am having trouble doing this because they are in POSIX format?

How can I set the breaks (and ideally the range) on both graphs to be "Nov 06, Nov 07, Nov 08", etc etc. on both graphs?

Thanks,

library(reshape2)
library(ggplot2)
library(gridExtra)
library(grid)

#transform some variables
Data$Net<-as.numeric(as.character(Data$Net))
Data$CreateDate<-strptime(as.character(Data$CreateDate), "%m/%d/%Y %H:%M")
Data$CreateDate<-as.POSIXlt(Data$CreateDate)

#Get rid of nasty NAs
Data<-Data[complete.cases(Data[,c(15)]),]

##Subset by candidate
Datasubobama<-Data[Data$BallotName=="Barack Obama",]
Datasubromney<-Data[Data$BallotName=="Mitt Romney",]

##Order by date
Datasubobama<-Datasubobama[order(Datasubobama$CreateDate),] #order by date
Datasubromney<-Datasubromney[order(Datasubromney$CreateDate),] #order by date

##Get rid of outliers
Datasubobama<-Datasubobama[1:380,]
Datasubromney<-Datasubromney[1:345,]

##Subset into types of votes
DatasubobamaC<-Datasubobama[Datasubobama$ResultsType=="Certified Votes",]
DatasubobamaP<-Datasubobama[Datasubobama$ResultsType=="Provisional Votes Counted",]
DatasubromneyC<-Datasubromney[Datasubromney$ResultsType=="Certified Votes",]
DatasubromneyP<-Datasubromney[Datasubromney$ResultsType=="Provisional Votes Counted",]

####This is obama/romney certified votes only
cumsumC<-ggplot(DatasubobamaC, aes(x=as.POSIXlt(DatasubobamaC$CreateDate),  y=cumsum(DatasubobamaC$Net)))
cumsumC<-cumsumC+geom_line(color="blue")
cumsumC<-cumsumC+geom_point(color="black")
cumsumC<-cumsumC+geom_line(data=DatasubromneyC, color="red",     aes(x=as.POSIXlt(DatasubromneyC$CreateDate), y=cumsum(DatasubromneyC$Net)))
cumsumC<-cumsumC+geom_point(data=DatasubromneyC,color="black",     aes(x=as.POSIXlt(DatasubromneyC$CreateDate), y=cumsum(DatasubromneyC$Net)))
cumsumC<-cumsumC+ggtitle("Obama (Blue) and Romney (Red) Cumulative Sum [Certified]")
cumsumC<-cumsumC+xlab("Date")
cumsumC<-cumsumC+ylab("Net Votes")
cumsumC<-cumsumC+theme(strip.text.y = element_text(size = 20, color="black"))
cumsumC<-cumsumC+theme(plot.title=element_text(size=20))
cumsumC<-cumsumC+theme(axis.title.x = element_text(size=20))
cumsumC<-cumsumC+theme(axis.title.y = element_text(size=20, vjust=1.5,))
cumsumC<-cumsumC+theme(axis.text.x=element_text(size=15))
cumsumC<-cumsumC+theme(axis.text.y=element_text(size=15))
cumsumC<-cumsumC+theme(axis.ticks.margin=unit(c(.05,.05),'cm'))
cumsumC<-cumsumC+theme(plot.margin=unit(c(.3,1,.3,1),"cm"))
cumsumC

#This is the same for Provisional Only
cumsumP<-ggplot(DatasubobamaP, aes(x=as.POSIXlt(DatasubobamaP$CreateDate),     y=cumsum(DatasubobamaP$Net)))
cumsumP<-cumsumP+geom_line(color="blue")
cumsumP<-cumsumP+geom_point(color="black")
cumsumP<-cumsumP+geom_line(data=DatasubromneyP, color="red",      aes(x=as.POSIXlt(DatasubromneyP$CreateDate), y=cumsum(DatasubromneyP$Net)))
cumsumP<-cumsumP+geom_point(data=DatasubromneyP,color="black",         aes(x=as.POSIXlt(DatasubromneyP$CreateDate), y=cumsum(DatasubromneyP$Net)))
cumsumP<-cumsumP+ggtitle("Obama (Blue) and Romney (Red) Cumulative Sum [Provisional]")
cumsumP<-cumsumP+xlab("Date")
cumsumP<-cumsumP+ylab("Net Votes")
cumsumP<-cumsumP+theme(strip.text.y = element_text(size = 20, color="black"))
cumsumP<-cumsumP+theme(plot.title=element_text(size=20))
cumsumP<-cumsumP+theme(axis.title.x = element_text(size=20))
cumsumP<-cumsumP+theme(axis.title.y = element_text(size=20, vjust=1.5,))
cumsumP<-cumsumP+theme(axis.text.x=element_text(size=15))
cumsumP<-cumsumP+theme(axis.text.y=element_text(size=15))
cumsumP<-cumsumP+theme(axis.ticks.margin=unit(c(.05,.05),'cm'))
cumsumP<-cumsumP+theme(plot.margin=unit(c(.3,1,.3,1),"cm"))
cumsumP

gridcumsum<-grid.arrange(cumsumC,cumsumP)

Upvotes: 0

Views: 643

Answers (1)

PSQ
PSQ

Reputation: 11

Guess what, I found an answer for you: You want to be using

scale_x_datetime

http://docs.ggplot2.org/0.9.3.1/scale_datetime.html

It's super neat and does exactly what you want. But I know you are new to R, so it's ok. Good luck!

Thanks and great job finding this.

Upvotes: 1

Related Questions