Source code for micom.viz.tradeoff
"""Visualizations for tradeoff analysis."""
from datetime import datetime
from micom.viz import Visualization
import numpy as np
import pandas as pd
[docs]def plot_tradeoff(
tradeoff_rates,
filename="tradeoff_%s.html" % datetime.now().strftime("%Y%m%d"),
tolerance=1e-6
):
"""Plot diagnostics for varying tradeoff values.
Parameters
----------
tradeoff_rates : pandas.DataFrame
The growth rates returned by the `tradeoff` workflow.
filename : str
The HTML file where the visualization will be saved.
tolerance : float
Smallest growth rate that will be considered. Everything lower will be
considered not growing.
Returns
-------
Visualization
A MICOM visualization. Can be served with `viz.serve`.
"""
rates = tradeoff_rates
data = {"tradeoff": rates}
viz = Visualization(filename, data, "tradeoff.html")
growth = rates[
["taxon", "sample_id", "abundance", "tradeoff", "growth_rate"]
].copy()
growth.tradeoff = growth.tradeoff.round(6).astype(str)
growth.loc[growth.tradeoff == "nan", "tradeoff"] = "none"
growth.loc[growth.growth_rate < tolerance, "growth_rate"] = tolerance
growth.loc[:, "log_growth_rate"] = np.log10(growth.growth_rate)
tradeoff = (
growth.groupby(["tradeoff", "sample_id"])
.apply(
lambda df: pd.Series(
{
"n_taxa": df.shape[0],
"n_growing": df[df.growth_rate > tolerance].shape[0],
"fraction_growing": (
df[df.growth_rate > tolerance].shape[0] / df.shape[0]
),
}
)
)
.reset_index()
)
viz.save(
growth=growth.to_json(orient="records"),
tradeoff=tradeoff.to_json(orient="records"),
extent=[growth.log_growth_rate.min(), growth.log_growth_rate.max()],
width=400,
height=300,
)
return viz