Reputation: 180
I want to create a heatmap of p-values with the outcome of a pairwise.wilcox.test. So, after performing the test, I reshape the outcome:
test <- pairwise.wilcox.test(world$mean, world$con, p.adjust.method ="bonferroni",conf.level = 0.95)
test.result <- melt (test[[3]],na.rm=T)
The outcome is the following:
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
Then I run a ggplot2 script to get the heatmap:
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()
The outcome is the following figure:
As you can see the figure is not sorted in the diagonal, is kind of sloppy... I dont know how to arrange correctly the figure in order to get all the p values in the diagonal. Thanks for your help
The figure that I'm looking for is like this:
Upvotes: 1
Views: 450
Reputation: 145775
I think this is what you want?:
Calling your data tr
:
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's comment was correct in that we need the factors to have the same levels/same order. The comment didn't quite work because africa
was omitted. Fixing that:
lev = c("europe", "namerica", "samerica", "asia", "africa")
tr$X1 <- factor(tr$X1, levels = lev)
trX2 <- factor(tr$X2, levels = lev)
We can now make a plot. Some corrections here
data$column
inside aes()
- use unquoted column names.fill = value
in the top ggplot()
call, no need to reiterate it for the geom_tile()
layer.value
seems to be continuous. scale_fill_brewer
implies a discrete scale, so cannot be used here. It seems fine without, but you could also try scale_fill_distiller
.+
.This code works:
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()
Also note that the exact diagonal of 1's is missing here (unlike in your mtcars
example) because it is missing from your data. That is, africa
is completely absent from X1
and asia
is completely absent from X2
. If you want to plot those tiles, you will need to augment your data with those rows.
Upvotes: 1