Source code for SALib.plotting.heatmap
from typing import Dict
import numpy as np
import matplotlib.pyplot as plt
from ..util import extract_group_names
__all__ = ["heatmap"]
# magic string indicating DF columns holding conf bound values
CONF_COLUMN = "_conf"
[docs]
def heatmap(sp: Dict, metric: str, index: str, title: str = None, ax=None):
"""Plot a heatmap of the target metric.
Parameters
----------
sp : object, SALib ProblemSpec
metric : str, metric to plot. Defaults to first metric/result output if `None`.
index : str, sensitivity indices to plot ('S1', 'ST', etc). Displays all if `None`.
title : str, plot title to use
ax : axes object, matplotlib axes object to assign figure to.
Returns
-------
ax : matplotlib axes object
"""
if ax is None:
fig, ax = plt.subplots(1, 1, figsize=(10, 6))
else:
fig = plt.gcf()
if metric is None:
metric = sp["outputs"][0]
if isinstance(metric, str):
assert metric in sp["outputs"], f"Specified model output '{metric}' not found"
is_multi_output = len(sp["outputs"]) > 1
if not index:
if is_multi_output:
index = list(sp.analysis[metric].keys())
else:
index = list(sp.analysis.keys())
multi_index = isinstance(index, (list, tuple))
if multi_index:
index = [k for k in index if not k.endswith(CONF_COLUMN) and k != "names"]
if isinstance(index, str):
index = [index]
if is_multi_output:
met_data = sp.analysis[metric]
else:
met_data = sp.analysis
si_shape = met_data[index[0]].shape
s_data = np.vstack([met_data[k] for k in index if met_data[k].shape == si_shape])
ax.imshow(s_data)
fig.colorbar(ax.images[0], ax=ax, shrink=0.9)
if title is None:
title = metric
ax.set_title(title)
if isinstance(metric, str):
metric = [metric]
disp_names, _ = extract_group_names(sp)
ax.xaxis.set_ticks(range(0, len(disp_names)))
ax.xaxis.set_ticklabels(disp_names, rotation=90)
# Account for indices that may have been filtered out
# e.g., cannot easily show second-order values at the moment
disp_idx = s_data.shape[0]
ax.yaxis.set_ticks(range(0, len(index[0:disp_idx])))
ax.yaxis.set_ticklabels(index[0:disp_idx])
return ax