我一直在尝试最大限度地减少使用Excel而使用R,但在显示简单数据单元时,我仍然坚持使用,这是分析的最后一步.以下示例是我想破解的示例,因为它可以帮助我切换到R,用于我工作流程的这个关键部分.
我想在R中说明以下相关矩阵:
matrix_values <- c(
NA,1.54,1.63,1.15,0.75,0.78,1.04,1.2,0.94,0.89,
17.95,1.54,NA,1.92,1.03,0.78,0.89,0.97,0.86,1.27,
0.95,25.26,1.63,1.92,NA,0.75,0.64,0.61,0.9,0.88,
1.18,0.74,15.01,1.15,1.03,0.75,NA,1.09,1.03,0.93,
0.93,0.92,0.86,23.84,0.75,0.78,0.64,1.09,NA,1.2,
1.01,0.85,0.9,0.88,30.4,0.78,0.89,0.61,1.03,1.2,
NA,1.17,0.86,0.95,1.02,17.64,1.04,0.97,0.9,0.93,
1.01,1.17,NA,0.94,1.09,0.93,17.22,1.2,0.86,0.88,
0.93,0.85,0.86,0.94,NA,0.95,0.96,24.01,0.94,1.27,
1.18,0.92,0.9,0.95,1.09,0.95,NA,1.25,21.19,0.89,
0.95,0.74,0.86,0.88,1.02,0.93,0.96,1.25,NA,18.14)
cor_matrix <- matrix(matrix_values, ncol = 10, nrow = 11)
item_names <- c('Item1','Item2','Item3','Item4','Item5',
'Item6','Item7','Item8','Item9','Item10')
colnames(cor_matrix) <- item_names
rownames(cor_matrix) <- c(item_names, "Size")
Run Code Online (Sandbox Code Playgroud)
细胞应根据其等级进行着色(例如,> 95百分位数是完全绿色,<5百分位数是完全红色).最后一行应该用水平条表示(表示最大值的分数).
我在Excel中创建了我想要的输出:

理想情况下,我还想强调相关组(手动或脚本),如下图所示:

MYa*_*208 14
您的相关矩阵有几个大于1的值,这是不可能的.但无论如何......
试试这个吧
library(reshape2)
dat <- melt(cor_matrix[-11, ])
library(ggplot2)
p <- ggplot(data = dat, aes(x = Var1, y = Var2)) +
geom_tile(aes(fill = value), colour = "white") +
geom_text(aes(label = sprintf("%1.2f",value)), vjust = 1) +
scale_fill_gradient(low = "white", high = "steelblue")
Run Code Online (Sandbox Code Playgroud)
print(p)

Myaseen208在答案上有一个良好的开端.我想我会填写更多的部分:获得你指定的红色/绿色的颜色渐变,翻转y轴的顺序,以及清理其他几个点(灰色背景和图例).
library("reshape2")
library("ggplot2")
cor_dat <- melt(cor_matrix[-11,])
cor_dat$Var1 <- factor(cor_dat$Var1, levels=item_names)
cor_dat$Var2 <- factor(cor_dat$Var2, levels=rev(item_names))
cor_dat$pctile <- rank(cor_dat$value, na.last="keep")/sum(!is.na(cor_dat$value))
ggplot(data = cor_dat, aes(x = Var1, y = Var2)) +
geom_tile(aes(fill = pctile), colour = "white") +
geom_text(aes(label = sprintf("%1.1f",value)), vjust = 1) +
scale_fill_gradientn(colours=c("red","red","white","green","green"),
values=c(0,0.05,0.5,0.95,1),
guide = "none", na.value = "white") +
coord_equal() +
opts(axis.title.x = theme_blank(),
axis.title.y = theme_blank(),
panel.background = theme_blank())
Run Code Online (Sandbox Code Playgroud)

编辑:
现在试图在底部获得蓝色尺寸条.
尺寸条更难的原因是它们是与相关矩阵完全不同的数据表示.因此,我将首先尝试将该部分分开,然后将它们组合在一起.
与cor数据一样,首先从矩阵中提取大小数据,然后将其转换为具有有用值的data.frame,包括总数的分数.
size_dat <- melt(cor_matrix[11,,drop=FALSE])
size_dat$Var2 <- factor(size_dat$Var2, levels=item_names)
size_dat$frac <- size_dat$value / max(size_dat$value)
ggplot(data=size_dat, aes(x=Var2, y=Var1)) +
geom_blank() +
geom_rect(aes(xmin = as.numeric(Var2) - 0.5,
xmax = as.numeric(Var2) - 0.5 + frac),
ymin = -Inf, ymax = Inf, fill="blue", color="white") +
coord_equal() +
opts(axis.title.x = theme_blank(),
axis.title.y = theme_blank(),
panel.background = theme_blank())
Run Code Online (Sandbox Code Playgroud)
该geom_rect调用使用了一些技巧,例如使用分类(离散)变量的数字表示来仔细定位.每个"项目"从低于它的0.5到高于它的0.5.因此,矩形的左边缘在项目值下方为0.5,右边缘frac在其右侧.使用Inf和-Inf为y限制意味着走向图的极端.这给了

