Вопрос 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()$cex.lab, похоже, дает вам только размер метки по умолчанию, равный 1.
Вопрос 2: Как вы можете видеть на моих графиках, расстояние между строками текста достаточно большое. Интересно, есть ли способ измерить высоту текста, и я могу использовать высоту, чтобы, возможно, решить, насколько широким должно быть пространство между разными строками текста.
Спасибо, ребята, заранее!
par
для настройки полей области графика, что даст вам больше места для написания строк текста? Кстати,par()$name
дает вам текущее значение указанного параметра. Если вы установитеpar(cex.lab)<-34.5
, это значение останется, пока вы его не очистите. - person Carl Witthoft   schedule 22.05.2012?strheight
полезно определить, сколько места занимает ваш текст? См. этот вопрос на днях: stackoverflow.com/q/10490763/496803 - person thelatemail   schedule 23.05.2012