How to draw gauge chart in R?

后端 未结 4 814
臣服心动
臣服心动 2021-01-30 19:08

How can i draw a following plot in R?

  Red = 30
  Yellow = 40
  Green = 30 

  Needle at 52. 

Pls help me out as i am in great need.

4条回答
  •  囚心锁ツ
    2021-01-30 19:35

    So here's a fully ggplot solution.

    Note: Edited from the original post to add numeric indicator and labels at the gauge breaks which seems to be what OP is asking for in their comment. If indicator is not needed, remove the annotate(...) line. If labels are not needed, remove geom_text(...) line.

    gg.gauge <- function(pos,breaks=c(0,30,70,100)) {
      require(ggplot2)
      get.poly <- function(a,b,r1=0.5,r2=1.0) {
        th.start <- pi*(1-a/100)
        th.end   <- pi*(1-b/100)
        th       <- seq(th.start,th.end,length=100)
        x        <- c(r1*cos(th),rev(r2*cos(th)))
        y        <- c(r1*sin(th),rev(r2*sin(th)))
        return(data.frame(x,y))
      }
      ggplot()+ 
        geom_polygon(data=get.poly(breaks[1],breaks[2]),aes(x,y),fill="red")+
        geom_polygon(data=get.poly(breaks[2],breaks[3]),aes(x,y),fill="gold")+
        geom_polygon(data=get.poly(breaks[3],breaks[4]),aes(x,y),fill="forestgreen")+
        geom_polygon(data=get.poly(pos-1,pos+1,0.2),aes(x,y))+
        geom_text(data=as.data.frame(breaks), size=5, fontface="bold", vjust=0,
                  aes(x=1.1*cos(pi*(1-breaks/100)),y=1.1*sin(pi*(1-breaks/100)),label=paste0(breaks,"%")))+
        annotate("text",x=0,y=0,label=pos,vjust=0,size=8,fontface="bold")+
        coord_fixed()+
        theme_bw()+
        theme(axis.text=element_blank(),
              axis.title=element_blank(),
              axis.ticks=element_blank(),
              panel.grid=element_blank(),
              panel.border=element_blank()) 
    }
    gg.gauge(52,breaks=c(0,35,70,100))
    

    ## multiple guages
    library(gridExtra)
    grid.newpage()
    grid.draw(arrangeGrob(gg.gauge(10),gg.gauge(20),
                          gg.gauge(52),gg.gauge(90),ncol=2))
    

    You will likely need to tweak the size=... parameter to geom_text(...) and annotate(...) depending on the actual size of your gauge.

    IMO the segment labels are a really bad idea: they clutter the image and defeat the purpose of the graphic (to indicate at a glance if the metric is in "safe", "warning", or "danger" territory).

提交回复
热议问题