2012-04-02 152 views
8

举一个非常简单的例子,mfrow=c(1,3);每个图都是不同的直方图;我怎么会画一条水平线(类似于abline(h=10))那全是 3个数字? (即便是它们之间的差距)。显然,我可以为每个数字添加一个abline,但这不是我想要的。我可以想到一个非常复杂的方式,通过真的只有1个数字,并使用polygon等绘制其中的每个'图',这将是荒谬的。有没有一种简单的方法来做到这一点?如何在R中的多图环境中绘制一条线?

回答

13

由于@joran指出的那样,电网图形化系统提供了更灵活控制单个设备上多个图的排列。

在这里,我首先使用grconvertY()查询的50上的y轴的高度的位置中的“归一化设备坐标”单位。 (即作为绘图装置总高度的一部分,其中0 =底部,1 =顶部)。然后我使用grid函数来:(1)推动填充设备的viewport;和(2)在由grconvertY()返回的高度绘制一条线。

## Create three example plots 
par(mfrow=c(1,3)) 
barplot(VADeaths, border = "dark blue") 
barplot(VADeaths, border = "yellow") 
barplot(VADeaths, border = "green") 

## From third plot, get the "normalized device coordinates" of 
## a point at a height of 50 on the y-axis. 
(Y <- grconvertY(50, "user", "ndc")) 
# [1] 0.314248 

## Add the horizontal line using grid 
library(grid) 
pushViewport(viewport()) 
grid.lines(x = c(0,1), y = Y, gp = gpar(col = "red")) 
popViewport() 

enter image description here

编辑:@joran问到如何绘制,从第1情节在第三情节的最后一棒的边缘的y轴延伸的线。这里有几个选择:

library(grid) 
library(gridBase) 
par(mfrow=c(1,3)) 

# barplot #1 
barplot(VADeaths, border = "dark blue") 
X1 <- grconvertX(0, "user", "ndc") 
# barplot #2 
barplot(VADeaths, border = "yellow") 
# barplot #3 
m <- barplot(VADeaths, border = "green") 
X2 <- grconvertX(tail(m, 1) + 0.5, "user", "ndc") # default width of bars = 1 
Y <- grconvertY(50, "user", "ndc") 

## Horizontal line 
pushViewport(viewport()) 
grid.lines(x = c(X1, X2), y = Y, gp = gpar(col = "red")) 
popViewport() 

enter image description here

最后,这里是一个几乎相当于,一般多用的方法。它采用了功能grid.move.to()grid.line.to()由保罗·马雷尔在@ mdsumner的答案链接到文章中demo'd:

library(grid) 
library(gridBase) 
par(mfrow=c(1,3)) 

barplot(VADeaths); vps1 <- do.call(vpStack, baseViewports()) 
barplot(VADeaths) 
barplot(VADeaths); vps3 <- do.call(vpStack, baseViewports()) 

pushViewport(vps1) 
Y <- convertY(unit(50,"native"), "npc") 
popViewport(3) 

grid.move.to(x = unit(0, "npc"), y = Y, vp = vps1) 
grid.line.to(x = unit(1, "npc"), y = Y, vp = vps3, 
      gp = gpar(col = "red")) 
+0

+1不错!你知道一种按摩单位/坐标/剪裁的方法,这条线从最左边的y轴延伸到绿色条的右边缘吗? – joran 2012-04-03 01:55:49

+0

我确实有一个想法,如果能解决问题,我会添加它。现在,我在太阳下山前剪草坪... – 2012-04-03 02:03:08

+0

谢谢,这真的很有帮助!我很欣赏你愿意推迟我的帐户上的割草;-) – gung 2012-04-03 02:38:27

6

这是不困难想着它,我能做的最好的:

par(mfrow = c(1,3),xpd = NA) 

for (i in 1:3){ 
    x <- rnorm(200,i) 
    hist(x) 
    if (i == 1) segments(par("usr")[1],10,30,10) 
} 

enter image description here

我不知道如何确保行结束在正确的位置,而不修修补补。绘制每个区域的细分将解决这个问题,但会引入高度正确排列的问题。但这至少是一个很好的起点。

我想这在grid图形更容易,但我不得不做一些研究来验证。

+0

感谢您的帮助。 – gung 2012-04-03 02:39:24

4

本文由保罗的Murrell示出了使用的grid图形到两个不同的坐标系之间画线,在具有两个分离的子图的天然空间中指定的端点这种情况下的行:

保罗的Murrell 。网格图形包。 [R新闻,2(2):14-19,2002年6月

它的PDF文章的第17页:

http://cran.r-project.org/doc/Rnews/Rnews_2002-2.pdf

+0

谢谢,我正在阅读文章。 – gung 2012-04-03 02:39:02

+0

是的,感谢那个伟大的链接。我刚刚在我的答案中添加了第三个代码块,它使用了Murrell文章中演示的几个函数('grid.move.to()'和'grid.line.to()')。 – 2012-04-03 05:00:26