绘制数据后面的网格,而不是R中的前面

时间:2011-12-09 21:37:46

标签: r plot

我喜欢在绘图时生成自己的网格线,因此我可以控制刻度线等等。我正在使用'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()

简介: enter image description here

然后我就可以使用'lines'或'points'命令在顶部为其他类型的图重新绘制数据,但直方图并不那么容易。

任何帮助都会很棒。

我在下面添加了我的代码并根据John的回复图片...

我在下面添加了我的代码并根据John的回复图片...

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

5 个答案:

答案 0 :(得分:27)

实际上,R有办法做到这一点!它是panel.first的{​​{1}}参数,plot.default调用它来执行大部分工作。它需要一个表达式,在设置绘图轴之后但在进行任何绘图之前进行评估。这对于绘制背景网格或散点图光滑度非常有用,“引自hist

?plot.default

有关使用此方法的其他问题,请参阅How do I draw gridlines using abline() that are behind the data?

答案 1 :(得分:16)

这相对容易。

生成直方图,但不绘制它。

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 :(得分:8)

在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.histogramhist通过...传递。

答案 3 :(得分: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中做标题......)

答案 4 :(得分:1)

背景中网格线的另一种方法:

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

背景中任意行与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