Vraag:
twee heatmaps uitzetten met dezelfde volgorde van genen
Exhausted
2018-07-04 20:23:37 UTC
view on stackexchange narkive permalink

Ik verwachtte hetzelfde patroon, maar hier kan ik de patronen niet vergelijken omdat de volgorde van de genen niet hetzelfde lijkt. Ik bedoel, hoe ik twee hittekaarten kan hebben waarop de volgorde van genen hetzelfde is, zodat ik het blok gele en blauwe kleuren in twee hittekaarten zou kunnen vergelijken.

Ik heb deze code gebruikt

  vereisen ("RColorBrewer") myCol <- colorRampPalette (c ("dodgerblue", "zwart", "geel")) (100) myBreaks <- seq (-2, 2, length. out = 101) heat <- t (scale (t (sc_DEGG))) hr <- hclust (as.dist (1-cor (t (y), method = "pearson")), method = "complete") heatmap .2 (heat, Rowv = as.dendrogram (hr), Colv = as.dendrogram (hc), col = myCol, breaks = myBreaks, main = "Title", key = T, key size = 1.0, scale = "none" , density.info = "geen", reorderfun = functie (d, w) herordenen (d, w, agglo.FUN = gemiddeld), trace = "none", cexRow = 0.2, cexCol = 0.8, distfun = function (x) dist (x, method = "euclidean"), hclustfun = function (x) hclust (x, method = "ward.D2"))  
Gebruik het 'code'-formaat voor code, deze is beter leesbaar. En probeer de afbeeldingen rechtstreeks in de tekst te plaatsen in plaats van een link.
De MWE-code hier zal niet werken. Variabelen `y` en` hc` zijn niet gedefinieerd, zelfs als men aanneemt dat `sc_DEGG` een niet-gepubliceerde genen x monsters / cellen-matrix is.
Drie antwoorden:
sjcockell
2018-07-05 19:40:02 UTC
view on stackexchange narkive permalink

ComplexHeatmap is gebouwd voor het plotten van side-by-side heatmaps met dezelfde clustering - je gebruikt de + -notatie, vergelijkbaar met ggplot2. Om dezelfde voorbeeldgegevens te gebruiken als @ b.nota:

  bibliotheek (ComplexHeatmap) # Eerste matrixset.seed (2) m <- replicate (8, rnorm ( 26)) rownames (m) <- letters [1:26] # Second matrixset.seed (3) m2 <- replicate (8, rnorm (26)) rownames (m2) <- letters [1:26] Heatmap (m ) + Heatmap (m2)  

En de resultaten:

ComplexHeatmap Results

Er zijn veel voorbeelden in de uitgebreide documentatie.

EDIT:

Om het kleurenschema te wijzigen is een aanroep nodig naar de colorRamp2 -functie van de circlize pakket.

  bibliotheek (circlize) mycol <- colorRamp2 (c (-2,0,2), c ("dodgerblue", "black", "yellow")) Heatmap (m, col = mycol, cluster_columns = FALSE) + Heatmap (m2, col = mycol, cluster_columns = FALSE)  

Dit geeft:

enter image description here

Geweldige oplossing!
@FereshTeh U kunt de clustering van kolommen uitschakelen - `cluster_columns = FALSE`, dan zal de volgorde hetzelfde zijn als de invoermatrix. Wat betreft kleuren, ik heb een tweede voorbeeld toegevoegd om te laten zien hoe ze werken in ComplexHeatmap (het is een beetje anders dan je `breaks`-voorbeeld).
@FereshTeh het nummerbereik in uw colorRamp2-oproep moet worden geïnformeerd door uw gegevens - u zou bijvoorbeeld range () kunnen gebruiken om de min en max te krijgen.
@FereshTeh Ik denk dat dit waarschijnlijk op het terrein van een aparte vraag komt. Omdat je een paar genen met hoge waarden in de 'T'-matrix hebt, wassen ze het kleurenschema weg voor de rest van de heatmap. Je zou het maximum lager kunnen instellen en accepteren dat die genen verzadigd raken - de resulterende heatmap zal minder 'eerlijk' zijn over de gegevens, maar kan vastleggen wat je wilt zien.
Sorry, ik heb een paar heatmaps gemaakt op basis van jouw code in een complexheatmap-pakket. De rechter warmtekaart is lichter dan de linker. Ik weet niet welke is geclusterd op basis van de andere. Hoe kan ik de juiste donkerder maken zodat beide meer op elkaar lijken ?? https://image.ibb.co/fbhVGo/Rplot311.png
Ik denk dat je dit als een nieuwe vraag moet stellen.
benn
2018-07-04 23:36:32 UTC
view on stackexchange narkive permalink

Je verwacht dat de volgorde van genen voor beide heatmaps hetzelfde is, maar de kans is klein dat de 4000 genen exact in dezelfde volgorde geclusterd zullen worden.

Wat je kunt doen, is de volgorde van genen (rijen) van de ene heatmap en maak een nieuwe heatmap met de andere dataset. Je verliest de boom natuurlijk omdat hij niet meer clustert.

