2012-08-09 52 views
1

我正在研究R並嘗試使用餅圖繪製時鐘。如何在R中繪製時鐘?

代碼:

pie(c(25,20,15,10,10,30), 
    labels = c(1,2,3,4,5,6,7,8,9,10,11,12), 
    col = rainbow(length(lbls)), clockwise = TRUE, init.angle = 90) 

但我需要所有12個標籤在那裏獨立的沒有在輸入段。

enter image description here

我如何能實現呢?

問候

+1

有一個在用於圖形的knitr手冊的時鐘:HTTP://雲.github.com/downloads/yihui/knitr/knitr-graphics.pdf(也是動畫,第4頁)。 – 2012-08-09 07:52:23

回答

12

保羅·馬雷爾在他的最後一本書(R graphics 2nd Edition)有繪圖使用gridgwidget一個互動時鐘一些代碼。

這裏是繪製簡單的非交互式的時鐘示例代碼:

require(grid) 

drawClock <- function(hour, minute) { 
    t <- seq(0, 2*pi, length=13)[-13] 
    x <- cos(t) 
    y <- sin(t) 

    grid.newpage() 
    pushViewport(dataViewport(x, y, gp=gpar(lwd=4))) 
    # Circle with ticks 
    grid.circle(x=0, y=0, default="native", 
       r=unit(1, "native")) 
    grid.segments(x, y, x*.9, y*.9, default="native") 
    # Hour hand 
    hourAngle <- pi/2 - (hour + minute/60)/12*2*pi 
    grid.segments(0, 0, 
        .6*cos(hourAngle), .6*sin(hourAngle), 
        default="native", gp=gpar(lex=4)) 
    # Minute hand 
    minuteAngle <- pi/2 - (minute)/60*2*pi 
    grid.segments(0, 0, 
        .8*cos(minuteAngle), .8*sin(minuteAngle), 
        default="native", gp=gpar(lex=2))  
    grid.circle(0, 0, default="native", r=unit(1, "mm"), 
       gp=gpar(fill="white")) 
} 

現在,你可以嘗試這樣的

drawClock(hour = 2, minute = 30) 

enter image description here

的完整代碼here

+0

我可以在時鐘內保留我的餅圖嗎? pie(c(25,20,15,10,10,30),順時針= TRUE,init.angle = 90)和數字外像10,20,30 ... 100%,而不是1-12。基本上我想繪製餅圖裏面的時鐘%。但網格沒有餅圖功能。 – Manish 2012-08-10 01:39:23

4

遇到同樣問題後,更新此主題。 如果你想保持你的派和時鐘在上面,你應該使用'GridBase'包。

實施例(使用dickoa的極好的解決方案作爲碼的基礎上):

require('grid') 
require('gridBase')  

pie(c(1,2), 
clockwise=TRUE, 
radius=1.0, 
init.angle=90, 
col=c('pink', 'lightblue'), 
border=NA) 

drawClock <- function(hour, minute) 
    { 
    t <- seq(0, 2*pi, length=13)[-13] 
    x <- cos(t) 
    y <- sin(t) 

    vps <- baseViewports() 
    pushViewport(vps$inner, vps$figure, vps$plot) 
    # ticks 

    grid.segments(x, y, x*.9, y*.9, default="native") 
    # Hour hand 
    hourAngle <- pi/2 - (hour + minute/60)/12*2*pi 
    grid.segments(0, 0, 
        .6*cos(hourAngle), .6*sin(hourAngle), 
        default="native", gp=gpar(lex=4)) 
    # Minute hand 
    minuteAngle <- pi/2 - (minute)/60*2*pi 
    grid.segments(0, 0, 
        .8*cos(minuteAngle), .8*sin(minuteAngle), 
        default="native", gp=gpar(lex=2))  
    popViewport(3) 
} 

drawClock(hour = 2, minute = 25) 

結果:

enter image description here