Подтвердить что ты не робот

Построение сетки за данными, а не спереди в 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

4b9b3361

Ответ 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