How to Visualise a JPT
See also
Visualising JPTs — the full illustrated tutorial with rendered plots for every example on this page.
pyjpt ships with two visualisation backends selectable via an
engine parameter:
'matplotlib'— static PNG / SVG / PDF output'plotly'— interactive HTML figures; static export via kaleido
Install the backend(s) you need:
pip install pyjpt[matplotlib]
pip install pyjpt[plotly] # includes kaleido for static export
sudo apt-get install graphviz # required for the tree plot
Plotting the Tree Structure
plot() renders the decision tree as a Graphviz
SVG. The distribution mini-plots inside each leaf are drawn by the
selected engine:
from IPython.display import SVG, display
path = model.plot(
title='Iris JPT',
filename='iris',
directory='/tmp',
engine='matplotlib', # or 'plotly'
view=False,
)
display(SVG(path))
Pass plotvars to restrict leaf plots to a subset of variables, and
nodefill / leaffill for custom node colours:
model.plot(
filename='iris_petals',
directory='/tmp',
engine='matplotlib',
plotvars=[varnames['petal length (cm)'], varnames['species']],
nodefill='#d0e8ff',
leaffill='#ffe8d0',
view=False,
)
Plotting Individual Distributions
Every distribution object exposes dist.plot(engine=...). Pass it a
distribution retrieved from a leaf or from a posterior query:
# Numeric CDF — Matplotlib returns a Figure
fig = numeric_dist.plot(
engine='matplotlib',
title='Petal length',
xlabel='petal length (cm)',
fname='petal_length',
directory='/tmp',
)
# Symbolic bar chart — Plotly returns a go.Figure
fig = symbolic_dist.plot(
engine='plotly',
title='Species posterior',
horizontal=True,
color='rgb(15, 21, 110)',
)
fig.show()
Accepted options for the Plotly engine:
Parameter |
Description |
|---|---|
|
CSS colour, |
|
Horizontal bars for symbolic/integer dists |
|
Show only the top-N values |
|
Sort bars alphabetically instead of by probability |
|
Plotly fill style, e.g. |
|
Gaussian 2-D: |
Saving Figures
Matplotlib — pass fname and directory to any .plot()
call; the PNG is written automatically.
Plotly — interactive HTML:
dist.plot(engine='plotly', fname='out.html', directory='/tmp')
Plotly — static image (PNG, SVG, JPEG, WebP via kaleido):
dist.plot(engine='plotly', fname='out.svg', directory='/tmp')
# or directly on the returned figure:
fig.write_image('/tmp/out.png', scale=2)
Custom Rendering Engine
Subclass DistributionRendering
and pass the instance as engine to any plot() call:
from jpt.plotting.engines.rendering import DistributionRendering
class MyRenderer(DistributionRendering):
def plot_numeric(self, dist, **kwargs):
... # custom rendering logic
model.plot(engine=MyRenderer(), directory='/tmp', view=False)