首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何安排一个草率的热图r

如何安排一个草率的热图r
EN

Stack Overflow用户
提问于 2016-08-03 10:39:29
回答 1查看 401关注 0票数 1

我想要创建一个带有pairwise.wilcox.test结果的p值热图。所以,在做完测试之后,我重塑了结果:

代码语言:javascript
复制
test <- pairwise.wilcox.test(world$mean, world$con, p.adjust.method ="bonferroni",conf.level = 0.95)
test.result <- melt (test[[3]],na.rm=T)

结果如下:

代码语言:javascript
复制
     X1       X2        value
1    europe   africa 7.216273e-20
2  namerica   africa 2.694228e-23
3  samerica   africa 1.001953e-01
4      asia   africa 3.515077e-66
5    europe   europe           NA
6  namerica   europe 6.551144e-02
7  samerica   europe 2.615654e-05
8      asia   europe 2.148064e-09
9    europe namerica           NA
10 namerica namerica           NA
11 samerica namerica 4.894171e-10
12     asia namerica 3.642124e-02
13   europe samerica           NA
14 namerica samerica           NA
15 samerica samerica           NA
16     asia samerica 5.999172e-25

然后运行一个ggplot2脚本来获取热图:

代码语言:javascript
复制
test.result$X1 <- factor(test.result$X1, levels = c("europe", "namerica", "samerica", "asia"))
test.result$X2 <- factor(test.result$X2, levels = c("europe", "namerica", "samerica","asia"))

test.result$value<-cut(test.result$value, breaks=c(-Inf,0.001,0.05,1),right=F)

ggplot(data = test.result, aes(X1, X2, fill = value)) +
  geom_tile(aes(fill=test.result$value),color="white") +
  scale_fill_brewer(palette="Blues",name="p-Val")
  theme_minimal() + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, 
                                   size = 12, hjust = 1)) +
  coord_fixed()

结果如下:

如你所见,这个图形没有在对角线上排序,有点草率.我不知道如何正确地排列这个数字,以便得到对角线中的所有p值。谢谢你的帮忙

我要找的数字是这样的:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-03 21:03:15

我想这就是你想要的?:

调用数据tr

代码语言:javascript
复制
tr = structure(list(X1 = structure(c(2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L), .Label = c("asia", "europe", 
"namerica", "samerica"), class = "factor"), X2 = structure(c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("africa", 
"europe", "namerica", "samerica"), class = "factor"), value = c(7.216273e-20, 
2.694228e-23, 0.1001953, 3.515077e-66, NA, 0.06551144, 2.615654e-05, 
2.148064e-09, NA, NA, 4.894171e-10, 0.03642124, NA, NA, NA, 5.999172e-25
)), .Names = c("X1", "X2", "value"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16"))

Swarch的评论是正确的,因为我们需要有相同的水平/相同的顺序的因素。由于省略了africa,这条评论不太管用。解决办法是:

代码语言:javascript
复制
lev = c("europe", "namerica", "samerica", "asia", "africa")
tr$X1 <- factor(tr$X1, levels = lev)
trX2 <- factor(tr$X2, levels = lev)

我们现在可以做个阴谋了。这里的一些修正

  1. 从不aes()中使用data$column -使用未引号的列名。
  2. 如果您在顶部的fill = value调用中指定了ggplot(),则无需为geom_tile()层重复该调用。
  3. 您的value似乎是连续的。scale_fill_brewer意味着一个离散的尺度,所以不能在这里使用。没有它似乎很好,但您也可以尝试scale_fill_distiller
  4. 您问题中的代码缺少一个+

此代码适用于:

代码语言:javascript
复制
ggplot(data = tr, aes(X1, X2, fill = value)) +
    geom_tile(color = "white") +
    theme_minimal() +
    theme(axis.text.x = element_text(
        angle = 45,
        vjust = 1,
        size = 12,
        hjust = 1
    )) +
    coord_fixed()

还请注意,这里缺少精确的1的对角线(与您的mtcars示例不同),因为数据中缺少它。也就是说,africa完全不存在于X1中,asia完全不存在于X2中。如果要绘制这些块,则需要使用这些行来增加数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38741241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档