2015-03-27 14 views
7

मेरे पास एक हीटमैप है जो अधिक से अधिक जटिल हो रहा है। पिघल डेटा का एक उदाहरण:ggplot2: अधिक जटिल पहलू

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 

ggplot2 और geom_tile का उपयोग करना, मैं डेटा की एक सुंदर हीटमैप का उत्पादन करने में सक्षम था। मैं कोड पर गर्व है (इस आर में पहला अनुभव है), तो यह नीचे पोस्ट किया है:

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")' 

जैसा कि आप देख सकते हैं, वहाँ है काफी पुस्तिका शामिल पुनर्व्यवस्था का एक सा है, अन्यथा कोड बहुत सरल है । आप देख सकते हैं कि जानकारी की एक पूरी स्तंभ, "उपवर्ग" का उपयोग नहीं कर रहा है

heatmap

हालांकि,: यहाँ छवि उत्पादन है। असल में, प्रत्येक सबक्लास एक कक्षा के भीतर फिट बैठता है। यह सही होगा अगर मैं पहले से प्रदर्शित कक्षा पहलू के भीतर इन सबक्लास को पहचाने में सक्षम था। जहां तक ​​मुझे पता है, यह असंभव है। सटीक होने के लिए, केवल कक्षा ए में अलग-अलग सबक्लास हैं। अन्य वर्गों में बस उनके वर्ग का नाम प्रतिबिंबित होता है (एफ = कक्षा एफ)। क्या इस हीटमैप को व्यवस्थित करने का कोई और तरीका है ताकि मैं सभी प्रासंगिक जानकारी प्रदर्शित कर सकूं? गायब उप-वर्गों में कुछ सबसे महत्वपूर्ण डेटा शामिल हैं और डेटा से संदर्भों को चित्रित करने के लिए सबसे आवश्यक होंगे।

क्लास के बजाए सबक्लेसेस को देखने के लिए एक वैकल्पिक दृष्टिकोण होगा, मैन्युअल रूप से उन्हें पुन: व्यवस्थित करें ताकि कक्षाएं एक साथ क्लस्टर हो जाएं और फिर प्रत्येक कक्षा को निर्धारित करने के लिए उनके चारों ओर किसी प्रकार का बॉक्स खींचे। मुझे नहीं पता कि यह कैसे किया जाएगा।

कोई भी मदद बहुत उपयोगी होगी। अगर आपको कोई अतिरिक्त जानकारी चाहिए तो कृपया मुझे बताएं।

+0

आप कहाँ है 'facet_grid (कक्षा ~ क्लेड,', यह 'facet_grid लिए (कक्षा + उपवर्ग ~ क्लेड, बदल' – Gregor

+0

हालांकि, लेबल के आदेश देने के लिए, तो आप शायद 'चाहते उपवर्ग + कक्षा' – Gregor

+0

यह करने का एक तरीका है, धन्यवाद। यह बिल्कुल सही नहीं है कि मैंने कल्पना की है (नेस्टेड पहलुओं), क्योंकि यह इसे सबक्लास में तोड़ देता है और फिर कक्षा लेबल जोड़ता है। मुझे लगता है कि यह उतना सुंदर नहीं है जितना मैं चाहता हूं जैसे, लेकिन हो सकता है कि यह उतना अच्छा हो जितना हो जाता है। आपके इनपुट के लिए धन्यवाद, @ ग्रेगोर – Nic

उत्तर

7

यह ओरिएंटल स्ट्रिप के दाईं ओर और किंवदंती के बाईं ओर एक नई पट्टी डालेगा।

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

कुछ सरल डेमो डेटा के साथ एक जवाब में मेरी टिप्पणी टर्निंग:

यह कठिन नहीं है (?facet_grid में भी वहाँ उदाहरण है, हालांकि वे नीचे की ओर कर रहे हैं)।

# 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 ~ .) 

आप ~ के दोनों तरफ मनमाने ढंग से कई कारकों के साथ ऐसा कर सकते हैं!

+0

कार्यात्मक रूप से, यह वही है जो मैं चाहता हूं। कृत्रिम रूप से, यह वह नहीं है जिसे मैं ढूंढ रहा हूं। लेकिन शायद यह मेरी समस्या है, ggplot2 नहीं है। मुझे यह पसंद नहीं है कि यह प्रत्येक नेस्टेड सबक्लास के लिए क्लास लेबल्स को दोहराता है। क्या मैं समझ रहा हूँ? मेरे लिए, ऐसा लगता है कि ऐसा करने का सही तरीका एक बड़ा क्लास बार (ग्रे लेबल क्षेत्र) होगा जिसमें डेटा की संपूर्णता फैली हुई है जिसमें यह नेस्टेड सबक्लास लेबल के सबसेट के साथ है। @ ग्रेगोर – Nic

+0

@ निक हां, अब मैं समझता हूं। समस्या यह है कि 'ggplot' नहीं जानता है कि कारक घोंसले हैं, इसलिए समाधान सामान्य है कि वे घोंसले या पार हो गए हैं या नहीं। – Gregor

+0

@Nic, ऐसा कुछ [http://stackoverflow.com/.../annotating-facet-title-as-strip-over-facet.. ](httpoverstow.com/questions/ 22818061/एनोटेटिंग-फेस-टाइटल-ए-स्ट्रिप-ओवर-फेस/22825447 # 22825447) –

संबंधित मुद्दे