Линия сетки соответствует отметкам на оси

Мне стыдно задавать этот простой вопрос, но я уже несколько дней ломаю голову всякий раз, когда создаю сюжет:

plot (x = 1:10, y = rnorm (10, 5, 2))
grid (10,10, lty = 6, col = "cornsilk2")

Я хочу расположить сетки прямо там, где помечены оси, то есть на 2, 4, 6, 8, 10 по оси x и аналогично 3, 4, 5, 6, 7, 8 по оси y.

введите здесь описание изображения

Я хочу автоматизировать процесс, так как всякий раз, когда размер графика изменяется, поведение метки по умолчанию изменяется. См. следующий сюжет:

введите здесь описание изображения


person jon    schedule 10.11.2011    source источник


Ответы (4)


Из ?grid описания аргументов nx и ny:

Когда NULL, по умолчанию, сетка выравнивается по делениям на соответствующей оси по умолчанию (т. е. по делениям, вычисленным с помощью axTicks).

plot (x = 1:10, y = rnorm (10, 5, 2)) 
grid (NULL,NULL, lty = 6, col = "cornsilk2") 
person joran    schedule 10.11.2011
comment
+1 за объяснение файлов справки и -1 за то, что я плохо понимаю справку... - person jon; 10.11.2011
comment
Похоже, это не работает с отметками времени по оси X. Любые идеи? - person slovon; 21.11.2017
comment
@slovon Думаю, в этом случае вам придется рисовать сетку вручную. Документы для grid говорят только о том, что он будет выравниваться с тиками для оси по умолчанию, и ясно, что метод графика даты и времени делает что-то другое, чем то, что было бы возвращено axTicks. - person joran; 21.11.2017
comment
@slovon Если это поможет, я думаю, что места галочек взяты из graphics:::axis.POSIXct. - person joran; 21.11.2017

Для справки, есть способ управлять параметрами сетки и осей непосредственно из команды plot(), если мы не определяем пользовательский интервал тиков:

plot(x = 1:10, y = rnorm(10, 5, 2), xlim=c(1, 10), ylim=c(1, 10), panel.first=grid())

Документация plot.default() дает больше информации об этих параметрах.

При использовании пользовательского интервала тиков проще всего нарисовать сетку с помощью abline:

plot(x = 1:10, y = rnorm(10, 5, 2), xaxp=c(1, 10, 10), yaxp=c(1, 10, 10), axes=FALSE)
axis(1, 1:10)
axis(2, 1:10)
abline(h=1:10, v=1:10, col="gray", lty=3)

пример сетки

Дополнительные сведения о настраиваемых интервалах тиков см. в эта тема и здесь для выравнивания сетки.

person Robert Kubrick    schedule 06.02.2013

Для потомков вот многословный способ сделать это вручную:

plot (x = 1:10, y = rnorm (10, 5, 2))
grid (lty = 6, col = "cornsilk2")

xaxp <- par("xaxp")
yaxp <- par("yaxp")

abline(v=seq(xaxp[1], xaxp[2], (xaxp[2]-xaxp[1])/xaxp[3]), lty=6, col = "cornsilk2")
abline(h=seq(yaxp[1], yaxp[2], (yaxp[2]-yaxp[1])/yaxp[3]), lty=6, col = "cornsilk2")
person Andrie    schedule 10.11.2011

Ответ, предоставленный здесь, намного проще, хотя вам может не понравиться отсутствие "бесплатных пробел» на каждом конце осей. Вкратце,

Проблема в том, что grid помещает nx линий сетки в пользовательское пространство, а plot добавляет по 4% дополнительного пространства с каждой стороны. Вы можете взять это под контроль. Добавление xaxs="i", yaxs="i" к вашему графику отключит дополнительное пространство. Но тогда ваша верхняя правая точка будет обрезана, поэтому вам нужно изменить значения xlim и ylim и изменить nx, чтобы они соответствовали

person Carl Witthoft    schedule 06.02.2018