11

我想要在同一个情节上的历史和密度,我正在尝试这个:

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 获取它们?我还应该做什么?

4

5 回答 5

6

使用par(new=TRUE)很少,如果有的话,最好的解决方案。许多绘图函数都有这样的选项add=TRUE,它将添加到现有绘图中(包括评论中提到的直方图绘图函数)。

如果你真的需要这样做,那么查看函数的usr参数par,doingmylims <- par("usr")将给出用户坐标中现有绘图的 x 和 y 限制。但是,当您在新绘图上使用该信息时,请确保设置xaxs='i'或新绘图中使用的实际坐标将超出您指定的 4%。

了解这些功能grconvertXgrconvertY很有用。它们可以用于此目的,但与 相比可能是多余的par("usr"),但它们对于在其他坐标系中查找限制或在用户坐标中查找诸如绘图区域中间的值很有用。

于 2012-12-12T17:49:38.423 回答
5

您是否考虑过在第一个图中指定自己的 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)
于 2012-12-12T15:39:56.637 回答
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)
于 2013-10-31T14:03:47.863 回答
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)

在此处输入图像描述

于 2012-12-12T15:35:02.697 回答
0

为什么不使用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)

密度和组织

于 2012-12-12T17:21:31.640 回答