2

我正在研究我的情节的一些细节,但我发现了一个我无法解决的问题。在我的水平图上是数字刻度线。现在我希望将 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)")

在此处输入图像描述

4

2 回答 2

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
    ))
)

改变 y 轴的晶格水平图

于 2011-06-07T07:44:30.440 回答
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(),当通过我即将使用的公式方法使用时,每个数据点都需要 aY和 a (在这种情况下为 900 个)。X

然后可以通过以下简单公式轻松生成该图levelplot()

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

产生这个:

代码产生的levelplot

于 2011-06-07T08:42:22.353 回答