Taxonomy 2.1.0 → 2.2.0
raw patch · 4 files changed
+113/−6 lines, 4 filesdep +graphvizPVP ok
version bump matches the API change (PVP)
Dependencies added: graphviz
API changes (from Hackage documentation)
+ Biobase.Taxonomy.Visualization: drawTaxonomy :: Bool -> Gr SimpleTaxon Double -> String
+ Biobase.Taxonomy.Visualization: drawTaxonomyComparison :: Bool -> (Int, Gr CompareTaxon Double) -> String
+ Biobase.Taxonomy.Visualization: writeDotTree :: String -> Bool -> Gr SimpleTaxon Double -> IO ()
+ Biobase.Taxonomy.Visualization: writeJsonTree :: String -> Gr SimpleTaxon Double -> IO ()
+ Biobase.Taxonomy.Visualization: writeTree :: String -> String -> Bool -> Gr SimpleTaxon Double -> IO ()
Files
- Biobase/Taxonomy.hs +3/−1
- Biobase/Taxonomy/Visualization.hs +101/−0
- ChangeLog.md +3/−0
- Taxonomy.cabal +6/−5
Biobase/Taxonomy.hs view
@@ -4,8 +4,10 @@ -- Datatypes used to represent taxonomy data module Biobase.Taxonomy.Types, module Biobase.Taxonomy.Import,- module Biobase.Taxonomy.Utils+ module Biobase.Taxonomy.Utils,+ module Biobase.Taxonomy.Visualization ) where import Biobase.Taxonomy.Types import Biobase.Taxonomy.Import import Biobase.Taxonomy.Utils+import Biobase.Taxonomy.Visualization
+ Biobase/Taxonomy/Visualization.hs view
@@ -0,0 +1,101 @@+-- | Functions for visualization of taxonomy data.+module Biobase.Taxonomy.Visualization ( -- * Datatypes+ -- Datatypes used to represent taxonomy data+ module Biobase.Taxonomy.Types,+ -- * Visualization+ drawTaxonomyComparison,+ drawTaxonomy,+ writeTree,+ writeDotTree,+ writeJsonTree+ ) where+import Prelude+import Biobase.Taxonomy.Types+import Data.Graph.Inductive.Tree+import Data.Graph.Inductive.Basic+import qualified Data.GraphViz as GV+import qualified Data.GraphViz.Printing as GVP+import qualified Data.GraphViz.Attributes.Colors as GVAC+import qualified Data.GraphViz.Attributes.Complete as GVA+import qualified Data.ByteString.Lazy.Char8 as L+import qualified Data.Aeson as AE+import qualified Data.Text.Lazy as T++---------------------------------------+-- Visualisation functions++-- | Draw graph in dot format. Used in Ids2Tree tool.+drawTaxonomy :: Bool -> Gr SimpleTaxon Double -> String+drawTaxonomy withRank inputGraph = do+ let nodeFormating = if withRank then nodeFormatWithRank else nodeFormatWithoutRank+ let params = GV.nonClusteredParams {GV.isDirected = True+ , GV.globalAttributes = [GV.GraphAttrs [GVA.Size (GVA.GSize (20 :: Double) (Just (20 :: Double)) False)]]+ , GV.isDotCluster = const True+ --, GV.fmtNode = \ (_,l) -> [GV.textLabel (TL.pack (show (simpleRank l) ++ "\n" ++ T.unpack (simpleScientificName l)))]+ , GV.fmtNode = nodeFormating+ , GV.fmtEdge = const []+ }+ let dotFormat = GV.graphToDot params inputGraph+ let dottext = GVP.renderDot $ GVP.toDot dotFormat+ T.unpack dottext++nodeFormatWithRank :: (t, SimpleTaxon) -> [GVA.Attribute]+nodeFormatWithRank (_,l) = [GV.textLabel (T.concat [T.pack (show (simpleRank l)), T.pack ("\n") , simpleScientificName l])]++nodeFormatWithoutRank :: (t, SimpleTaxon) -> [GVA.Attribute]+nodeFormatWithoutRank (_,l) = [GV.textLabel (simpleScientificName l)]++-- | Draw tree comparison graph in dot format. Used in Ids2TreeCompare tool.+drawTaxonomyComparison :: Bool -> (Int,Gr CompareTaxon Double) -> String+drawTaxonomyComparison withRank (treeNumber,inputGraph) = do+ let cList = makeColorList treeNumber+ let nodeFormating = if withRank then (compareNodeFormatWithRank cList) else (compareNodeFormatWithoutRank cList)+ let params = GV.nonClusteredParams {GV.isDirected = True+ , GV.globalAttributes = []+ , GV.isDotCluster = const True+ --, GV.fmtNode = \ (_,l) -> [GV.textLabel (TL.pack (show (compareRank l) ++ "\n" ++ B.unpack (compareScientificName l))), GV.style GV.wedged, GVA.Color (selectColors (inTree l) cList)]+ , GV.fmtNode = nodeFormating+ , GV.fmtEdge = const []+ }+ let dotFormat = GV.graphToDot params (grev inputGraph)+ let dottext = GVP.renderDot $ GVP.toDot dotFormat+ T.unpack dottext++compareNodeFormatWithRank :: [GVA.Color] -> (t, CompareTaxon) -> [GVA.Attribute]+compareNodeFormatWithRank cList (_,l) = [GV.textLabel (T.concat [T.pack (show (compareRank l) ++ "\n"),compareScientificName l]), GV.style GV.wedged, GVA.Color (selectColors (inTree l) cList)]++compareNodeFormatWithoutRank :: [GVA.Color] -> (t, CompareTaxon) -> [GVA.Attribute]+compareNodeFormatWithoutRank cList (_,l) = [GV.textLabel (compareScientificName l), GV.style GV.wedged, GVA.Color (selectColors (inTree l) cList)]++-- | Colors from color list are selected according to in which of the compared trees the node is contained.+selectColors :: [Int] -> [GVA.Color] -> GVAC.ColorList+selectColors inTrees currentColorList = GVAC.toColorList (map (\i -> currentColorList !! i) inTrees)++-- | A color list is sampled from the spectrum according to how many trees are compared.+makeColorList :: Int -> [GVA.Color]+makeColorList treeNumber = cList+ where cList = map (\i -> GVAC.HSV ((fromIntegral i/fromIntegral neededColors) * 0.708) 0.5 1.0) [0..neededColors]+ neededColors = treeNumber - 1++-- | Write tree representation either as dot or json to provided file path+writeTree :: String -> String -> Bool -> Gr SimpleTaxon Double -> IO ()+writeTree requestedFormat outputDirectoryPath withRank inputGraph = do+ case requestedFormat of+ "dot" -> writeDotTree outputDirectoryPath withRank inputGraph+ "json"-> writeJsonTree outputDirectoryPath inputGraph+ _ -> writeDotTree outputDirectoryPath withRank inputGraph++-- | Write tree representation as dot to provided file path.+-- Graphviz tools like dot can be applied to the written .dot file to generate e.g. svg-format images.+writeDotTree :: String -> Bool -> Gr SimpleTaxon Double -> IO ()+writeDotTree outputDirectoryPath withRank inputGraph = do+ let diagram = drawTaxonomy withRank (grev inputGraph)+ writeFile (outputDirectoryPath ++ "taxonomy.dot") diagram++-- | Write tree representation as json to provided file path.+-- You can visualize the result for example with 3Djs.+writeJsonTree :: String -> Gr SimpleTaxon Double -> IO ()+writeJsonTree outputDirectoryPath inputGraph = do+ let jsonOutput = AE.encode (grev inputGraph)+ L.writeFile (outputDirectoryPath ++ "taxonomy.json") jsonOutput+
ChangeLog.md view
@@ -1,4 +1,7 @@ -*-change-log-*-+2.2.0 [Florian Eggenhofer](mailto:egg@cs.uni-freiburg.de) 30. May 2020++ * Compatibility with 9.0.1, reintegrated visualisation libraries 2.1.0 [Florian Eggenhofer](mailto:egg@cs.uni-freiburg.de) 17. December 2019
Taxonomy.cabal view
@@ -1,5 +1,5 @@ name: Taxonomy-version: 2.1.0+version: 2.2.0 synopsis: Libary for parsing, processing and vizualization of taxonomy data description: Haskell cabal Taxonomy libary contains tools, parsers, datastructures and visualisation for the NCBI (National Center for Biotechnology Information) Taxonomy datasources.@@ -27,7 +27,7 @@ category: Bioinformatics build-type: Simple cabal-version: >=1.10.0-Tested-With: GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.1+Tested-With: GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.1, GHC == 9.0.1 Extra-Source-Files: README.md ChangeLog.md @@ -38,15 +38,16 @@ source-repository this type: git- location: https://github.com/eggzilla/Taxonomy/tree/v2.1.0- tag: v2.1.0+ location: https://github.com/eggzilla/Taxonomy/tree/v2.2.0+ tag: v2.2.0 Library ghc-options: -Wall -fno-warn-unused-do-bind default-language: Haskell2010- build-depends: base >=4.5 && <5, parsec, either-unwrap, fgl>=5.5.4.0, text, bytestring, aeson, vector+ build-depends: base >=4.5 && <5, parsec, either-unwrap, fgl>=5.5.4.0, text, bytestring, aeson, vector, graphviz Hs-source-dirs: . Exposed-modules: Biobase.Taxonomy.Types Biobase.Taxonomy.Import Biobase.Taxonomy.Utils+ Biobase.Taxonomy.Visualization Biobase.Taxonomy