我需要一些帮助,用我自己的数据重建下面的情节。该图显示了根据不同标准排列的个体并切成十分位数。然后,对于每对十分位数,计算个体数量。
例如,第一个单元格= 87.两个排名标准中有87个人排在最低十分位数(0-10)。
解释不是最重要的,但如何在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)
答案 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()
只使用基本绘图材料,利用rect
和text
的矢量化
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))