--- title: "Plotting Ontological Terms" author: "Daniel Greene" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Plotting Ontological Terms} %\VignetteEngine{knitr::rmarkdown} %\usepackage[utf8]{inputenc} --- `ontologyPlot` is part of the 'ontologyX' family of packages (see the 'Introduction to ontologyX' vignette supplied with the `ontologyIndex` package). It enables visualisation of ontological terms and ontological annotation as subgraphs of the full ontology, rendered using the `Rgraphviz` package. The package makes use of `ontology_index` objects, provided by the `ontologyIndex` package. To make full use of the features in `ontologyPlot`, the user is encouraged to gain familiarity of the functions in `ontologyIndex` which enable various transformations of sets of ontological that are useful for selecting those to add to diagrams. *Note: `Rgraphviz` must be obtained from the Bioconductor repository*. We start by loading both packages, and an example ontology - the Human Phenotype Ontology (HPO). ```{r} library(ontologyIndex) library(ontologyPlot) data(hpo) ``` ## Plotting Terms A set of terms (character vector of term IDs) can be plotted as a subgraph of the ontology by calling `onto_plot`: ```{r} onto_plot(hpo, terms=c("HP:0001873", "HP:0011877")) ``` To include all ancestral terms, use the `get_ancestors` function: ```{r} onto_plot(hpo, terms=get_ancestors(hpo, c("HP:0001873", "HP:0011877"))) ``` The function `remove_links` can be used to remove terms simply linking two terms together, thus the structure of the given part of the ontology can be retained whilst simplifying the figure: ```{r} onto_plot(hpo, terms=remove_links(hpo, get_ancestors(hpo, c("HP:0001873", "HP:0011877")))) ``` ## Graphical parameters Graphical attributes to assign to each node can be passed to `onto_plot`. The graphical attributes can be specified as: * a single value, thus setting the attribute to the given value for all nodes, * a vector the same length as the `terms` argument, so the `i`th term gets the `i`th attribute value, * a function which returns the desired attribute value for each term. Node attributes which affect the plot generated include those supported by the Rgraphviz package. Some of these include: * `fillcolor` - the colour to use for each node, * `color` - the colour for the border of the node (defaults to `"transparent"`), * `label` - a character vector of term IDs to be used as the labels, * `fontsize` - font size of `label` text printed in each term, * `width` - the relative width of the nodes. In this example, we pass the term IDs as the labels and a character vector of colours generated with `rainbow` to colour the nodes. ```{r} terms <- remove_links(hpo, get_ancestors(hpo, c("HP:0001873", "HP:0011877"))) onto_plot(hpo, terms=terms, label=terms, fillcolor=rainbow(length(terms))) ``` `ontologyPlot` contains several functions for setting the graphical parameters which can be passed to `onto_plot`. These include for example `label_by_frequency`, `official_labels` and `label_by_term_set` (see individual help files for more details). These functions must accept an `ontology` and `terms` argument. They can optionally accept: * `frequencies`: a numeric vector of population frequencies named by term, * `term_sets`: a `list` of character vectors of terms [i.e. annotated objects] arguments. If any of the given functions require these additional arguments, they must be passed to `onto_plot`. ## Frequencies A `frequencies` argument giving a population frequency of terms can be passed to `onto_plot`. If this argument is passed, functions which make use of it in determining graphical parameters can be passed to `onto_plot`, for instance `colour_by_population_frequency`. ```{r} frequencies <- seq(from=0, to=1, by=1/length(terms)) names(frequencies) <- terms onto_plot(hpo, terms=terms, frequencies=frequencies, fillcolor=colour_by_population_frequency) ``` ## Term sets Another argument which can be passed to `onto_plot` is `term_sets`, a list of sets of ontological terms (e.g. a set of HPO encoded phenotypes). If `terms_sets` is given, the `terms` parameter of `onto_plot` defaults to the value of `remove_uninformative_terms(ontology, term_sets)`, which removes terms which are annotated to exactly the same objects as all of their children (with the effect of greatly simplifying the resulting diagram - see `?remove_uninformative_terms` for more details). ```{r} hpo_phenotypes <- list( A=c("HP:0001382","HP:0004272","HP:0007917","HP:0004912","HP:0001596"), B=c("HP:0001382","HP:0004272","HP:0002165","HP:0004800","HP:0004912"), C=c("HP:0004800","HP:0001382","HP:0004912","HP:0007917","HP:0008743") ) onto_plot(hpo, term_sets=hpo_phenotypes, label=label_by_term_set) ``` To further decorate the plot, we could use the frequency of each term in `hpo_phenotypes` them to colour them. ```{r} onto_plot( hpo, frequencies=get_term_frequencies(hpo, hpo_phenotypes), term_sets=hpo_phenotypes, label=label_by_term_set, fillcolor=colour_by_frequency) ``` ## Edge attributes Edge attributes recognised by `Rgraphviz` can also be supplied by the `edge_attributes` argument. ```{r} onto_plot( hpo, frequencies=get_term_frequencies(hpo, hpo_phenotypes), term_sets=hpo_phenotypes, label=label_by_term_set, edge_attributes=list(color="red", lty="dashed")) ``` ## Plots for publications To get the highest quality plots and fine-grained control over the node and edge attributes, the best option is to create the `ontological_plot` with `onto_plot` and write it to a file in `dot` format using the `write_dot` function. The file can then be opened using a layout program, for example the graphviz program (https://www.graphviz.org/), to visualise/export as an image. Individual node and edge attributes can then be modified by editing the file.