Question: Draw Minimum Spanning Tree (Mst) With Pie Charts In R
2
Mathias Walter40 wrote:

Hi,

I do some genotyping within R and want to display the results using a minimum spanning tree (MST) and draw some additional data (i. e. species distribution) onto the nodes, like it was done with the picture below obtained from this paper: http://www.pnas.org/content/105/37/14130.full.

I found some packages to draw the MST but was not able to draw the pie charts. Sure, I can reinvent the wheel and use TechingDemos subplot function. But does an R package or function exists which just do this for me?

The ape package has some options to draw pie or stacked bar charts at the nodes of a dendrogram but not at the nodes of an MST (mst function).

A similar question was asked here (How to draw of minimum spanning tree of sequences?) but the answer does not provide an R package. written 8.7 years ago by Mathias Walter40
1
Joseph Hughes2.8k wrote:

Hi Mathias,

You will need to use the ape, graph and RBGL packages to do a simple MST from a file of fasta sequence, as follows:

``````data <- read.dna(("sequences.fasta"), format="fasta")
#generate a distance matrix
dist <- dist.dna(data,model="raw", as.matrix=TRUE)
#creates an undirected graph
dist.g<-as(dist,Class="graphNEL")
#generates the minimum spanning tree using kruskal algorithm (you can also use mstree.prim for the prim algorithm)
ms<-mstree.kruskal(dist.g)
``````

To make anything pretty with pie charts at the nodes, you will need to delve into graph and Rgraphviz packages. Section 6 in this Rgraphviz tutorial might lead you to a solution.

Thanks for the answer. Unfortunately, I'm not very familiar with the graph and RBGL package and I stopped at drawing the graph.

How do you convert the ms into a graph and plot it?

I used the following code:

``````e <- buildEdgeList(dist.g)
n <- buildNodeList(dist.g)
z <- agopen(nodes=n, edges=e, edgeMode="directed", name="")
plot(z)
``````

But R does not draw the graph. It just consumes all the CPU.

--
Mathias

There are a number of ways you can plot it out. This is my convoluted way:

``````fromto<-cbind(ms\$edgeList[1,],ms\$edgeList[2,],ms\$weight[1,])
plot(am.graph, attrs = list(node = list(fillcolor = "lightblue"),edge = list(arrowsize=0.5)),"neato")
``````

Hi Joseph, I used your code and there is a mistake when running the last line: "cannot coerce type 'S4' to vector of type 'double' ". I'm not very familiar with R, could you give me a hand with this problem? Thank you!

--Du