2011-12-09 9 views
21

Me gusta producir mis propias líneas de cuadrícula al trazar para poder controlar las marcas, etc. y estoy luchando con la rutina de trazado 'hist'.Trazar una cuadrícula detrás de los datos, no al frente en R

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() 

Terreno: enter image description here

He entonces sólo ha sido capaz de utilizar las 'líneas' o comando de 'puntos' a Replot los datos a través de la parte superior para otros tipos de parcelas, pero con el histograma no es tan fácil.

Cualquier ayuda sería genial.

añadí mi código de abajo y la imagen en base a la respuesta de Juan ...

añadí mi código de abajo y la imagen en base a la respuesta de Juan ...

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

+0

Puede acortar su segundo comando hist hasta mucho porque cuando se añade a la ya existente que no es necesario establecer ninguna de las propiedades de los ejes y las etiquetas de nuevo. – John

Respuesta

15

Esto es relativamente fácil.

Genera el histograma pero no lo trazas.

h <- hist(y, plot = FALSE) 

Ahora genere su diagrama base ...He añadido algunas características para que se vea más como un estándar historgram

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') 

añadir su rejilla

grid() 

añadir su histograma

hist(y, add = TRUE) 

O, como he descubierto a través de este proceso de ... puede hacerlo aún más fácil

hist(y) 
grid() 
hist(y, add = TRUE, col = 'white') 

Este último método simplemente está redibujando el histograma sobre la cuadrícula.

+0

Agradable. Su último método es simple y efectivo. ¡Me gusta especialmente que no requiera un cálculo previo de los límites del área de trazado! –

+0

La llamada add = TRUE es lo que me faltaba ... gracias John ... simple y dulce ... Agregué mi código y resulté – RWJ

+0

En realidad, @John, 'panel.first' también funciona aquí, como en tu Responda aquí: http://stackoverflow.com/a/7264055/210673 – Aaron

8

En R , el orden importa cuando tramas. Como has descubierto, agregar cosas a un gráfico se suma a lo que has trazado anteriormente. Entonces, necesitamos una forma de trazar la cuadrícula primero y luego el histograma. Intentar algo como esto:

plot(1:10,1:10,type = "n") 
grid(10,10) 
hist(rnorm(100,5,1),add = TRUE) 

enter image description here

no he recreado su ejemplo, ya que no es reproducible, pero esta idea general debería funcionar. Pero la idea clave es crear un gráfico vacío con las dimensiones correctas utilizando la opción type = "n" a plot, luego agregue la cuadrícula y luego agregue el histograma con el argumento add = TRUE.

Tenga en cuenta que el argumento add es en realidad para plot.histogram, hist pasa por via ....

4

La solución de gráficos base sugerida por @joran está bien. Alternativas:

d <- data.frame(x=rnorm(1000))  

library(lattice) 
histogram(~x,data=d,panel=function(...) { 
    panel.grid(...) 
    panel.histogram(...) } 
) 

O:

library(ggplot2) 
qplot(x,data=d,geom="histogram",binwidth=0.1)+theme_bw()+ 
    labs(x="Wind speed", y="Frequency") 

(Pero, por supuesto, tendrá que aprender todos los detalles de las etiquetas de ajuste, títulos, etc. ... No estoy realmente seguro de cómo hacerlo títulos en ggplot ...)

23

¡En realidad, R tiene una manera de hacer esto! Es el argumento panel.first al plot.default, que hist llama para hacer la mayor parte del trabajo. Toma una expresión que se evalúa "una vez que se configuran los ejes de la trama pero antes de que tenga lugar cualquier trazado. Esto puede ser útil para dibujar cuadrículas de fondo o trazado de dispersión suavizado", para citar ?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() 
}) 

Ver How do I draw gridlines using abline() that are behind the data? para otra pregunta que utiliza este método.

+0

cosas buenas ... gracias Aaron – RWJ

+0

Gracias. Descubrí que la sintaxis de esta respuesta funcionaba mejor que la solución provista en el otro enlace sugerido aquí. – Nova

1

Otros métodos para líneas de rejilla en el fondo:

A)

hist(y, panel.first=grid()) # see: help(plot.default) 
box() 

B)

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 

líneas arbitrarias en el fondo con abline:

C)

How do I draw gridlines using abline() that are behind the data?

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 
Cuestiones relacionadas