Hier een klein voorbeeld:

  bibliotheek (gplots) # Eerste matrixset.seed (2) m <- replicate (8, rnorm (26)) rownames (m) <- letters [1:26] hm <- heatmap.2 (m, main = "m", key = T, key size = 1.0, scale = " none ", trace =" none ", density.info =" none ", Colv = FALSE, distfun = functie (x) dist (x, method =" euclidean "), hclustfun = functie (x) hclust (x, method = "ward.D2")) # Tweede matrixset.seed (3) m2 <- replicate (8, rnorm (26)) rownames (m2) <- letters [1:26] hm2 <- heatmap.2 (m2, main = "m2", key = T, key size = 1.0, scale = "none", trace = "none", density.info = "none", Colv = FALSE, distfun = function (x) dist (x, method = "euclidean "), hclustfun = function (x) hclust (x, method =" ward.D2 ")) # Tweede matrix met rijvolgorde van firstreorder_m2 <- m2 [rev (hm $ rowInd),] hm2_m <- heatmap.2 (reorder_m2 ,     hoofd = "m2 in m's volgorde", key = T, key size = 1.0, scale = "none", trace = "none", density.info = "none", Rowv = FALSE, Colv = FALSE, dendrogram = "none", distfun = function (x) dist (x, method = "euclidean"), hclustfun = function (x) hclust (x, method = "ward.D2"))  

m m2 m2_m

@FereshTeh hm is de uitvoer van de eerste heatmap (in je code zou het anders zijn)
@Llopis, ja sorry als dat niet duidelijk was. OP zou de heatmap eerst in een object moeten opslaan zoals 'hm <- heatmap.2 (...' in mijn voorbeeld.
Pardon, wanneer ik gebruik op mijn gegevens zegt dat reorder_m2 <- r [rev (hm $ rowInd),] Fout in r [rev (hm $ rowInd),]: subscript buiten het bereik, maar de dimensie van beide matrices is hetzelfde : ((
Sorry pheatmap (reorder_m2) Fout in hclust (d, method = method): moet n> = 2 objecten hebben om te clusteren omdat reorder_m2 niets in de rij doet, alleen num [0,1: 9}
@FereshTeh, kunt u uw vraag bewerken om meer code op te nemen en uit te leggen wanneer u deze fouten krijgt?
Gebruik je `hmrowInd` of` hm $ rowInd`?
Sorry, ik heb de link van twee matrices; Bulk RNA-seq en single cell RNA-seq beide met dezelfde dimensie; 3614 genen en 9 tijdstippen. Eerst probeerde ik een heatmap te plotten met bulkgegevens met dezelfde code die ik in mijn vraag heb geplakt, daarna probeerde ik reorder_m2 <- Single_cell_RNA_seq [rev (hm $ rowInd),] dat is de fout zegt dat subscript buiten het bereik valt
https://drive.google.com/file/d/1J4g_TZUA-FNojJBUPkj3uoH2SUD2tP03/view?usp=sharing
https://drive.google.com/file/d/1Xq2cJfPq_Ggn5EPDcbjgY-kfGKpQUTg1/view?usp=sharing
@FereshTeh, controleer of uw colnames van uw matrices hetzelfde zijn: `all (colnames (m) == colnames (m2))`. En maak eerst een eenvoudigere heatmap, om te zien of je deze truc kunt laten werken. Maak het daarna ingewikkelder. En gebruik `heatmap.2` en` pheatmap` niet alsof ze hetzelfde zijn.
Bedankt, ja dat heb ik gecontroleerd> all (colnames (r) == colnames (s)) [1] TRUE
Probeer eerst mijn eenvoudige code te gebruiken met je matrices, en als dat werkt, maak het dan stap voor stap moeilijker zoals je wilt.
Tom Kelly
2018-07-08 13:56:11 UTC
view on stackexchange narkive permalink

Je hebt 2 opties op voorwaarde dat beide datasets dezelfde genen (rijen) hebben:

  1. Behoud de originele volgorde van rijen in de heatmap. Als ze in dezelfde volgorde in de dataset staan, staan ​​ze in de heatmap. U kunt herordenen onderdrukken met een van de volgende argumenten voor heatmap.2

Rowv = NULL

dendrogram = "col" of dendrogram = "none"

reorderfun = functie (x) return (x)

  1. Je kunt van tevoren de volgorde van de genen (rijen) berekenen en ze doorgeven aan de heatmap. De code die in de vraag wordt getoond doet dit al met Rowv = as.dendrogram (hr) . Om dezelfde volgorde in een tweede heatmap te hebben, moet je hetzelfde dendrogram hr doorgeven aan beide heatmaps. Dit kan worden berekend op basis van een dataset of een andere set samples.

Een andere optie is om afzonderlijke dendrogrammen te berekenen (van hclust van elke dataset) voor de samples en combineer ze met merge . U kunt de datasets combineren met cbind en de datasets samen plotten als één heatmap (met 2 sets samples afzonderlijk geclusterd) door het samengevoegde dendrogram door te geven aan Colv :

  #bereken dezelfde dendrogrammen afzonderlijkhc1 <- hclust (as.dist (t (data1), method = "euclidean")), method = "complete") hr2 <- hclust (as.dist (t (data2 ), method = "euclidean")), method = "complete") mergedcols <- merge (as.dendrogram (hr1), as.dendrogram (hr2)) mergeddata <- cbind (data1, data2) #compute gen dendrogram over alle sampleshr <- hclust (as.dist (1-cor (t (mergeddata), method = "pearson")), method = "complete") heatmap.2 (mergeddata, Rowv = as.dendrogram (hr), Colv = as .dendrogram (mergedcols), col = myCol, breaks = myBreaks, main = "Title", key = T, key size = 1.0, scale = "none", density.info = "none", reorderfun = functie (d, w) opnieuw ordenen (d, w, agglo.FUN = gemiddeld), trace = "none", cexRow = 0.2, cexCol = 0.8,
distfun = function (x) dist (x, method = "euclidean"), hclustfun = function (x) hclust (x, method = "ward.D2"))  

Je zou moeten zijn in staat om de verdeling tussen deze voorbeelden te tonen met het colsep -argument.



Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 4.0-licentie waaronder het wordt gedistribueerd.
Loading...