7

次のようなプロットを作成したいと思います。しかし、パッケージが見つからなかったので、すでにパッケージが存在するかどうかはわかりません。データ:

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

計時時間12.05は12分過ぎです。Rに時間を入力するのに適切な単位がわかりません。

plot (myd$X, myd$Y)

編集: 赤と緑の矢印は、時計の時計アームの時間と最小位置を表します。 ここに画像の説明を入力してください

4

4 に答える 4

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

ここに画像の説明を入力してください

于 2013-02-13T14:34:52.663 に答える
5

ここでは、@GregSnowによる提案とパッケージのmy.symbols関数を使用しています。TeachingDemoこのようにして、小さな(っぽい)コードのチャンクでそれを行うことができますが、時計の円のサイズと塗りつぶし、矢印の外観、プロットのカスタマイズ方法などのグラフィカルパラメータを非常に大きく制御できます。場所の計算用矢印の数分を正しく抽出するように@agstudyコードを変更しました。

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

ここに画像の説明を入力してください

于 2013-02-14T15:58:07.010 に答える
4

ここに画像の説明を入力してください

データを提供する:

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

ラティス+グリッドを使用すると、次のように考えることができます。

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


       })

drawClockがこれから採用され、この 質問の必要性に応じて変換される場合:

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))    
}
于 2013-02-13T14:33:17.643 に答える
2

my.symbolsこのタイプのプロットの作成に役立つツールについては、TeachingDemosパッケージの関数を参照してください。

于 2013-02-14T05:48:15.657 に答える