使用geom_tile可视化数据表格?

3

我正在尝试展示对两个调查问题的回答密度和相关性。每个问题的回答因素为1-5,我想制作一个反应组合表的热图。

我的表格如下:

> table(mydata$v47, mydata$v78)

     1  2  3  4  5
  1  2  0  0  0  0
  2  0  2  2  0  0
  3  5  7  8  3  0
  4 12 11 14  7  1
  5  1  1  2  4  1

我应该传递哪个填充函数给geom_tile,以便通过频率区分表中的热门对?

这段代码:

ggplot(data = mydata, aes(x = v47, y = v78)) + geom_tile()

产生这张图片的结果如下:

丑陋的表格


1
一种方法是重新塑造您的数据:ggplot(data = reshape2::melt(table(mydata$v47, mydata$v78)), aes(x = Var1, y = Var2, fill=value)) + geom_tile()。您可能希望将 fill 变量设置为因子。 - user20650
@user20650 我认为那就是最佳答案,所以你不妨这样发布它 :p - MattLBeck
1
data.frame(table(mydata$v47, mydata$v78))melt 是相同的。 - Khashaa
所以这是@Khashaa的问题,请写出一个答案。 - user20650
与Luke的回答相同,corrplot包可能会有用:corrplot::corrplot(table(mydata$v47, mydata$v78), is.corr=F, method="square") - user20650
1个回答

4
这是前一个ggflucation()的修改版,它将瓷砖的颜色和大小映射到频率上:
mydata <- read.table(header = F, text = "
0  1  2  3  4  5
1  2  0  0  0  0
2  0  2  2  0  0
3  5  7  8  3  0
4 12 11 14  7  1
5  1  1  2  4  1")
library(ggplot2)
library(magrittr)
tab <- as.table(t(as.matrix(mydata[-1, -1])) %>% set_colnames(1:5) %>% set_rownames(1:5))

ggfluc <- function(tab) {
  if (is.table(tab)) 
    tab <- as.data.frame(t(tab)) 
  tab <- as.data.frame(tab) 
  oldnames <- names(tab) 
  names(tab) <- c("x", "y", "result") 
  tab <- transform(tab, x = as.factor(x), y = as.factor(y), freq = result) 
  ceiling = max(tab$freq); floor = 0 
  tab <- transform(tab, freq = sqrt(pmin(freq, ceiling)/ceiling), 
                   border = ifelse(is.na(freq), "grey90", ifelse(freq > ceiling, "grey30", "grey50"))) 
  tab[is.na(tab$freq), "freq"] <- 1 
  tab <- subset(tab, freq * ceiling >= floor) 
  nx <- length(levels(tab$x)) 
  ny <- length(levels(tab$y)) 
  p <- ggplot(tab, aes_string(x = "x", y = "y", height = "freq", width = "freq", fill = "result")) + 
    geom_tile(colour = "white")
  p
}
ggfluc(tab)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接