Построение сетки за данными, а не спереди в R
Мне нравится создавать собственные линии сетки при построении графика, чтобы я мог контролировать отметки меток и т.д., и я борюсь с этим с помощью программы построения "hist".
hist(WindSpeed, breaks=c(0:31), freq=TRUE, col="blue", xaxt="n", yaxt="n", xlab="Wind Speed (m/s)",main="Foo", cex.main=1.5, cex.axis=1, cex.lab=1, tck=1, font.lab=2)
axis(1, tck=1, ,col.ticks="light gray")
axis(1, tck=-0.015, col.ticks="black")
axis(2, tck=1, col.ticks="light gray", lwd.ticks="1")
axis(2, tck=-0.015)
minor.tick(nx=5, ny=2, tick.ratio=0.5)
box()
Plot:
![enter image description here]()
Тогда мне просто удалось использовать команду "lines" или "points", чтобы переупорядочить данные поверх всех других типов графиков, но с гистограммой это не так просто.
Любая помощь будет большой.
Я добавил свой код ниже и изображение, основанное на ответе Джона...
Я добавил свой код ниже и изображение, основанное на ответе Джона...
hist(WindSpeed, breaks=30, freq=TRUE, col="blue", xaxt="n", yaxt="n", xlab="Wind Speed (m/s)",main="Foo", cex.main=1.5, cex.axis=1, cex.lab=1, font.lab=2)
axis(1, tck=1, col.ticks="light gray")
axis(1, tck=-0.015, col.ticks="black")
axis(2, tck=1, col.ticks="light gray", lwd.ticks="1")
axis(2, tck=-0.015)
minor.tick(nx=5, ny=2, tick.ratio=0.5)
box()
hist(WindSpeed, add=TRUE, breaks=30, freq=TRUE, col="blue", xaxt="n", yaxt="n", xlab="Wind Speed (m/s)", main="Foo", cex.main=1.5, cex.axis=1, cex.lab=1, font.lab=2)
![enter image description here]()
Ответы
Ответ 1
Это относительно легко.
Создайте гистограмму, но не создавайте ее.
h <- hist(y, plot = FALSE)
Теперь создайте базовый график... Я добавил некоторые функции, чтобы он выглядел больше как стандартная история
plot(h$mids, h$counts, ylim = c(0, max(h$counts)), xlim = range(h$mids)*1.1,
type = 'n', bty = 'n', xlab = 'y', ylab = 'Counts', main = 'Histogram of y')
добавить свою сетку
grid()
добавить свою гистограмму
hist(y, add = TRUE)
Или, как я обнаружил через этот процесс... вы можете сделать это еще проще
hist(y)
grid()
hist(y, add = TRUE, col = 'white')
Этот последний метод просто перерисовывает гистограмму по сетке.
Ответ 2
Собственно, у R есть способ сделать это! Это аргумент panel.first
для plot.default
, который hist
вызывает большую часть работы. Он принимает выражение, которое оценивается "после того, как оси графика настроены, но до того, как произойдет какое-либо построение графика. Это может быть полезно для рисования фоновых сеток или сглаживания рассеянности", - цитируется из ?plot.default
.
hist(WindSpeed, breaks=c(0:31), freq=TRUE, col="blue", xaxt="n", yaxt="n",
xlab="Wind Speed (m/s)", main="Foo",
cex.main=1.5, cex.axis=1, cex.lab=1, tck=1, font.lab=2,
panel.first={
axis(1, tck=1, col.ticks="light gray")
axis(1, tck=-0.015, col.ticks="black")
axis(2, tck=1, col.ticks="light gray", lwd.ticks="1")
axis(2, tck=-0.015)
minor.tick(nx=5, ny=2, tick.ratio=0.5)
box()
})
См. Как рисовать сетки с использованием abline(), которые находятся за данными? для другого вопроса, который использует этот метод.
Ответ 3
В R, порядок имеет значение, когда вы заговорите. Как вы обнаружили, добавление вещей в сюжет добавляется поверх того, что вы начертили ранее. Поэтому нам нужен способ сначала построить сетку, а затем гистограмму. Попробуйте что-то вроде этого:
plot(1:10,1:10,type = "n")
grid(10,10)
hist(rnorm(100,5,1),add = TRUE)
![enter image description here]()
Я не воссоздал ваш пример, так как он не воспроизводится, но эта общая идея должна работать. Но основная идея состоит в том, чтобы создать пустой график с правильными размерами с помощью опции type = "n"
до plot
, затем добавить сетку, а затем добавить гистограмму с помощью аргумента add = TRUE
.
Обратите внимание, что аргумент add
на самом деле для plot.histogram
, hist
передает его через ...
.
Ответ 4
Основное графическое решение, предлагаемое @joran, прекрасно. Альтернативы:
d <- data.frame(x=rnorm(1000))
library(lattice)
histogram(~x,data=d,panel=function(...) {
panel.grid(...)
panel.histogram(...) }
)
Или:
library(ggplot2)
qplot(x,data=d,geom="histogram",binwidth=0.1)+theme_bw()+
labs(x="Wind speed", y="Frequency")
(Но, конечно, вам нужно будет изучить все детали настройки ярлыков, титров и т.д.... Я не уверен, как делать заголовки в ggplot
...)
Ответ 5
Другие методы для линий сетки в фоновом режиме:
А)
hist( y, panel.first=grid() ) # see: help( plot.default )
box()
В)
plot.new() # new empty plot
nv <- length( pretty(x) ) - 1 # number of vertical grid lines (or set by hand)
nh <- length( pretty(y) ) - 1 # number of horizontal grid lines (or set by hand)
grid( nx = nv, ny = nh ) # preplot grid lines
par( new = TRUE ) # add next plot
plot( x, y ) # plot or hist, etc
box() # if plot hist
Произвольные строки в фоне с abline:
С)
Как рисовать сетки с использованием abline(), которые находятся за данными?
D)
# first, be sure there is no +/-Inf, NA, NaN in x and y
# then, make the container plot with two invisible points:
plot( x = range( pretty( x ) ), y = range( pretty( y ) ), type = "n", ann = FALSE )
abline( h = hlines, v = vlines ) # draw lines. hlines, vlines: vectors of coordinates
par( new = TRUE ) # add next plot. It is not necessary with points, lines, segments, ...
plot( x, y ) # plot, hist, etc
box() # if plot hist