在重新排序因子后正确绘制xyplot线

时间:2012-10-24 12:15:09

标签: r plot data-visualization lattice

当我在重新排序因子之前使用线路连接xyplot时,它为我提供了数据点之间良好的顺序连接:

library(lattice)
fin <- read.csv("http://dl.dropbox.com/u/2505196/unc_vall.csv", header=T)
xyplot(acceptability ~ character | motion, data=fin, col=1, 
       aspect="xy", layout=c(6,1), type="o", scales = list(x = list(rot = 90)))

enter image description here

然后我重新排序因素,一切都搞砸了:

fin$character <- factor(fin$character, levels = c("battle","klank","manny",
                        "skelly","zombie","loman","himan"))

enter image description here

重新排序因素的水平运行良好,值应该到达应有的位置,但不知何故,线路连接的顺序保持不变。我不会想到如何改变我的重新排序以使其有效。

编辑:我应该补充说,该解决方案应具有足够的通用性,可以从包xyplot同时适用于xYplotHmisc

3 个答案:

答案 0 :(得分:3)

我认为,这些线条按照它们在数据中出现的顺序绘制。因此,如果您想获得正确的订购,您可以这样做:

xyplot(acceptability ~ character | motion, data=fin[order(fin$character),], col=1, 
aspect="xy", layout=c(6,1), type="o", scales = list(x = list(rot = 90)))

请注意,data参数已更改。

答案 1 :(得分:2)

设置type=c("a", "p")(代替type="o")可以解决问题:

xyplot(acceptability ~ character | motion, data=fin, col=1,
       aspect="xy", layout=c(6,1), type=c("a", "p"), 
       scales = list(x = list(rot = 90)))

答案 2 :(得分:2)

我认为更好的解决方案是按原样处理数据而不是伪造的东西 - 这里的x轴是一个因素,你应该尊重它。您可以使用panel.average()实现所需目标,但我们也需要在自定义panel.xyplot()函数中调用panel

xyplot(acceptability ~ character | motion, data=fin, col=1, 
       aspect="xy", layout=c(6,1), scales = list(x = list(rot = 90)),
       panel = function(x, y, ...) {
           panel.xyplot(x, y, ...)
           panel.average(x, y, horizontal = FALSE, ...)
       })

完全感谢有一种更简单的方法,因为type = "a"快捷方式会为我们添加panel.average()来电,因此请将情节更改为:

xyplot(acceptability ~ character | motion, data=fin, col=1, 
       aspect="xy", layout=c(6,1),
       type = c("p","a"), ## specify the type!
       scales = list(x = list(rot = 90)))