听说你要手搓一个 grid.xaxis2/grid.yaxis2?

1引言

grid 包里的 grid.xaxis/grid.yaxis 函数绘制的坐标轴提供可修改的参数较少,画出来的样子不太美观,自己用一些简单的图形组合,重新写个坐标轴函数,方便更多的控制。

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

2安装

函数在 jjPlot 里面:

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

3介绍

看看绘制原生的坐标轴:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.5,height = 0.5,
                      xscale = c(0,10),yscale = c(0,100)))

grid.rect()
grid.xaxis()
grid.yaxis()
图片

可以看到标签和刻度离的有点远,但是修改不了距离,可以修改的是 major/ticks/labels 三个参数:

grid.force()
grid.ls()
# GRID.rect.388
# GRID.xaxis.389
# major
# ticks
# labels
# GRID.yaxis.390
# major
# ticks
# labels

可以自己利用 线,文字 写个坐标轴函数, 关键的是获取当前视图的范围, 这里使用到了 current.viewport 函数获取当前视图的信息, grid.pretty 则根据数值范围取出一些展示美观的刻度值:

grid.pretty(current.viewport()$xscale,n = 5)
# [1]  0  2  4  6  8 10
grid.pretty(current.viewport()$yscale,n = 5)
# [1]   0  20  40  60  80 100

测试函数:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.5,height = 0.5,
                      xscale = c(0,10),yscale = c(0,100)))
grid.rect()
grid.xaxis2()
grid.yaxis2()
图片

感觉看起来好一些。

指定位置:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.5,height = 0.5,
                      xscale = c(0,10),yscale = c(0,100)))

grid.rect()
grid.xaxis2(side = "bottom")
grid.xaxis2(side = "top")
grid.yaxis2(side = "left")
grid.yaxis2(side = "right")
图片

指定刻度长度:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.5,height = 0.5,
                      xscale = c(0,10),yscale = c(0,100)))

grid.rect()
grid.xaxis2(side = "top",tick.len = 1)
图片

指定标签离刻度的距离:

grid.xaxis2(side = "bottom",label.space = 2)
图片

自定义刻度和标签,旋转标签并指定文字大小:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.5,height = 0.5,
                      xscale = c(0,10),yscale = c(0,100)))

grid.rect()
grid.xaxis2(at = c(1,3,5,7,9),labels = c(1,3,5,7,9),
            rot = 45,
            label.size = 16)
图片

不绘制矩形:

grid.newpage()
pushViewport(viewport(x = 0.5,y = 0.5,
                      width = 0.5,height = 0.5,
                      xscale = c(0,10),yscale = c(0,100)))
grid.xaxis2()
grid.yaxis2()
图片

4具体代码

代码也很简单:

grid.xaxis2

grid.xaxis2 <- function(at = NULL,
                        breaks = 5,
                        labels = NULL,
                        tick.len = 0.5,
                        label.space = 0.5,
                        side = c("bottom","top"),
                        rot = 0,
                        label.size = 12){
  # labels and ticks
  if(is.null(at) || is.null(labels)){
    at <- grid.pretty(current.viewport()$xscale,n = 5)
    labels <- as.character(at)
  }else{
    at <- at
    labels <- as.character(labels)
  }

  # axis position
  side <- match.arg(side,c("bottom","top"))
  if(side == "bottom"){
    tck.y0 = unit(0, "npc")
    tck.y1 = unit(-tick.len, "lines")
    text.y = unit(-tick.len - label.space,"lines")
  }else{
    tck.y0 = unit(1, "npc")
    tck.y1 = unit(1, "npc") + unit(tick.len, "lines")
    text.y = unit(abs(tick.len) + abs(label.space),"lines") + unit(1, "npc")
  }

  grid.segments(x0 = 0,x1 = 1,y0 = 0,y1 = 0)
  grid.segments(x0 = unit(at, "native"),
                x1 = unit(at, "native"),
                y0 = tck.y0,
                y1 = tck.y1)

  grid.text(label = labels,
            x = unit(at, "native"),
            y = text.y,
            rot = rot,
            gp = gpar(fontsize = label.size))
}

grid.yaxis2

grid.yaxis2 <- function(at = NULL,
                        breaks = 5,
                        labels = NULL,
                        tick.len = 0.5,
                        label.space = 0.25,
                        side = c("left","right"),
                        rot = 0,
                        label.size = 12){
  # labels and ticks
  if(is.null(at) || is.null(labels)){
    at <- grid.pretty(current.viewport()$yscale,n = 5)
    labels <- as.character(at)
  }else{
    at <- at
    labels <- as.character(labels)
  }

  # axis position
  side <- match.arg(side,c("left","right"))
  if(side == "left"){
    tck.x0 = unit(0, "npc")
    tck.x1 = unit(-tick.len, "lines")
    text.x = unit(-tick.len - label.space,"lines")
    text.just = "right"
  }else{
    tck.x0 = unit(1, "npc")
    tck.x1 = unit(1, "npc") + unit(tick.len, "lines")
    text.x = unit(abs(tick.len) + abs(label.space),"lines") + unit(1, "npc")
    text.just = "left"
  }

  grid.segments(x0 = 0,x1 = 0,y0 = 0,y1 = 1)
  grid.segments(y0 = unit(at, "native"),
                y1 = unit(at, "native"),
                x0 = tck.x0,
                x1 = tck.x1)

  grid.text(label = labels,
            y = unit(at, "native"),
            x = text.x,
            rot = rot,
            just = text.just,
            gp = gpar(fontsize = label.size))
}

5结尾

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


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

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

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