2015-03-27 51 views
7

Tôi có một bản đồ nhiệt tiếp tục ngày càng phức tạp hơn. Ví dụ về dữ liệu được làm nóng:ggplot2: Phức tạp phức tạp hơn

head(df2) 
    Class  Subclass   Family    variable value 
1  A chemosensory family_1005117 caenorhabditis_elegans 10 
2  A chemosensory family_1011230 caenorhabditis_elegans  4 
3  A chemosensory family_1022539 caenorhabditis_elegans 10 
4  A  other family_1025293 caenorhabditis_elegans NA 
5  A chemosensory family_1031345 caenorhabditis_elegans 10 
6  A chemosensory family_1033309 caenorhabditis_elegans 10 
tail(df2) 
    Class Subclass  Family  variable value 
6496  C class c family_455391 trichuris_muris  1 
6497  C class c family_812893 trichuris_muris NA 
6498  F class f family_225491 trichuris_muris  1 
6499  F class f family_236822 trichuris_muris  1 
6500  F class f family_276074 trichuris_muris  1 
6501  F class f family_768194 trichuris_muris NA 

Sử dụng ggplot2 và geom_tile, tôi có thể tạo bản đồ nhiệt tuyệt vời của dữ liệu. Tôi tự hào của mã (đây là kinh nghiệm đầu tiên của tôi trong R), do đó đã đăng nó dưới đây:

df2[df2 == 0] <- NA 
df2[df2 > 11] <- 10 
df2.t <- data.table(df2) 
df2.t[, clade := ifelse(variable %in% c("pristionchus_pacificus", "caenorhabditis_elegans", "ancylostoma_ceylanicum", "necator_americanus", "nippostrongylus_brasiliensis", "angiostrongylus_costaricensis", "dictyocaulus_viviparus", "haemonchus_contortus"), "Clade V", 
       ifelse(variable %in% c("meloidogyne_hapla","panagrellus_redivivus", "rhabditophanes_kr3021", "strongyloides_ratti"), "Clade IV", 
       ifelse(variable %in% c("toxocara_canis", "dracunculus_medinensis", "loa_loa", "onchocerca_volvulus", "ascaris_suum", "brugia_malayi", "litomosoides_sigmodontis", "syphacia_muris", "thelazia_callipaeda"), "Clade III", 
       ifelse(variable %in% c("romanomermis_culicivorax", "trichinella_spiralis", "trichuris_muris"), "Clade I", 
       ifelse(variable %in% c("echinococcus_multilocularis", "hymenolepis_microstoma", "mesocestoides_corti", "taenia_solium", "schistocephalus_solidus"), "Cestoda", 
       ifelse(variable %in% c("clonorchis_sinensis", "fasciola_hepatica", "schistosoma_japonicum", "schistosoma_mansoni"), "Trematoda", NA))))))] 
df2.t$clade <- factor(df2.t$clade, levels = c("Clade I", "Clade III", "Clade IV", "Clade V", "Cestoda", "Trematoda")) 
plot2 <- ggplot(df2.t, aes(variable, Family)) 
tile2 <- plot2 + geom_tile(aes(fill = value)) + facet_grid(Class ~ clade, scales = "free", space = "free") 
tile2 <- tile2 + scale_x_discrete(expand = c(0,0)) + scale_y_discrete(expand = c(0,0)) 
tile2 <- tile2 + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), legend.position = "right", axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.55), axis.text.y = element_text(size = rel(0.35)), panel.border = element_rect(fill=NA,color="grey", size=0.5, linetype="solid")) 
tile2 <- tile2 + xlab(NULL) 
tile2 <- tile2 + scale_fill_gradientn(breaks = c(1,2,3,4,5,6,7,8,9,10),labels = c("1", "2", "3", "4", "5", "6", "7", "8", "9", ">10"), limits = c(1, 10), colours = palette(11), na.value = "white", name = "Members")' 

Như bạn thấy, có khá nhiều sắp xếp lại thủ công tham gia, nếu không mã là khá đơn giản . Dưới đây là những hình ảnh đầu ra:

heatmap

Tuy nhiên, bạn có thể nhận thấy rằng một cột toàn bộ thông tin, "Thứ hạng" không được sử dụng. Về cơ bản, mỗi phân lớp phù hợp trong một lớp. Nó sẽ là hoàn hảo nếu tôi đã có thể facet các Subclasses trong lớp Facet đã được hiển thị. Theo như tôi biết, điều này là không thể. Để chính xác, chỉ có loại A có các lớp con khác nhau. Các lớp khác chỉ đơn giản là có tên lớp được nhân đôi (F = lớp f). Có cách nào khác để tổ chức bản đồ nhiệt này để tôi có thể hiển thị tất cả thông tin liên quan không? Các lớp con bị thiếu chứa một số dữ liệu quan trọng nhất và sẽ là cần thiết nhất để vẽ các suy luận từ dữ liệu.

