[Bioperl-l] Draw phylogenetic trees with bar chart
Malay
mbasu at mail.nih.gov
Wed Nov 12 17:19:53 UTC 2008
Chris Bailey wrote:
> Florent Angly wrote:
>> Dear Bioperl users,
>>
>> I need to represent graphically phylogenetic trees as cladograms or
>> phylograms using Perl. An additional requirement is that I would like
>> to add graph data as bar chart on top of it as in this example:
>> http://scums.sdsu.edu/Mapper/images/b.gif
>>
>> Now, I have read the BioPerl howto and know about the
>> Bio::TreeIO::svggraph and Bio::Tree::Draw::Cladogram modules. The
>> first one uses the SVG Perl module whereas the other one uses the
>> PostScript module to create EPS images. I do not know why there are 2
>> very similar modules to draw trees (in different locations), but none
>> of them seem to able to plot additional information on the tree.
> I'm not aware of any inbuilt code in any of these modules to do what
> you're asking. In the past, the way I've added extra information into
> trees is as follows:
> 1) Embed the data you want to graph into the alignment/tree file, such
> that when the tree is drawn, for example, the length of the bar you want
> drawn is part of the text on the tree node in question
> 2) Draw the tree as an SVG image using Bio::TreeIO.
> 3) Parse the SVG document using your XML parser of choice (I've used
> XML::Simple for this in the past)
> 4) extract all the <text> elements and their CDATA.
> 5) the text element will contain an x and y co-ordinate and the CDATA
> will contain the text string itself
> 6) pull out the data you need to draw the graph (the information you
> added in 1) using regexps etc.
> 7) add an element to the SVG document (e.g. <rect x="80" y="500"
> height="10" width="125" style="fill:blue" />) simply change the x and y
> to match the coordinates of the text element (+ an offset to get
> everything looking right), and change width to the value you extracted
> in (6)
> 8) repeat steps 5 to 7 for all the text elements in your SVG document
> 9) output new SVG document to a file
> 10) ????
> 11) Profit
>
> This pattern will also work for more complex data, since you can always
> add more data to each text node, and it's more than possible to generate
> any type of chart data you like with the right combination of shape
> primitives.
>
FYI a very standard way to generate images like these is to use R's
"ape" package.
-Malay
--
Malay K Basu
Post-doctoral Fellow
NCBI/NLM/NIH
8600 Rockville Pike
Building 38A, Room 5S514C
Bethesda, MD 20894.
Phone: 240-421-2460 (mobile) 301-496-5599 (office)
Email: mbasu at mail.nih.gov
More information about the Bioperl-l
mailing list