grid 里绘制连续型图例

1引言

原理很简单,就是绘制一系列连续的矩形,然后填充对应的颜色就好了

具体代码文末贴出, 感兴趣的同学可以研究一下。

2安装

函数在 jjPlot 里面:

# install.packages("devtools")
devtools::install_github("junjunlab/jjPlot")

3介绍

grid.colorkey 绘制一个连续型颜色条, pos 指定水平还是竖直, ticks.side 指定标签在哪边:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.25,height = 0.75))
grid.colorkey(x = 0:10,pos = "v",ticks.side = "left")
图片

右边:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.25,height = 0.75))
grid.colorkey(x = 0:10,pos = "v",ticks.side = "right")
图片

水平:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.6,height = 0.25))
grid.colorkey(x = 0:10,pos = "h",ticks.side = "top")
图片

底部标签:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.6,height = 0.25))
grid.colorkey(x = 0:10,pos = "h",ticks.side = "bottom")
图片

修改颜色:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.6,height = 0.25))
grid.colorkey(x = 0:10,pos = "h",ticks.side = "bottom",
              color = c("#F6F1F1","#AFD3E2","#19A7CE","#146C94"))
图片
grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.6,height = 0.25))
grid.colorkey(x = 0:10,pos = "h",ticks.side = "bottom",
              color = rainbow(10))
图片

具体绘图的话,还得给对应的数据大小分配给对应的颜色,这样才能和图例匹配起来。

4代码

grid.colorkey <- function(x = NULL,
                          color = NULL,
                          color.n = 100,
                          ticks.side = c("left","right","top","bottom"),
                          pos = c("h","v")){
  pos <- match.arg(pos,c("h","v"))
  ticks.side <- match.arg(ticks.side,c("left","right","top","bottom"))

  # check position
  if(pos == "v"){
    x_scale <- c(0,1)
    y_scale <- range(as.numeric(x))

    xpos <- 0.5
    ypos <- seq(0,1, length = color.n)

    r_width = unit(1, "npc")
    r_height = 1/(color.n - 1)
  }else{
    y_scale <- c(0,1)
    x_scale <- range(as.numeric(x))

    ypos <- 0.5
    xpos <- seq(0,1, length = color.n)

    r_width = 1/(color.n - 1)
    r_height = unit(1, "npc")
  }

  # canvas
  pushViewport(viewport(angle = 0,
                        yscale = y_scale,
                        xscale = x_scale))
  # assign colors
  if(is.null(color)){
    cols <- c("blue","white","red")
  }else{
    cols <- color
  }

  col_p <- colorRampPalette(cols)(color.n)

  # just
  if(pos == "v"){
    just <- c("bottom",rep("centre",color.n-2),"top")

    # loop to create color
    for (i in 1:color.n) {
      grid.rect(x = xpos,
                y = ypos[i],
                height = r_height,
                width = r_width,
                just = just[i],
                gp = gpar(col = col_p[i], fill = col_p[i]))
    }
  }else{
    just <- c("left",rep("centre",color.n-2),"right")

    # loop to create color
    for (i in 1:color.n) {
      grid.rect(x = xpos[i],
                y = ypos,
                height = r_height,
                width = r_width,
                just = just[i],
                gp = gpar(col = col_p[i], fill = col_p[i]))
    }
  }

  grid.rect(gp = gpar(fill = NA))

  # add axis
  if(pos == "h"){
    jjPlot::grid.xaxis2(side = ticks.side,tick.len = 0.25)
  }else{
    jjPlot::grid.yaxis2(side = ticks.side,tick.len = 0.25)
  }
  popViewport()
}

5结尾

路漫漫其修远兮,吾将上下而求索。


欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群 (微信交流群需收取 20 元入群费用,一旦交费,拒不退还!(防止骗子和便于管理)) 。QQ 群可免费加入, 记得进群按格式修改备注哦。

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/307831.html

(0)
联系我们
联系我们
分享本页
返回顶部