2013-02-13 41 views
7

Tôi muốn tạo loại ô sau đây. Nhưng không biết nếu có bất kỳ gói đã tồn tại, như tôi không thể tìm thấy một. Dữ liệu:hiển thị thời gian theo đồng hồ với ô phân tán xy trong r

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 là thời gian 12,05 là 12 giờ trong quá khứ. Tôi không biết đơn vị thích hợp để nhập thời gian trong R.

plot (myd$X, myd$Y) 

Edit: Các mũi tên màu đỏ và xanh lá cây tượng trưng cho giờ và vị trí chút thời của cánh tay đồng hồ trong một chiếc đồng hồ. enter image description here

+1

lẽ bạn có thể giải thích những gì theo chiều dài của mũi tên được cho là đại diện. Tôi đoán X và Y đại diện cho vị trí của đồng hồ trong cốt truyện của bạn? – plannapus

+0

Có lẽ bạn có thể điều chỉnh đoạn mã này? http://stackoverflow.com/questions/11877379/how-to-draw-clock-in-r –

+0

@plannapus X và Y là vị trí của đồng hồ trong trường trong khi mũi tên biểu thị cánh tay giờ và phút của đồng hồ – rdorlearn

Trả lời

6
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)) 

enter image description here

4

enter image description here

Giving dữ liệu của bạn:

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)) 

Sử dụng lưới + lưới chúng ta có thể làm somethink như thế này:

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])) 


     }) 

đâu drawClock được thông qua từ this và trsnformed đến cần câu hỏi này:

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))  
} 
2

Nhìn vào my.symbols chức năng trong gói TeachingDemos cho các công cụ để giúp tạo kiểu này cốt truyện.

5

Tôi đang sử dụng đề xuất của @GregSnow tại đây với chức năng my.symbols từ gói TeachingDemo. Bằng cách này bạn có thể làm điều đó với một đoạn mã nhỏ (ish) nhưng bạn có thể kiểm soát khá lớn các parametrs đồ họa như kích thước và điền vào các vòng tròn đồng hồ, nhìn mũi tên, cách bạn tùy chỉnh cốt truyện của bạn, vv mũi tên tôi đã sửa đổi mã @agstudy để nó trích xuất số phút chính xác.

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

Các vấn đề liên quan