Time display in hours with xy to r scatter plot

I would like to create the following type of plot. But I don’t know if any package exists, because I could not find it. Data:

myd <- data.frame (X = 1:5, Y = c(0.8, 0.6, 0.7, 0.75, 0.1), clockd = c(12.05, 12.25, 12.45, 1.30, 2.1)) 

clockd - time 12.05 - 12 hours in minutes. I do not know a suitable unit for entering time in R.

 plot (myd$X, myd$Y) 

Edit: The red and green hands represent the hourly and minimum positions of the watch levers in the watch. enter image description here

+7
source share
4 answers
 clockplot<-function(x, y, h, m, r, border="black", col="lightblue", col.hour="darkblue", col.min="red"){ #x and y are the coordinates of the clock #h and m the hour (base 12) and minutes # r the radius of the clock t<-seq(0,2*pi,by=0.01) xc<-r*cos(t)+x yc<-r*sin(t)+y th<-pi/2 - 2*pi*(hm/60)/12 xh<-0.5*r*cos(th)+x yh<-0.5*r*sin(th)+y tm<-pi/2 - 2*pi*m/60 xm<-r*cos(tm)+x ym<-r*sin(tm)+y polygon(xc,yc,col=col, border=border) segments(x,y,xh,yh,col=col.hour) segments(x,y,xm,ym,col=col.min) } myd <- data.frame (X = 1:5, Y = c(0.8, 0.6, 0.7, 0.75, 0.1), clockd = c(12.05, 12.25, 12.45, 1.30, 2.1)) myd$hour<-myd$clockd%/%1 myd$min<-myd$clockd%%1 *100 plot(myd$X, myd$Y, type="l", asp=1) apply(myd,1,function(x)clockplot(x[1],x[2],x[4],x[5], r=0.25)) 

enter image description here

+6
source

I use the sentence from @GregSnow here with my.symbols function from the TeachingDemo package. Thus, you can do this with a small (ish) piece of code, but you can have quite a lot of control over graphic parameters, such as the size and filling of the clock circles, the type of hands, the way the plot is set, etc. To calculate the location of the arrows, I changed the @agstudy code so that it would extract the minutes correctly.

 myd <- data.frame (X = 1:5, Y = c(0.8, 0.6, 0.7, 0.75, 0.1), clockd = c(12.05, 12.25, 12.45, 1.30, 2.1)) hour <- round(myd$clockd)#takes hours by ignoring decimals minute <- 100*(myd$clockd - trunc(myd$clockd,2))#takes decimals #for getting the angle I'm subtracting from pi/2 #thats because pi/2 orients the arrow into 0 degree position, pointing up hourAngle <- pi/2 - (hour/12*2*pi) minuteAngle <- pi/2 - (minute/60*2*pi) #now all the plotting plot(myd$X, myd$Y, type="l", xaxt="n", xlab="", ylab="", xlim=c(0.5,5.5), ylim=c(0,1), col="gray")#standard plot, no x axis axis(1, at=myd$X, labels=myd$X)#custom x-axis require(TeachingDemo) my.symbols(myd$X, myd$Y, ms.arrows, angle=hourAngle, add=T, col="blue", symb.plots=TRUE, adj=0) my.symbols(myd$X, myd$Y, ms.arrows, angle=minuteAngle, add=T, col="red", symb.plots=TRUE, adj=0) my.symbols(myd$X, myd$Y, ms.polygon, n=250, add=T, r=1.1, col="gray") 

enter image description here

+5
source

enter image description here

Providing your data:

 read.table(text = 'col1 col2 0012 0001245',head=T,colClasses=c('character','numeric')) myd <- data.frame (X = 1:5, Y = c(0.8, 0.6, 0.7, 0.75, 0.1), clockd = c(12.05, 12.25, 12.45, 1.30, 2.1)) 

Using a grid + grid, we can do something like this:

 library(lattice) library(grid) xyplot(Y~X,data=myd, panel=function(x,y,...) { panel.fill(col='yellow') panel.lines(x,y) h_min <- do.call(rbind,strsplit(as.character(myd$clockd),'[.]')) hours <- as.numeric(h_min[,1]) minutes <- as.numeric(h_min[,2]) lapply(seq_along(x), function(i)drawClock(x[i],y[i],hour = hours[i], minute = minutes[i])) }) 

Where drawClock is taken from this and trsnformed to the need for this question:

 drawClock <- function(x0,y0,hour, minute) { t <- seq(0, 2*pi, length=13)[-13] x <- cos(t) y <- sin(t) # Circle with ticks grid.circle(x=x0, y=y0, default="native", r=unit(0.4,'in'),gp=gpar(fill='blue',alpha=0.5)) # grid.segments(x, y, x*.9, y*.9, default="native") # Hour hand hourAngle <- pi/2 - (hour + minute/60)/12*2*pi grid.segments(x0, y0, x0+.06*cos(hourAngle), y0+.06*sin(hourAngle), default="native", gp=gpar(lex=4)) # Minute hand minuteAngle <- pi/2 - (minute)/60*2*pi grid.segments(x0, y0, x0+.08*cos(minuteAngle), y0+.08*sin(minuteAngle), default="native", gp=gpar(lex=2)) } 
+4
source

Take a look at the my.symbols function in the TeachingDemos package for tools to help you create this type of plot.

+2
source

All Articles