在一个图表中嵌套另一个图表

11
我有第一个情节。
curve(exp(x), from=1, to=5, lwd=5)
curve(150-exp(x), from=1, to=5, lwd=5, col="darkblue",add=T)

我想在其中添加以下的Plot 2。

par(mar=c(7,7,1,1))
curve(exp(x), from=1, to=5, lwd=7, xlab="chi", ylab="exp(x)", cex.lab=4,axes=F)
axis(1, labels=NA,at=c(0,5))
axis(2, labels=NA,at=c(0,150))
text(1,120,"Alpha",adj=c(0,0),cex=3)
text(3.5,10,"Beta",adj=c(0,0),cex=3)

为了获得以下内容:

Combined

我还希望将图2设置为透明,这样如果图1的某些元素在图2后面,它们仍然会显示(就像蓝线一样)。图2的更大标签和其轴上的标签和刻度的缺失也很重要。
这是否可能?请只使用基本R解决方案(不使用ggplot2 /不使用lattice)。

教学演示和Hmisc包中都有名为'subplot'的函数。我不知道它们是否是相同的代码。我怀疑全透明的背景颜色会成功,但还没有尝试过。 - IRTFM
我尝试使用TeachingDemos中的subplot,但不幸的是没有成功。轴标签的大小和边距出现了问题。不知道为什么,可能是我的问题。 - ECII
2个回答

18

好的,这里有一个例子,我将其绘制为10英寸乘10英寸的pdf。(使用par(fig = )等命令的挑战在于它们的效果很大程度上取决于绘图设备的大小。)


编辑以添加一些解释:

基础图形绘制参数par("fig")描述/设置了一个图形区域相对于“绘图区域”的位置(对于单个图形绘制来说,“绘图区域”通常是整个设备)。它采用长度为4的向量,格式为c(xmin, xmax, ymin, ymax),由0到1之间的数字(比例)组成。

这里我使用grconvertX()grconvertY()将以较大绘图的自己(也称为“用户”)坐标系表示的x-y位置转换为“ndc”(标准化设备坐标)坐标系。 “用户”坐标系更加人性化,而“ndc”则是(在上述警告的限制下)par("fig")使用的坐标系。 grconvert*()调用只是为了在它们之间执行翻译。

## pdf("fig-in-fig.pdf", width=10, height=10)
curve(exp(x), from=1, to=5, lwd=5)
curve(150-exp(x), from=1, to=5, lwd=5, col="darkblue",add=T)

## Here's the bit I added.
par(fig = c(grconvertX(c(1, 3), from="user", to="ndc"),
            grconvertY(c(50, 125), from="user", to="ndc")),
    mar = c(4,6,1,1),
    new = TRUE)

curve(exp(x), from=1, to=5, lwd=7, xlab="chi", ylab="exp(x)", cex.lab=4,axes=F)
axis(1, labels=NA,at=c(0,5))
axis(2, labels=NA,at=c(0,150))
text(1,120,"Alpha",adj=c(0,0),cex=3)
text(3.5,10,"Beta",adj=c(0,0),cex=3)
## dev.off()

enter image description here


1
非常好的答案。非常感谢。您介意加上一两行说明您在 par(plt)grconvertX 中所做的操作吗? - ECII
1
@ECII -- 谢谢。我增加了一些解释,并编辑了代码,使其更容易“看出”它的效果。经过昨天和今天的试验后,我得出的结论是这只是需要大量实验才能真正掌握的东西。如果你想掌握它,我建议做一堆图(包括一些使用layout()par(mfcol=c(2,3))的图),并通过频繁调用par("omd")par("fig")par("plt")来检查它们。同时还要玩弄par("mar"),然后重新检查par("plt")等等。祝好运! - Josh O'Brien
很好,优雅。也解决了我的问题。谢谢。 - DorinPopescu

7
这里有一种方法:
curve(exp(x), from=1, to=5, lwd=5)
curve(150-exp(x), from=1, to=5, lwd=5, col="darkblue",add=T)
par(new=TRUE)
par(oma=c(1,4,5,1))
par(mfcol=c(2,2), mfg=c(1,1))
par(mar=c(7,7,1,1))
curve(exp(x), from=1, to=5, lwd=7, xlab="chi", ylab="exp(x)", cex.lab=2,axes=F)
axis(1, labels=NA,at=c(0,5))
axis(2, labels=NA,at=c(0,150))
text(1,120,"Alpha",adj=c(0,0),cex=1.5)
text(4,10,"Beta",adj=c(0,0),cex=1.5)

给我这个:
玩一下各种选项(尤其是omamar)来格式化结果以符合您的喜好。

那么你是通过 par(mfcol=c(2,2), mfg=c(1,1)) 来设置图表2的位置的吗? - ECII
有没有办法更精细地调整图2的位置和大小? - ECII
@ECII -- 是的,你可以使用 par(new = TRUE, fig=c(x1, x2, y1, y2)),还有 plt= 和其他的。这里有一些例子。我从来没有完全掌握这些命令,因为我发现grid视口要简单得多,但是它是可行的! - Josh O'Brien
1
@ECII 也许你可以尝试使用layout()函数,它提供了一种替代mfrow和mfcol设置的方法(当然是在调用par(new=TRUE)之后)。 - agstudy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接