1

问题 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:正如你在我的情节中看到的那样,不同行文本之间的间距有点宽。我想知道是否有任何方法可以测量文本的高度,并且我可以使用高度来决定不同文本行之间的空间应该有多宽。

提前谢谢你们!

4

0 回答 0