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