Pertanyaan Ubah warna daun di plot.dendrogram seperti dengan plot.phylo paket kera


Saya mencoba memplot hasil pengelompokan agglomerative (UPGMA dengan Agnes) dalam 'gaya' yang sama seperti ketika merencanakan sebuah pohon menggunakan paket 'kera'. Contoh sederhana yang saya sertakan pada gambar di bawah ini Figure 1. A simple example of the final output required

Masalah utamanya adalah saya ingin dapat mewarnai daun dendrogram berdasarkan pola pada label daun. Saya mencoba dua pendekatan: baik saya gunakan hc2Newick atau saya menggunakan kode oleh Joris Meys seperti yang diusulkan sebagai jawaban Ubah Dendrogram daun . Keduanya tidak memberikan hasil yang memuaskan. Mungkin saya tidak sepenuhnya memahami cara dendrogram dibangun. ASCII menyimpan dari abundance.agnes.ave objek (disimpan dari menjalankan agnes) dapat ditemukan di https://www.dropbox.com/s/gke9qnvwptltkky/abundance.agnes.ave .

Saat saya menggunakan opsi pertama (dengan hc2Newick  dari bioconductor ctc paket) Saya mendapatkan gambar berikut ketika menggunakan kode ini:

write(hc2Newick(as.hclust(abundance.agnes.ave)),file="all_samples_euclidean.tre")
eucltree<-read.tree(file="all_samples_euclidean.tre")
eucltree.laz<-ladderize(eucltree,FALSE)
tiplabs<-eucltree$tip.label
numbertiplabs<-length(tiplabs)
colourtips<-rep("green",numbertiplabs)
colourtips[grep("II",tiplabs)]<-"red"
plot(eucltree.laz,tip.color=colourtips,adj=1,cex=0.6,use.edge.length=F)
add.scale.bar()

Using plot.phylo

Ini jelas tidak ideal, 'keselarasan' plot tidak seperti yang saya inginkan. Saya kira ini ada hubungannya dengan perhitungan panjang cabang namun saya tidak memiliki ide yang foggiest bagaimana memecahkan masalah ini. Tentu saja bila dibandingkan dengan hasil fungsi colLab, yang lebih mirip gaya dendrogram yang ingin saya laporkan. Juga, menggunakan use.edge.length=T dalam kode di atas tidak memberikan pengelompokan yang tidak 'selaras' dengan benar: Plot.phylo with branch length

Pendekatan kedua menggunakan fungsi colLab Joris Meys 'dengan kode berikut memberikan angka berikutnya

clusDendro<-as.dendrogram(as.hclust(abundance.agnes.ave))
labelColors<-c("red","green")
clusMember<-rep(1,length(rownames(abundance.x)))
clusMember[grep("II",rownames(abundance.x))]<-2
names(clusMember)<-rownames(abundance.x)

colLab <- function(n)
{
  if(is.leaf(n)) {
    a <- attributes(n)
    # clusMember - a vector designating leaf grouping
    # labelColors - a vector of colors for the above grouping
    labCol <- labelColors[clusMember[which(names(clusMember) == a$label)]]
    attr(n, "nodePar") <- c(a$nodePar, lab.col = labCol)
  }
  n
}

clusDendro<-dendrapply(clusDendro, colLab)
plot(clusDendro,horiz=T,axes=F)

Using colLab Plot ini semakin mendekati apa yang saya inginkan, namun saya tidak tahu mengapa lingkaran terbuka muncul di daun dan bagaimana menghapusnya.

Bantuan apa pun sangat dihargai.

Salam,

FM


4
2018-04-17 14:25


asal


Jawaban:


Saya menulis kode itu beberapa waktu yang lalu, dan tampaknya ada sesuatu yang berubah sedikit dalam mekanisme.

Itu plot.dendrogram fungsi yang saya gunakan, memiliki argumen nodePar. Perilaku telah berubah sejak terakhir kali saya menggunakan fungsi itu, dan meskipun itu digunakan secara normal untuk simpul-simpul dalam, itu tampaknya memiliki efek pada node luar juga. Nilai default untuk pch aku s 1:2 sekarang, sesuai dengan file bantuan.

Oleh karena itu, Anda perlu secara spesifik menentukan pch=NA di atribut yang Anda tambahkan ke node luar di colLab fungsi. Coba menyesuaikannya seperti ini:

colLab <- function(n)
{
  if(is.leaf(n)) {
    a <- attributes(n)
    # clusMember - a vector designating leaf grouping
    # labelColors - a vector of colors for the above grouping
    labCol <- labelColors[clusMember[which(names(clusMember) == a$label)]]

    attr(n, "nodePar") <- 
        if(is.list(a$nodePar)) c(a$nodePar, lab.col = labCol,pch=NA) else
                               list(lab.col = labCol,pch=NA)
  }
  n
}

Di mesin saya, itu memecahkan masalah.

Atau, Anda bisa melihat argumennya use.edge.length dari fungsi tersebut plot.phylo dalam ape paket. Anda mengaturnya FALSE, tetapi dari penjelasan Anda, saya yakin Anda menginginkannya diatur pada default, TRUE.

EDIT: Untuk membuat fungsi lebih umum, mungkin ada baiknya untuk menambahkan labelColors dan clusMember sebagai argumen untuk fungsi tersebut. Solusi cepat-n-kotor saya bukanlah contoh terbaik dari kode bersih ...

Juga lupakan apa yang saya katakan tentang menggunakan panjang tepi. paket kera menafsirkannya sebagai dendrogram nyata dan menempatkan use.edge.length untuk TRUE akan mengkonversi panjang tepi ke waktu evolusi. Oleh karena itu 'aneh' menguraikan dendrogram itu.

Juga perhatikan bahwa jika treeleaf tidak memiliki nodePar atribut, menambahkan parameter tambahan menggunakan c() fungsi akan menyebabkan efek yang tidak diinginkan: jika Anda menambahkan misalnya lab.cex=0.6, yang c() fungsi akan membuat vektor, bukan daftar, dan mengonversi nilai untuk lab.cex ke karakter setiap kali ada nilai karakter dalam daftar parameter. Dalam hal ini yang akan menjadi nama warna, dan itu menjelaskan kesalahan yang Anda bicarakan di komentar.


0
2018-04-19 15:20



Fungsi ini sekarang tersedia dalam paket baru yang disebut "dendextend", dibangun persis untuk hal semacam ini.

Anda dapat melihat banyak contoh dalam presentasi dan sketsa paket, di bagian "penggunaan" di URL berikut: https://github.com/talgalili/dendextend

Pertanyaan yang hampir pasti hanya dijawab dalam pertanyaan SO berikut:

https://stackoverflow.com/a/18832457/256662


2
2017-09-16 16:10