2012-07-20 94 views
5

我一直试图尽量减少使用Excel来支持R,但是在显示简单数据单元时,我仍然陷入了困境,因为它通常需要作为最后一步一个分析。下面的例子是我想要破解的,因为它可以帮助我在工作流程的关键部分切换到R。R中的相关矩阵的绘图如Excel中的示例

我想说明中的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") 

细胞应该根据它们的等级进行着色(例如> 95百分位是完全绿色,< 5百分位是完全红色)。最后一行应该用水平条表示(表示最大值的分数)。

我已经在Excel制成,我想输出有: correlation matrix

理想情况下,我也想强调相关组(手动或通过脚本),如以下说明: correlation matrix with highlights

回答

2

下面是使用基本图形的方法:

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

蛮力但有效! – nassimhddd 2012-07-21 17:03:42

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

print(p)

enter image description here

+1

+1'geom_tile'。我需要记住这一点。 – Andrie 2012-07-20 15:31:54

+0

看起来不错(我喜欢ggplot2风格)!你是对的,它不是一个真正的相关矩阵,但仍然有某种形式的亲和力(1表示中性)......我应该已经将数据转换为对标题更加准确。你认为你可以帮助最后一行吗? – nassimhddd 2012-07-20 17:11:24

5

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

enter image description here

编辑:

现在试图让在底部的蓝色大小酒吧。

尺寸条的难点在于它们是与相关矩阵完全不同的数据表示。所以我会先尝试把这个部分分开,然后把它们放在一起。

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

geom_rect调用使用一些技巧诸如使用分类(离散的)变量的数值表示仔细定位的东西。每个“项目”从0.5下降到0.5以上。因此矩形的左边缘在项目值的下方为0.5,右边缘的右边缘为frac。对于y限制,使用Inf-Inf表示转到绘图极值。这给

enter image description here

我们试图把它们放在一起。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()) 

enter image description here

这最后的版本不认为它是一个额外的行中的10×10的相关性。它可以是任何数字。 cor_matrix必须具有正确的名称(并且“大小”必须是最后一行)并且item_names必须包含项目列表。不过,这并不必须是10

+0

非常感谢您接近原创。是的,酒吧应该是最大价值的一小部分(只是更新了问题来指定这个)......你有解决方案吗? – nassimhddd 2012-07-20 17:15:02

+0

@Brian:很好的解决方案。在过去,我有一个[类似的问题](http://stackoverflow.com/q/10981324/707145)。你能给我一个简单的解决方案吗?谢谢 – MYaseen208 2012-07-20 17:55:58

+0

+1非常感谢你!这激励我深入挖掘ggplot。 – nassimhddd 2012-07-21 16:55:17