问题 1:假设我有一个类似下面的函数,它允许我绘制线条并在 x 轴下方打印多行文本(抱歉,这是我能想到的最简单的代码。我愿意关于如何使它更整洁的任何建议!)。当 x 轴下方有多于一行文本时,它可能会与 x 轴标签重叠。所以我决定使用 mtext() 来绘制 x 轴标签。
Sampleplot = function(x, text, xlab = NULL,...){
if(!is.null(text)){
text.n=length(text) #Number of lines of text
text.n2=length(text[[1]]) #Number of words. Here I am assuming equal number in
#each list item
text.n=rep(1:text.n, each=text.n2)
matplot(x, axes = FALSE,...)
axis(2)
axis(1, labels = FALSE,at = 1:text.n2)
args.mtext=c(mtext, list(text=unlist(text),
line=text.n, at=1:text.n2, side=1))
mtext(xlab, line=max(text.n+1.5), side=1)
invisible(do.call(mapply, args.mtext))
}else matplot(x,...)
}
#Dataset and texts
dataset = cbind(sort(rlnorm(4)),sort(rlnorm(4)),sort(rlnorm(4)))
texts = list(letters[1:4], 1:4, letters[11:14])
#Sample plot:
par(mar=c(10,6,4,2))
Sampleplot(dataset, texts, xlab = "This is the label for x-axis",
type="b", pch=1)
现在,假设我想增加标签大小:
Sampleplot(dataset, texts, xlab = "This is the label for x-axis",
type="b", pch=1, cex.lab=3)
当然,这不会对 x 轴标签做任何事情,因为它不是使用 matplot() 而是使用 mtext() 创建的。
一种可能的解决方案是使 cex.lab 成为函数中的显式参数,并将其添加到 matplot
Sampleplot2 = function(x, text, xlab = NULL, cex.lab = NULL, ...){ #<- HERE!!
if(is.null(cex.lab)) cex.lab = 1
if(!is.null(text)){
text.n=length(text) #Number of lines of text
text.n2=length(text[[1]]) #Number of words. Here I am assuming equal number in
#each list item
text.n=rep(1:text.n, each=text.n2)
matplot(x, axes = FALSE, cex.lab=cex.lab,...) #<- HERE!
axis(2)
axis(1, labels = FALSE,at = 1:text.n2)
args.mtext=c(mtext, list(text=unlist(text),
line=text.n, at=1:text.n2, side=1))
mtext(xlab, line=max(text.n+1.5), side=1, cex=cex.lab) #<- HERE!
invisible(do.call(mapply, args.mtext))
}else matplot(x,...)
}
par(mar=c(10,6,4,2))
Sampleplot2(dataset, texts, xlab = "This is the label for x-axis",
type="b", pch=1, cex.lab=2)
然而,这个解决方案似乎远非优雅。所以我想知道是否有任何方法可以传递 cex.lab 值而不必明确地将其放入函数定义中。我尝试使用 par()$cex.lab,但与 par()$mar 不同,par()$mar 提供当前保证金状态,par()$cex.lab 似乎只给你默认标签大小,即 1。
问题 2:正如你在我的情节中看到的那样,不同行文本之间的间距有点宽。我想知道是否有任何方法可以测量文本的高度,并且我可以使用高度来决定不同文本行之间的空间应该有多宽。
提前谢谢你们!