如何在xyplot()中控制面板顺序?

3

xyplot()中,R通过字母顺序(对于字符串)或水平顺序(对于因子)来确定面板的顺序。我有一些日期数据,但它们是以文本形式存在的,我希望按照时间顺序而不是字母顺序显示它们。

x <- sample(1:10, 10, replace = TRUE)
y <- sample(1:10, 10, replace = TRUE)
# overlapping 2010 and 2011
date <- rep(as.Date("2010-01-01") + sort(sample(200:400, 5)), each = 2)
striptext <- format(date, "%d-%b ...")
df <- data.frame(x, y, date, striptext)

这个很好用:

xyplot(y ~ x | date, data = df)

但这会使日期顺序颠倒:
xyplot(y ~ x | striptext, data = df)

我不想在条带中显示完整日期,但是我希望它们按正确的顺序显示。除了将 striptext 转换为有序因子之外,是否还有其他解决方案?


1
我认为你忽略的主要问题是striptextxyplot内被强制转换为因子,如果没有提供levels,则结果因子的级别按字母顺序排列。考虑使用levels(factor(striptext))levels(factor(striptext, levels = unique(striptext)))。你的问题的真正答案是先将你的条件变量设置为一个因子,并按照你想要的方式排序级别。 - Gavin Simpson
1个回答

4

striptext的级别明确设置并将其存储为因子,这样lattice就不必为您执行强制转换(这就是级别以字母顺序结束的地方):

set.seed(1)
x <- sample(1:10, 10, replace = TRUE)
y <- sample(1:10, 10, replace = TRUE)
# overlapping 2010 and 2011
date <- rep(as.Date("2010-01-01") + sort(sample(200:400, 5)), each = 2)
striptext <- format(date, "%d-%b ...")
## set the levels explicitly
df <- data.frame(x, y, date, 
                 striptext = factor(striptext, levels = unique(striptext)))
xyplot(y ~ x | striptext, data = df)

这就是它。默认情况下,factor会对水平进行排序,但unique会按照它们被发现的顺序保留它们。 - J. Win.

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