質問 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: 私のプロットでわかるように、さまざまなテキスト行の間隔が少し広いです。テキストの高さを測定する方法はあるのでしょうか。高さを使用して、テキストの異なる行間のスペースの幅を決定できます。
よろしくお願いします!