Question: Resolving Errors Using Ggplot2 To Create A Heatmap Of P-Values In R
1
gravatar for soosus
7.2 years ago by
soosus80
soosus80 wrote:

I want to take two data files formatted like this (they have the same column names and numbers of rows):

Basal Part of Pons,Ventral Thalamus,Cingulate gyrus,Insula,Epithalamus,Subthalamus,Brain,Occipital Lobe,Sulci & Spaces,White Matter,parahippocampal gyrus,hippocampal formation,Amygdala,Temporal Lobe,Dorsal Thalamus,Striatum,Hypothalamus,Pontine Tegmentum,Claustrum,Parietal Lobe,Myelencephalon,Basal Forebrain,Cerebellar Cortex,Frontal Lobe,Mesencephalon,Cerebellar Nuclei,Globus Pallidus
-0.5105,0.6625,0.0766,0.0524,0.9915,0.893,-0.3535,-0.0379,-3.2603,-1.4482,0.2761,-1.0088,0.6528,-0.0975,0.9191,0.3016,0.5294,1.0021,0.3865,0.2589,-0.6714,0.781,-1.7963,-0.0369,0.9029,-0.2741,1.6183
-0.1625,0.5075,0.1778,-0.0632,0.8538,0.2927,0.5709,0.196,-2.6836,-1.257,0.4551,-0.8525,0.6108,0.0671,1.0538,0.4313,0.0279,1.1387,-0.096,0.3523,-0.234,0.274,-1.369,-0.2009,0.9535,-0.5611,2.0123
-0.3898,0.1021,0.0307,-0.0371,0.9827,0.6934,-0.338,0.0955,-3.0394,-1.2211,0.2884,-0.8627,0.6386,0.0049,0.8265,0.2864,0.6961,1.3572,0.0489,0.3126,-0.3914,0.6972,-1.6167,-0.1053,0.7518,-0.3766,1.6506
0.1088,0.0494,0.1181,-0.0748,-0.3126,0.4604,-0.0889,0.1592,-4.3136,-0.9078,0.3811,0.7862,1.2036,0.0158,0.9225,0.2069,-0.2604,0.9254,-0.0636,-0.0582,-0.9273,1.0495,-1.9163,0.1125,0.9812,0.0498,1.5284

Basal Part of Pons,Ventral Thalamus,Cingulate gyrus,Insula,Epithalamus,Subthalamus,Brain,Occipital Lobe,Sulci & Spaces,White Matter,parahippocampal gyrus,hippocampal formation,Amygdala,Temporal Lobe,Dorsal Thalamus,Striatum,Hypothalamus,Pontine Tegmentum,Claustrum,Parietal Lobe,Myelencephalon,Basal Forebrain,Cerebellar Cortex,Frontal Lobe,Mesencephalon,Cerebellar Nuclei,Globus Pallidus
-0.2775,0.797,0.0568,-0.1309,1.6462,1.2986,1.0686,-0.1036,0.4154,-1.2079,0.0856,1.2651,0.7292,-0.3591,0.1812,0.6074,2.3187,0.2195,-0.169,0.0673,-0.1764,0.0646,-1.654,0.2921,0.0124,-0.2394,0.8549
0.1197,1.1071,-0.0443,-0.4927,1.2885,1.2452,0.4405,-0.7088,0.521,-0.8329,-0.0298,0.8744,0.5725,-0.3593,0.3811,0.3541,2.1534,0.3472,0.0872,-0.3771,0.157,0.1501,-1.5639,-0.2189,0.0707,0.2236,0.7358
-0.2681,0.8626,0.0542,-0.2743,1.1994,1.4469,0.2456,-0.4497,0.6358,-1.5276,-0.1589,1.426,0.3706,-0.2407,0.4211,0.3877,1.6355,0.1553,-0.1514,-0.1327,-0.0361,0.2013,-1.6199,-0.3371,0.2642,0.0503,0.5735
0.2719,0.1608,0.045,-0.3166,2.5749,0.7839,0.8872,-0.221,0.0046,-0.5548,-0.0274,-0.0425,0.8472,-0.1472,0.4912,0.3156,2.3168,-0.4321,-0.6155,-0.3571,2.8559,0.6661,-1.9877,-0.347,1.4582,-0.1525,0.6299

