在R中重建频率热图

时间:2015-08-20 13:34:50

标签: r

我需要一些帮助,用我自己的数据重建下面的情节。该图显示了根据不同标准排列的个体并切成十分位数。然后,对于每对十分位数,计算个体数量。

例如,第一个单元格= 87.两个排名标准中有87个人排在最低十分位数(0-10)。

heatmap-weigel

解释不是最重要的,但如何在R中创建它是。我知道我应该开始学习ggplot2,但目前我没有时间学习它。

所以,我尝试在一个简单的随机创建的数据集上使用pairs重新创建它:

library(data.table)
set.seed(3546)
y <- rep(1:5, 5)
x <- rep(1:5, rep(5,5))
z <- sample.int(100, 25)
dt <- data.table(x = x, y = y, z = z)
dt <- dcast.data.table(dt, y~x, value.var = "z")[,y := NULL]

这是我的代码的开始,但我很快意识到我无法弄清楚如何访问正在绘制哪个面板的索引。整列被插入到panel函数中。实际上,我只需要与绘制哪个面板相对应的元素。

pairs(dt, gap = 0L, labels = NULL, xaxt = "n", yaxt = "n", 
      panel = function(x, y, ...){
        usr <- par("usr"); on.exit(par(usr))
        count <- x[1L]
        par(usr = c(0, 1, 0, 1))
        text(0.5, 0.5, count, font = 2, cex = 2)
      })

有什么建议吗?欢迎ggplot回答。

[溶液]

感谢A. Webb,r-base使用矢量化。

library(data.table)
set.seed(3546)
y <- rep(1:5, 5)
x <- rep(1:5, rep(5,5))
z <- sample.int(100, 25)
color <- c("darkgreen", "green", "yellow", "red", "darkred")
dt <- data.table(x = x, y = y, z = z)
dt[,bg := color[abs(x - y) + 1L]]
op <- par(no.readonly = TRUE) 
par(mar = c(0, 0, 0 , 0), oma = c(0, 3, 3, 0))
plot.new()
plot.window(xlim = c(0, max(dt$x)), ylim = c(max(dt$y), 0))
with(dt, rect(x-1, y-1, x, y, col = bg))
with(dt, text(x-0.5, y-0.5, z, font = 2, cex = 2))
par(op)

final_solution

1 个答案:

答案 0 :(得分:2)

以您的样本dt为起点,我们需要进行一些预处理。

    1  2  3  4   5
1: 28 43 45 16 100
2: 60 24 21 61  14
3: 54 49 17 42  29
4: 75 80 76 27  88
5: 56 39 34 53  19

我还不熟悉data.table或Hadley的工具链,所以我将在基础R中进行先决条件数据争论。

X<-cbind(arrayInd(1:(nrow(dt)*ncol(dt)),.dim=dim(dt)),c(as.matrix(dt)))
X<-setNames(as.data.frame(X),c("row","col","val"))
X<-transform(X,fill=factor(abs(row-col)))

这给出了一个长格式,其中的列指示了行号,列号和指示着色的因子级别。

geom_tile

中的基本ggplot2
ggplot(X,aes(x=col,y=row)) +
  geom_tile(aes(fill=fill)) +
  scale_fill_brewer(palette="Spectral") +
  geom_text(aes(label=val)) +
  scale_y_reverse()

tile

只使用基本绘图材料,利用recttext的矢量化

plot.new()
plot.window(xlim=c(0,max(X$col)),ylim=c(max(X$row),0),asp=1)
with(X,rect(col-1,row-1,col,row,col=rainbow(5)[fill]))
with(X,text(col-0.5,row-0.5,val,font=2,cex=2))

enter image description here