现在尝试将它们组合在一起.x标度是常见的,y标度可以是共同的(虽然不相交).玩水平和订单是必要的.另外,我在原版中翻转了x和y(因为它是对称的,所以很好).由于数据集的提取和格式略有不同,我已将其重命名.
cor_dat2 <- melt(cor_matrix[-(nrow(cor_matrix),])
cor_dat2$Var1 <- factor(cor_dat$Var1, levels=rev(c(item_names, "Size")))
cor_dat2$Var2 <- factor(cor_dat$Var2, levels=item_names)
cor_dat2$pctile <- rank(cor_dat$value, na.last="keep")/sum(!is.na(cor_dat$value))
size_dat2 <- melt(cor_matrix["Size",,drop=FALSE])
size_dat2$Var1 <- factor(size_dat$Var1, levels=rev(c(item_names, "Size")))
size_dat2$Var2 <- factor(size_dat$Var2, levels=item_names)
size_dat2$frac <- size_dat$value / max(size_dat$value)
ggplot(data = cor_dat2, aes(x = Var2, y = Var1)) +
geom_tile(aes(fill = pctile), colour = "white") +
geom_text(aes(label = sprintf("%1.1f",value))) +
geom_rect(data=size_dat2,
aes(xmin = as.numeric(Var2) - 0.5,
xmax = as.numeric(Var2) - 0.5 + frac,
ymin = as.numeric(Var1) - 0.5,
ymax = as.numeric(Var1) + 0.5),
fill="lightblue", color="white") +
geom_text(data=size_dat2,
aes(x=Var2, y=Var1, label=sprintf("%.0f", value))) +
scale_fill_gradientn(colours=c("red","red","white","green","green"),
values=c(0,0.05,0.5,0.95,1),
guide = "none", na.value = "white") +
scale_y_discrete(drop = FALSE) +
coord_equal() +
opts(axis.title.x = theme_blank(),
axis.title.y = theme_blank(),
panel.background = theme_blank())
Run Code Online (Sandbox Code Playgroud)

最终版本并不假设它与额外行的10x10相关性.它可以是任何数字.cor_matrix必须具有正确的名称(并且"大小"必须是最后一行)并且item_names必须包含项目列表.但它不一定是10.
这是使用基本图形的方法:
par(mar=c(1, 5, 5, 1))
plot.new()
plot.window(xlim=c(0, 10), ylim=c(0, 11))
quant_vals <- findInterval(cor_matrix[-11, ],
c(-Inf, quantile(cor_matrix[-11, ],
c(0.05, 0.25, 0.45, 0.55, 0.75, 0.95),
na.rm=TRUE),
Inf))
quant_vals[is.na(quant_vals)] <- 4
cols <- c('#ff0000', '#ff6666', '#ffaaaa', '#ffffff', '#aaffaa',
'#66ff66', '#00ff00')
colmat <- matrix(cols[quant_vals], ncol=10, nrow=10)
rasterImage(colmat, 0, 1, 10, 11, interpolate=FALSE)
for (i in seq_along(cor_matrix[11, ])) {
rect(i - 1, 0.1, i - 1 + cor_matrix[11, i]/max(cor_matrix[11, ]), 0.9,
col='lightsteelblue3')
}
text(col(cor_matrix) - 0.5, 11.5 - row(cor_matrix), cor_matrix, font=2)
rect(0, 1, 10, 11)
rect(0, 0, 10, 1)
axis(2, at=(11:1) - 0.5, labels=rownames(cor_matrix), tick=FALSE, las=2)
axis(3, at=(1:10) - 0.5, labels=colnames(cor_matrix), tick=FALSE, las=2)
rect(0, 8, 3, 11, lwd=2)
rect(4, 4, 7, 7, lwd=2)
rect(8, 1, 10, 3, lwd=2)
Run Code Online (Sandbox Code Playgroud)
数据
cor_matrix <- structure(c(NA, 1.54, 1.63, 1.15, 0.75, 0.78, 1.04, 1.2, 0.94,
0.89, 17.95, 1.54, NA, 1.92, 1.03, 0.78, 0.89, 0.97, 0.86, 1.27,
0.95, 25.26, 1.63, 1.92, NA, 0.75, 0.64, 0.61, 0.9, 0.88, 1.18,
0.74, 15.01, 1.15, 1.03, 0.75, NA, 1.09, 1.03, 0.93, 0.93, 0.92,
0.86, 23.84, 0.75, 0.78, 0.64, 1.09, NA, 1.2, 1.01, 0.85, 0.9,
0.88, 30.4, 0.78, 0.89, 0.61, 1.03, 1.2, NA, 1.17, 0.86, 0.95,
1.02, 17.64, 1.04, 0.97, 0.9, 0.93, 1.01, 1.17, NA, 0.94, 1.09,
0.93, 17.22, 1.2, 0.86, 0.88, 0.93, 0.85, 0.86, 0.94, NA, 0.95,
0.96, 24.01, 0.94, 1.27, 1.18, 0.92, 0.9, 0.95, 1.09, 0.95, NA,
1.25, 21.19, 0.89, 0.95, 0.74, 0.86, 0.88, 1.02, 0.93, 0.96,
1.25, NA, 18.14), .Dim = 11:10)
Run Code Online (Sandbox Code Playgroud)