将数字刻度更改为levelplot上的字母

时间:2011-06-07 06:57:15

标签: r lattice

我正在研究我的情节的一些细节,我发现了一个我无法绕过的地方。在我的levelplot上是数字标记。现在我想将y轴上的刻度线更改为相应的字母。 (即1 = A,5 = E,27 = AA,29 = AC,......)

我已经用过了

scales=list(
    y=list(alternating=3,labels=toupper(c(letters[1],letters[5],letters[10],letters[15])))))

但我希望他们根据Y轴上的内容而改变,而不是根据我给出的值。 有人可以帮我这个吗?

levelplot(volcano,main="levelplot(volcano)")

enter image description here

2 个答案:

答案 0 :(得分:7)

不是一般解决方案。使用pretty自行计算at

y_at <- pretty(seq_len(ncol(volcano)))
y_labels <- c(LETTERS, outer(LETTERS, LETTERS, paste, sep=""))
levelplot(
    volcano, main="levelplot(volcano)",
    scales=list(y=list(
        alternating=3,
        labels=y_labels[round(y_at)],
        at=y_at
    ))
)

Lattice levelplot with change y axis

答案 1 :(得分:4)

关于聊天的一些讨论表明levelplot()处理热图案例(其中一个或两个变量是离散的/分类的)就好了。因此,我们只需要将数据转换为正确的格式。一种方法是至少将y坐标存储为具有适当级别设置的因子。

首先,按照OP的数据模拟一些数据:

yholes <- c(LETTERS, sort(outer(LETTERS, LETTERS, paste, sep="")))[1:30]
xholes <- seq_along(yholes)
g <- expand.grid(X = xholes, Y = yholes)
set.seed(2)
dat <- with(g, data.frame(Y = factor(Y, levels = yholes), 
                          X = X, 
                          vals = runif(900)))

给出:

R> head(dat)
  Y X      vals
1 A 1 0.1848823
2 A 2 0.7023740
3 A 3 0.5733263
4 A 4 0.1680519
5 A 5 0.9438393
6 A 6 0.9434750

expand.grid()调用的原因是,levelplot()在通过公式方法使用时,我即将使用,需要YX }对于每个数据点(在这种情况下为900)。

然后可以通过levelplot()中的简单公式轻松生成图表:

require(lattice)
levelplot(vals ~ X + Y, data = dat)

产生这个:

levelplot produced by the code