And generate a heatmap based on the p-values of the

m1 = read.csv("m1file.csv")
m2 = read.csv("m2file.csv")
test.result = mapply(t.test, m1, m2)
p.values = stack(mapply(function(x, y) t.test(x,y)$p.value, m1, m2))
matrix.m1 = as.matrix(m1)
matrix.m2 = as.matrix(m2)
fun = Vectorize(function(i,j) t.test(matrix.m1[,i],matrix.m2[,j])$p.value)
res = outer(1:27,1:27,FUN = "fun")
image(1:27,1:27,res,axes=FALSE,xlab="m1",ylab="m2")
axis(1, at = 1:27,labels=colnames(m1))
axis(2, at = 1:27,labels=colnames(m2))

This gives me one solution, but not quite what I'm looking for. I try this:

colnames(res) <- colnames(m1)
res <-as.data.frame(res)
res$group <- colnames(m1)

library(reshape2)
res <- melt(res,id="group")

library(ggplot2)
p <- ggplot(res, aes(x=group, y=variable)) + 
  geom_tile(aes(fill = value), colour =   "yellow") + 
  scale_fill_gradient(low = "yellow", high = "red", name="p-value") +
  geom_text(aes(label=format(value,digits=2))) +
  labs(x="m1",y="m2")

print(p)

And it's satisfactory with the exception of not having having a title or the x-axis labels oriented vertically. Also, showing the p-values explicitly turns out to be too messy. So I update to the following:

colnames(res) <- colnames(maoa)
res <-as.data.frame(res)
res$group <- colnames(maoa)

library(reshape2)
res <- melt(res,id="group")

library(ggplot2)
p <- ggplot(res, aes(x=group, y=variable)) +
geom_tile(aes(fill = value), colour = "yellow") +
scale_fill_gradient(low = "yellow", high = "red", name="p-value") +
ggtitle("title") +
theme(axis.text.x=element_text(angle=90) +
labs(x="m1",y="m2")

print(p)

But I get an error saying: "Error: unexpected symbol in: " print". I don't think I'm changing the spacing here when I add the new commands, so I'm confused as to why this is happening. Also, if I change nothing from the first ggplot2 code provided here except omit the line "geom_text(aes(label=format(value,digits=2))) +", I get an error saying "Error: Discrete value supplied to continuous scale". Help?

R heatmap • 4.1k views
ADD COMMENTlink modified 7.2 years ago by Jeremy Leipzig19k • written 7.2 years ago by soosus80

can you provide another input file, so we can test your code and see how to answer you? Preferably, can you provide both as comma-separated files?

  • suggestion1: never call a function "fun".
  • suggestion2: in your input file, there are two columns called reg6
ADD REPLYlink modified 7.2 years ago • written 7.2 years ago by Giovanni M Dall'Olio27k

I have added input files. And yeah, ordinarily I wouldn't call a function "fun", it's just a placeholder in this case.

ADD REPLYlink modified 7.2 years ago • written 7.2 years ago by soosus80
1
gravatar for Jeremy Leipzig
7.2 years ago by
Philadelphia, PA
Jeremy Leipzig19k wrote:

looks like you didn't close parenthesis here:

theme(axis.text.x=element_text(angle=90) +
ADD COMMENTlink written 7.2 years ago by Jeremy Leipzig19k

Good eye, thanks!

ADD REPLYlink written 7.2 years ago by soosus80
Please log in to add an answer.

Help
Access

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.
Powered by Biostar version 2.3.0
Traffic: 1573 users visited in the last hour