Как разместить больше места между метками оси и заголовком оси в блок-диаграмме R - PullRequest
31 голосов
/ 01 апреля 2011

Я создаю блокпост в R со следующим кодом:

boxplot(perc.OM.y ~ Depth, axes = F, ylim = c(-0.6, 0.2), xlim = c(3.5, 5.5),
        lwd = 0.1, col = 8, 
        ylab = "Loss of Percent Organic Matter per Year", cex.lab = 1.5)
axis(1, at = c(3.5, 4, 5, 5.5), labels = c(" ", "Shallow", "Deep", " "), 
     cex.axis = 1.5)
axis(2, cex.axis = 1.5)

Проблема в том, что числовые метки на оси Y в настоящее время перекрывают заголовок оси. Есть ли способ поместить больше места между заголовком оси и метками номера оси?

Спасибо

Ответы [ 3 ]

41 голосов
/ 01 апреля 2011
## dummy data
dat <- data.frame(Depth = sample(c(3:6), 20, replace = TRUE), OM = 5 * runif(20))

Добавьте немного места для надписей и аннотаций оси y, увеличив поле с левой стороны графика (side = 2):

## margin for side 2 is 7 lines in size
op <- par(mar = c(5,7,4,2) + 0.1) ## default is c(5,4,4,2) + 0.1

Теперь сюжет:

## draw the plot but without annotation
boxplot(OM ~ Depth, data = dat, axes = FALSE, ann = FALSE)
## add axes
axis(1, at = 1:4, labels = c(" ", "Shallow", "Deep", " "), cex.axis = 1.5)
axis(2, cex.axis = 2)
## now draw the y-axis annotation on a different line out from the plot
## using the extra margin space:
title(ylab = "Loss of Percent Organic Matter per Year", cex.lab = 1.5,
      line = 4.5)
## draw the box to finish off
box()

Затем сбросьте поля печати:

par(op)

Это дает:

boxplot

Итак, мы создали больше места для поля графика на стороне 2, а затем нарисовали оси и аннотацию (ylab) по отдельности, чтобы управлять разметкой графика.

Итак, ключом к этому является строка:

op <- par(mar = c(5,7,4,2) + 0.1) ## default is c(5,4,4,2) + 0.1

Мы сохраняем исходные графические параметры в объекте op, и изменяют размеры полей (в количестве строк) на 5, 7, 4, 2 + 0,1 строки каждый для поля снизу, слева, сверху, справа соответственно. В строке выше показаны значения по умолчанию, поэтому код дает на 2 поля слева больше, чем обычно предусмотрено по умолчанию.

Затем, когда мы рисуем метку оси Y, используя title(), мы указываем, какую линию (из 7) нарисовать метку в:

title(ylab = "Loss of Percent Organic Matter per Year", cex.lab = 1.5,
      line = 4.5)

Здесь я использовал строку 4.5, но 5 также будет работать. Чем больше значения 'line', тем дальше от графика рисуется метка.

Хитрость заключается в том, чтобы найти значение для левого поля и значение 'line' в вызове title(), которое позволяет тиковым меткам оси и метке оси не перекрываться. Метод проб и ошибок, вероятно, является наилучшим решением для поиска значений, необходимых для базовой графики.

23 голосов
/ 01 апреля 2011

Попробуйте установить первое значение mgp больше.Вы также захотите увеличить поля с mar.

par(mgp=c(5,1,0))
par(mar=c(5,6,4,2)+0.1)
4 голосов
/ 27 декабря 2015

Я только что нашел это решение очень простым и полезным, когда я хотел уменьшить пустое пространство вокруг диаграммы (учитывая ограничения по размеру в документах конференции!), В то время как я хотел избежать наложения названия осей Y и больших чисел в качестве отметок.

Я использую, чтобы установить заголовки в виде текста и размещать их где угодно, после установки полей вручную:

Сначала установите поля на произвольные значения:

par( mar=c(m1, m2, m3, m4) ) 

где m1 - m4 - поля для четырех сторон (1 = снизу, 2 = слева, 3 = сверху и 4 = справа).

Например:

par( mar=c(3.1, 4.7, 2.3, 0)) 

Затем при построении графика установите main = "", xlab = "" и ylab = "" (иначе их текст будет совпадать с этим новым текстом)

Наконец, используя mtext (), установите заголовки осей и заголовок диаграммы вручную:

mtext(side=1, text="X axes title", line=0.5)
mtext(side=2, text="Y axes title", line=3)
mtext(side=3, text="Diagram title", line=1.5)

Параметр линии - это расстояние от диаграммы (меньшие значения приближают его к диаграмме).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...