Demo with dynbenchmark data

In this vignette, we will use funkyheatmappy to reproduce the figures by Saelens et al. 2019

Load Data

Import packages:

from funkyheatmappy import funky_heatmap
import pandas as pd

Process results

First we import the data generated by running the data-raw/dynbenchmark_data.R script:

pies = pd.read_csv("../test/data/dynbenchmark_pie.csv", header=0, index_col=0)
data = pd.read_csv("../test/data/dynbenchmark_data.csv")
data["benchmark_overall_error_reasons"] = pies.to_dict("index").values()

It’s possible to use funky_heatmap() to visualise the data frame without providing additional metadata, but it will likely not have any of the desired formatting.:

funky_heatmap(data)

Process column info

Apart from the results themselves, the most important additional info is the column info. This data frame contains information on how each column should be formatted.:

options = pd.read_csv("../test/data/dynbenchmark_options.csv")
options = [
    {k: v for k, v in m.items() if pd.notnull(v)}
    for m in options.to_dict(orient="records")
]
column_info = pd.read_csv(
    "../test/data/dynbenchmark_column_info.csv",
    index_col="id",
    keep_default_na=False,
    na_values=["NaN"],
)
column_info["options"] = options
column_info.loc["method_priors_required_str", "options"]["legend"] = {
    "legend": {
        "": "None",
        "✕": "Weak: Start or end cells",
        "✖": "Strong: Cell grouping or time course",
    }
}

With just the data and the column info, we can already get a pretty good funky heatmap:

funky_heatmap(data, column_info=column_info)

Finetuning the visualization

The figure can be finetuned by grouping the columns and rows and specifying custom palettes.

Column grouping:

column_groups = pd.read_csv("../test/data/dynbenchmark_column_groups.csv")

Row info:

row_info = pd.read_csv("../test/data/dynbenchmark_row_info.csv", index_col="id")

Row grouping:

row_groups = pd.read_csv("../test/data/dynbenchmark_row_groups.csv")

Palettes:

palettes["colours"] = palettes.colours.apply(lambda x: x.split(", "))
names_error_r = [
    "Memory limit exceeded",
    "Time limit exceeded",
    "Execution error",
    "Method error",
]
palettes["colours"][5] = dict(zip(names_error_r, palettes["colours"][5]))

Generate funky heatmap

The resulting visualisation contains all of the results by Saelens et al. 2019 in a single plot.

Note that Figures 2 and 3 from the main paper and Supplementary Figure 2 were generated by making different subsets of the column_info and column_groups objects.:

funky_heatmap(
    data=data,
    column_info=column_info,
    column_groups=column_groups,
    row_info=row_info,
    row_groups=row_groups,
    palettes=palettes,
    col_annot_offset=3.2,
)