2012-12-12 24 views
7

我想要一个HIST并在同一个情节密度的情节,我想这样的:获取XLIM从R中

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?我还应该做些什么呢?

+2

您可以使用'HIST(。 ..,add = TRUE)'绘制在同一个图上。 – liuminzhao

+0

@liuminzhao我可能会将您的评论设置为我接受的答案 – jimifiki

回答

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

我认为最好的解决方案是在绘制密度时修复它们。

在plot.default的代码,否则hacing(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) 

enter image description here

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) 

density and hist

6

使用par(new=TRUE)很少,如果有的话,最好的解决办法。许多绘图功能有一个选项,如add=TRUE,它将添加到现有绘图(包括注释中提到的绘制直方图的绘图功能)。

如果您确实需要这样做,那么请参阅par函数的usr参数,做mylims <- par("usr")将给出用户坐标中现有图的x和y限制。但是,当您在新图上使用该信息时,请务必设置xaxs='i',否则新图中使用的实际坐标将比您指定的坐标延长4%。

功能grconvertXgrconvertY也是有用的知道。可以使用它们或用于此目的,但与par("usr")相比可能是过度杀毒,但它们可用于在其他坐标系中查找限制,或在用户坐标中查找绘图区中间的值。

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)