lattice xyplot panel.abline - 如何根据x值添加不同的水平线?

4
如何在每个图中基于指定的x值绘制水平线?例如,当我在x轴上有X=1时,匹配的点在图中为(1,y0),然后相应地绘制一条水平线Y=y0?
以下是一个使用鸢尾花数据的工作示例,只有在x=0.5处的垂直线:
iris = read.table("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data", sep=',', header=F)
names(iris) = c("sepal.length", "sepal.width", "petal.length", "petal.width", "iris.type")


xyplot(sepal.length ~ petal.width | iris.type, data = iris,
    panel = function(...) {
        panel.abline(v=0.5, lty = "dotted", col = "black")
        panel.xyplot(...)
})

但是我也希望以这种方式显示水平线: 在iris-setosa图(panel)中,通过点(0.5,y)的位置标记了一条水平线 - 我手动绘制了这个线条。我不知道如何在panel.abline中指定y,因为对于每个面板来说,y都是一个不同的变量。
在我的实际数据中,我的x和y存在一对一的关系。
我认为这应该是一个简单的问题,但我不知道如何解决它。希望现在更清楚了。 enter image description here

1
一个工作的例子能够更容易地帮助我们帮助您。除此之外,您有没有查看?panel.abline的帮助函数? - Eric Fail
@EricFail 我添加了一个例子。 - kuki
1个回答

6
编辑:只有一个花瓣宽度值等于0.5,这将确定它并在关联的萼片长度值处绘制一条水平线。
xyplot(sepal.length ~ petal.width | iris.type, data = iris,
    panel = function( x,y,...) {
        panel.abline( h=y[ which(x==0.5) ], lty = "dotted", col = "black")
        panel.xyplot( x,y,...)
})

我测试了一下,确保它也可以处理多个面板中的多个匹配项,事实证明它可以。如果你想要测试多个值,应该这样写:

... (h=y[ which(x %in% values) ] , ...

如果我不这样做,那么肯定会有人指出不需要使用which,因为R支持逻辑索引和数值索引。


是的,我确实需要水平线。但这些水平线应该基于X轴上的值进行分配/决定(比如说,如果X=1,在图表上会有一个点(1,y0)。然后我将绘制一条穿过该点的水平线)。在panel.abline示例中,我看到它们都使用诸如h=c(seq(0,1,0.2))之类的代码,这不能满足我的目的,因为这些是预先指定的。哪部分令人困惑? - kuki
1
仍然不清楚有多少个面板。现在看来,您想基于与向量匹配的X值引用Y值,并且我仍然无法确定这些决策是否应限制在特定面板上。您是说您知道每个面板中都有可以从所有目标向量值中选择的X值,还是说您想为每个面板选择那些X值? - IRTFM
是的,我需要引用。它们应该适用于所有面板。在我发布的示例中,其他两个面板不能有水平线(因为没有点)。但在我的实际数据中,x和y始终是一对一匹配的,并且每个x必须有其y。 - kuki
这对我在绘制多组数据时也很有效。非常聪明,谢谢! - Pablo Adames

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