Hi all! I want to generate a heat map from an all-vs-all comparison. I have the data, already scaled to 0-1. However, I have the values only for the comparisons in one way, and not for the comparisons between the same group (which are always 1), i.e. I have half the matrix and am missing the other half and the diagonal. What is a good way to get it into a form that ggplot2 can use for the heat map? This is an example of the data I have: A B value T1 T2 0.347 T1 T3 0.669 T2 T3 0.214 I assume the following is what I need for ggplot (or maybe I don't, if ggplot can somehow generate it?): A B value T1 T2 0.347 T1 T3 0.669 T2 T3 0.214 T2 T1 0.347 T3 T1 0.669 T3 T2 0.214 T1 T1 1 T2 T2 1 T3 T3 1 Then I would run sorted<-data[order(data$A, data$B), ] ggplot(sorted, aes(A, B)) + geom_tile(aes(fill = value), colour = "white") + scale_fill_gradient(low = "black", high = "red") + I have solved this, but in (what I assume is) a really bad way involving for loops. There must be a better way to get form the first data frame above to the second! Cheers, Till -- Till Bayer 4700 King Abdullah University for Science and Technology Building 2, Room 2227 Thuwal 23955-6900 Saudi Arabia Phone: +96628082373
Hadley Wickham
2012-Apr-11 20:28 UTC
[R] extend data frame for plotting heat map in ggplot2
On Sun, Apr 1, 2012 at 9:16 AM, Till Bayer <till.bayer at kaust.edu.sa> wrote:> Hi all! > > I want to generate a heat map from an all-vs-all comparison. I have the > data, already scaled to 0-1. However, I have the values only for the > comparisons in one way, and not for the comparisons between the same group > (which are always 1), i.e. I have half the matrix and am missing the other > half and the diagonal. > What is a good way to get it into a form that ggplot2 can use for the heat > map? > > This is an example of the data I have: > > A ? ? ? B ? ? ? value > T1 ? ? ?T2 ? ? ?0.347 > T1 ? ? ?T3 ? ? ?0.669 > T2 ? ? ?T3 ? ? ?0.214 > > I assume the following is what I need for ggplot (or maybe I don't, if > ggplot can somehow generate it?): > > A ? ? ? B ? ? ? value > T1 ? ? ?T2 ? ? ?0.347 > T1 ? ? ?T3 ? ? ?0.669 > T2 ? ? ?T3 ? ? ?0.214 > T2 ? ? ?T1 ? ? ?0.347 > T3 ? ? ?T1 ? ? ?0.669 > T3 ? ? ?T2 ? ? ?0.214 > T1 ? ? ?T1 ? ? ?1 > T2 ? ? ?T2 ? ? ?1 > T3 ? ? ?T3 ? ? ?1You can usually do something like: df <- data.frame(A = 1:2, B = 3:4, value = runif(2)) all <- expand.grid(unique(df[c("A", "B")])) merge(all, df, all = T) Hadley -- Assistant Professor / Dobelman Family Junior Chair Department of Statistics / Rice University http://had.co.nz/