I would like to create the following type of plot. But do not know if there is any package already exists, as I could not find one. 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 are time 12.05 is 12 Oclock past minutes. I do not know appropriate unit to enter time in R.
plot (myd$X, myd$Y)
Edit: The red and green arrow represents the hour and minitue position of clock arms in a clock.
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)
x.c<-r*cos(t)+x
y.c<-r*sin(t)+y
t.h<-pi/2 - 2*pi*(h-m/60)/12
x.h<-0.5*r*cos(t.h)+x
y.h<-0.5*r*sin(t.h)+y
t.m<-pi/2 - 2*pi*m/60
x.m<-r*cos(t.m)+x
y.m<-r*sin(t.m)+y
polygon(x.c,y.c,col=col, border=border)
segments(x,y,x.h,y.h,col=col.hour)
segments(x,y,x.m,y.m,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))
I'm using suggestion by @GregSnow here with my.symbols
function from TeachingDemo
package. This way you can do it with a small(ish) chunk of code but you can have quite big control over the graphical parametrs like size and fill of clock circles, look of arrows, the way you customize your plot, etc. For calculating location of arrows I modified @agstudy code so that it extracts 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")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With