Передать текущее значение cex.lab другой функции; Укажите расстояние между строками текста

Вопрос 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: Как вы можете видеть на моих графиках, расстояние между строками текста достаточно большое. Интересно, есть ли способ измерить высоту текста, и я могу использовать высоту, чтобы, возможно, решить, насколько широким должно быть пространство между разными строками текста.

Спасибо, ребята, заранее!


person Alex    schedule 22.05.2012    source источник
comment
Если вас беспокоит только перекрытие метки x, почему бы не использовать par для настройки полей области графика, что даст вам больше места для написания строк текста? Кстати, par()$name дает вам текущее значение указанного параметра. Если вы установите par(cex.lab)<-34.5, это значение останется, пока вы его не очистите.   -  person Carl Witthoft    schedule 22.05.2012
comment
@CarlWitthoft Я думал об использовании только mar=. Но мне еще предстоит выяснить взаимосвязь между требуемым размером поля и размером шрифта ниже оси x. Я пытаюсь сделать этот код частью рутины, которую я делаю. Поэтому вместо того, чтобы проверять, насколько широким должно быть нижнее поле, я хотел бы, чтобы скрипт мог определить его на основе количества строк текста и размера шрифта текста, а также размера метки по оси X. Кроме того, что касается par()$name, я получил NULL, когда использовал его. М-м-м..   -  person Alex    schedule 23.05.2012
comment
Может ли ?strheightполезно определить, сколько места занимает ваш текст? См. этот вопрос на днях: stackoverflow.com/q/10490763/496803   -  person thelatemail    schedule 23.05.2012
comment
@thelatemail Потрясающе! Это именно то, что я ищу. Спасибо!   -  person Alex    schedule 23.05.2012