我想在相同的情节上使用直方图和密度,我正在尝试这个:
myPlot <- plot(density(m[,1])), main="", xlab="", ylab="")
par(new=TRUE)
Oldxlim <- myPlot$xlim
Oldylim <- myPlot$ylim
hist(m[,3],xlim=Oldxlim,ylim=Oldylim,prob=TRUE)
但我无法访问myPlot的xlim和ylim。
有没有办法从myPlot获取它们?我还应该做些什么呢?
答案 0 :(得分:6)
您是否考虑在第一个图中指定自己的xlim和ylim(将它们设置为适当的值)然后再次使用这些值来设置第二个图中直方图的限制?
只需通过自己绘制密度,您就应该能够计算出两个轴的最小值和最大值的合理值,然后在下面的代码中替换这些值的xmin,xmax,ymin和ymax。
等等;myPlot <- plot(density(m[,1])), main="", xlab="", ylab="", xlim =c(xmin, xmax), ylim = c(ymin, ymax)
par(new=TRUE)
hist(m[,3],xlim=c(min, max),ylim=c(min, max),prob=TRUE)
答案 1 :(得分:6)
使用par(new=TRUE)
很少(如果有的话)是最佳解决方案。许多绘图函数都有一个像add=TRUE
这样的选项,它将添加到现有的绘图中(包括评论中提到的直方图的绘图功能)。
如果您真的需要这样做,那么请查看usr
函数的par
参数,执行mylims <- par("usr")
将给出用户现有图的x和y限制坐标。但是,当您在新绘图上使用该信息时,请务必设置xaxs='i'
,否则新绘图中使用的实际坐标将比您指定的延长4%。
功能grconvertX
和grconvertY
也很有用。它们可以用于或用于此目的,但与par("usr")
相比可能有些过分,但它们可用于在其他坐标系中查找限制,或在用户坐标中查找绘图区域中间的值。
答案 2 :(得分:4)
如果由于任何原因你无法使用range()
来获得限制,我会遵循@ Greg的建议。这仅在par
参数“xaxs”和“yaxs”设置为“s”(默认值)且坐标范围扩展4%时才有效:
plot(seq(0.8,9.8,1), 10:19)
usr <- par('usr')
xr <- (usr[2] - usr[1]) / 27 # 27 = (100 + 2*4) / 4
yr <- (usr[4] - usr[3]) / 27
xlim <- c(usr[1] + xr, usr[2] - xr)
ylim <- c(usr[3] + yr, usr[4] - yr)
答案 3 :(得分:2)
我认为最好的解决方案是在绘制密度时修复它们。
否则在plot.default(plot.R)的代码中加入
xlab=""
ylab=""
log =""
xy <- xy.coords(x, y, xlab, ylab, log)
xlim1 <- range(xy$x[is.finite(xy$x)])
ylim1 <- range(xy$y[is.finite(xy$y)])
或使用上面的代码生成xlim和ylim然后调用你的密度
dd <- density(c(-20,rep(0,98),20))
plot(dd,xlim=xlim1,ylim=ylim1)
x <- rchisq(100, df = 4)
hist(x,xlim=xlim1,ylim=xlim1,prob=TRUE,add=TRUE)
答案 4 :(得分:1)
为什么不使用ggplot2
?
library(ggplot2)
set.seed(42)
df <- data.frame(x = rnorm(500,mean=10,sd=5),y = rlnorm(500,sdlog=1.1))
p1 <- ggplot(df) +
geom_histogram(aes(x=y,y = ..density..),binwidth=2) +
geom_density(aes(x=x),fill="green",alpha=0.3)
print(p1)