如何在R中绘制时钟?

Man*_*ish 1 r pie-chart

我正在研究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)
Run Code Online (Sandbox Code Playgroud)

但我需要所有12个标签独立于输入中没有任何段.

在此输入图像描述

我该如何实现它?

问候

dic*_*koa 12

Paul Murrell在他的最后一本书(R图形第2版)中有一些使用grid和绘制交互式时钟的代码gwidget.

以下是绘制简单非交互式时钟的示例代码:

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"))
}
Run Code Online (Sandbox Code Playgroud)

现在你可以这样试试

drawClock(hour = 2, minute = 30)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

完整代码 在这里


小智 6

遇到相同问题后对此主题的更新。如果您想将馅饼和时钟保留在其顶部,则应该使用“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)
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述