Một phương pháp thay thế sẽ là khía cạnh Subclases thay vì Classes, sắp xếp lại chúng theo cách thủ công để các lớp được nhóm lại với nhau, và sau đó vẽ một số hộp xung quanh chúng để phân định từng lớp. Tôi không có ý tưởng làm thế nào điều này sẽ được thực hiện.

Mọi trợ giúp sẽ rất hữu ích. Vui lòng cho tôi biết nếu bạn cần bất kỳ thông tin bổ sung nào.

+0

Nơi bạn có 'facet_grid (Lớp ~ nhánh,', thay đổi nó cho 'facet_grid (Lớp + Subclass ~ nhánh,' – Gregor

+0

Mặc dù, cho đặt hàng của các nhãn, bạn có thể muốn 'Subclass + Class' – Gregor

+0

Đó là một cách để làm điều đó, cảm ơn bạn.Đó không chính xác những gì tôi đã hình dung (các khía cạnh lồng nhau), vì nó đơn giản là chia nhỏ nó thành các lớp con và sau đó thêm nhãn Lớp, tôi đoán nó không đẹp như tôi giống như, nhưng có lẽ đó là tốt như nó nhận được.Cảm ơn cho đầu vào của bạn, @Gregor – Nic

Trả lời

7

Điều này sẽ đặt một dải mới ở bên phải của dải orignal và bên trái của chú giải.

library(ggplot2) 
library(gtable) 
library(grid) 

p <- ggplot(mtcars, aes(mpg, wt, colour = factor(vs))) + geom_point() 
p <- p + facet_grid(cyl ~ gear) 

# Convert the plot to a grob 
gt <- ggplotGrob(p) 

# Get the positions of the right strips in the layout: t = top, l = left, ... 
strip <-c(subset(gt$layout, grepl("strip-r", gt$layout$name), select = t:r)) 

# New column to the right of current strip 
gt <- gtable_add_cols(gt, gt$widths[9], max(strip$r)) 

# Add grob, the new strip, into new column 
gt <- gtable_add_grob(gt, 
    list(rectGrob(gp = gpar(col = NA, fill = "grey85", size = .5)), 
    textGrob("Number of Cylinders", rot = -90, vjust = .27, 
     gp = gpar(cex = .75, fontface = "bold", col = "black"))), 
     t = min(strip$t), l = max(strip$r) + 1, b = max(strip$b), name = c("a", "b")) 

# Add small gap between strips 
gt <- gtable_add_cols(gt, unit(1/5, "line"), max(strip$r)) 

# Draw it 
grid.newpage() 
grid.draw(gt) 

enter image description here

2

Biến nhận xét của tôi vào một câu trả lời với một số dữ liệu bản demo đơn giản:

Đây không phải là khó khăn (thậm chí còn có ví dụ trong ?facet_grid, mặc dù họ đang hướng về phía dưới).

# generate some nested data 
dat = data.frame(x = rnorm(12), y = rnorm(12), class = rep(LETTERS[1:2], each = 6), 
       subclass = rep(letters[1:6], each = 2)) 

# plot it 
ggplot(dat, aes(x, y)) + geom_point() + 
    facet_grid(subclass + class ~ .) 

Bạn có thể thực hiện việc này với nhiều yếu tố tùy ý ở hai bên của ~!

+0

Chức năng, đó là chính xác những gì tôi muốn. về mặt thẩm mỹ, nó không phải là những gì tôi đang tìm kiếm. Nhưng đó có lẽ là vấn đề của tôi, chứ không phải của ggplot2. Tôi không thích làm thế nào nó lặp lại các nhãn Class cho mọi Subclass lồng nhau. Tôi có ý nghĩa không? Với tôi, có vẻ như cách đúng đắn để làm điều đó là có một thanh Class lớn hơn (vùng nhãn màu xám) bao trùm toàn bộ dữ liệu mà nó chứa với một tập hợp con các nhãn lớp con lồng nhau. @Gregor – Nic

+0

@Nic Vâng, tôi hiểu ngay bây giờ. Vấn đề là 'ggplot' không biết rằng các yếu tố được lồng nhau, do đó, giải pháp là chung cho dù chúng được lồng nhau hoặc vượt qua. – Gregor

+0

@Nic, giống như thế này [http://stackoverflow.com/.../annotating-facet-title-as-strip-over-facet.....](http://stackoverflow.com/questions/ 22818061/chú thích-facet-title-as-strip-over-facet/22825447 # 22825447) –

Các vấn đề liên quan