Линия сетки соответствует отметкам на оси - PullRequest
24 голосов
/ 10 ноября 2011

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

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.

enter image description here

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

enter image description here

Ответы [ 4 ]

35 голосов
/ 10 ноября 2011

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

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

plot (x = 1:10, y = rnorm (10, 5, 2)) 
grid (NULL,NULL, lty = 6, col = "cornsilk2") 
20 голосов
/ 06 февраля 2013

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

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

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

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

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)

grid example

Подробнееинформация о пользовательских интервалах тиков в этой теме и здесь для выравнивания сетки.

5 голосов
/ 10 ноября 2011

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

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")
1 голос
/ 06 февраля 2018

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

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

...