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() を使用して作成されているため、これは何もしません。

考えられる解決策の 1 つは、関数内で 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()$cex.lab はデフォルトのラベル サイズである 1 しか提供しないようです。

質問 2: 私のプロットでわかるように、さまざまなテキスト行の間隔が少し広いです。テキストの高さを測定する方法はあるのでしょうか。高さを使用して、テキストの異なる行間のスペースの幅を決定できます。

よろしくお願いします!

4

0 に答える 0