Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
019261e
Update feature distances
NicolaCourtier Mar 18, 2026
423e181
Add predictive plot
NicolaCourtier Mar 18, 2026
b247628
Fix test
NicolaCourtier Mar 18, 2026
aaaa9c0
Add posterior to SamplingResult
NicolaCourtier Mar 18, 2026
6e92b7c
Add type import
NicolaCourtier Mar 18, 2026
a18bd95
initial values instead of mean
SarahRo Mar 19, 2026
c702381
fix mean
SarahRo Mar 19, 2026
37e78cc
fixed example script for Bayesian feature fitting
YannickNoelStephanKuhn Apr 2, 2026
16fd9bc
added handling of FailedSolution states to feature distances
YannickNoelStephanKuhn Apr 2, 2026
5576108
Update cost failures
NicolaCourtier Apr 2, 2026
c4a8f71
Update EP-BOLFI posterior
NicolaCourtier Apr 2, 2026
e63f2e9
Merge branch 'develop' into add-plot-predictive
NicolaCourtier Apr 2, 2026
388c80d
Merge branch 'add-plot-predictive' into fix-bayesian-feature-fitting-…
NicolaCourtier Apr 2, 2026
a8665e1
EP-BOLFI only works with feature distances
NicolaCourtier Apr 2, 2026
a0221a8
Merge pull request #919 from pybop-team/fix-bayesian-feature-fitting-…
NicolaCourtier Apr 2, 2026
c026894
Turn experimental datasets into solutions
NicolaCourtier Apr 2, 2026
403e3d5
Update predictive.py
NicolaCourtier Apr 2, 2026
b80da7a
Add probability plot
NicolaCourtier Apr 2, 2026
3cb4042
Merge branch 'add-plot-predictive' of https://github.com/pybop-team/P…
YannickNoelStephanKuhn Apr 4, 2026
2811cfe
style: pre-commit fixes
pre-commit-ci[bot] Apr 4, 2026
ef3f394
Import Plotly express when neede
NicolaCourtier Apr 9, 2026
d6f0090
Restore logger values
NicolaCourtier Apr 9, 2026
191fa30
Add unit tests
NicolaCourtier Apr 9, 2026
10aa794
Update sampling posterior
NicolaCourtier Apr 10, 2026
44fd46b
Merge branch 'add-plot-predictive' into add-plot-probability
NicolaCourtier Apr 10, 2026
730e297
Rename plot probability to distribution
NicolaCourtier Apr 10, 2026
c3da2b1
Merge branch 'develop' into add-plot-probability
NicolaCourtier Apr 20, 2026
a7fddc4
style: pre-commit fixes
pre-commit-ci[bot] Apr 20, 2026
53f78a7
Reset ep-bolfi and feature distances
NicolaCourtier Apr 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@
result.plot_convergence(yaxis={"type": "log"})
result.plot_parameters(yaxis={"type": "log"}, yaxis2={"type": "log"})

# Plot the prior and posterior distributions
pybop.plot.distribution(result.problem.parameters, result.posterior)

# Plot predictions for a set of inputs sampled from the posterior
fig = result.plot_predictive(show=False)
fig[0].show()
Expand Down
1 change: 1 addition & 0 deletions pybop/plot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
from .voronoi import surface
from .samples import trace, chains, posterior, summary_table
from .predictive import predictive
from .distribution import distribution
77 changes: 77 additions & 0 deletions pybop/plot/distribution.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import numpy as np

from pybop.parameters.parameter import Parameters
from pybop.plot.standard_plots import StandardSubplot


def distribution(
parameters: Parameters,
posterior: Parameters | None = None,
n_samples: int = 100,
transformed: bool = False,
show: bool = True,
**layout_kwargs,
):
"""
Plot the posterior on top of the prior distribution for a Bayesian optimisation result.
"""
# Create lists of axis titles and trace names
axis_titles = []
trace_names = (
parameters.names
if posterior is None
else ["Prior"] * len(parameters) + ["Posterior"] * len(parameters)
)
for name in parameters.names:
axis_titles.append(
(name + " (transformed)" if transformed else name, "Probability density")
)

# Evaluate marginal distributions for each parameter
values = []
probability = []
for p in parameters:
d = p.transformed_distribution if transformed else p.distribution
samples = d.rvs(size=n_samples)
parameter_range = np.linspace(min(samples), max(samples), n_samples)
values.append(parameter_range)
probability.append([d.pdf(s) for s in values[-1]])

# Set subplot layout options
layout_options = dict(
width=1024,
height=576,
legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1),
)

# Create a plot dictionary
plot_dict = StandardSubplot(
x=values,
y=probability,
axis_titles=axis_titles,
layout_options=layout_options,
trace_names=trace_names,
trace_name_width=50,
)
fig = plot_dict(show=False)

if posterior is not None:
for idx, p in enumerate(posterior):
d = p.transformed_distribution if transformed else p.distribution
samples = d.rvs(size=n_samples)
parameter_range = np.linspace(min(samples), max(samples), n_samples)
values.append(parameter_range)
probability.append([d.pdf(s) for s in values[-1]])

trace = plot_dict.create_trace(
values[-1], probability[-1], **plot_dict.trace_options
)
row = (idx // plot_dict.num_cols) + 1
col = (idx % plot_dict.num_cols) + 1
fig.add_trace(trace, row=row, col=col)

fig.update_layout(**layout_kwargs)
if show:
fig.show()

return fig
7 changes: 1 addition & 6 deletions pybop/plot/standard_plots.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,12 +200,7 @@ def create_trace(self, x, y, **trace_options):
plotly.graph_objs.Scatter
A trace for a Plotly figure.
"""

return self.go.Scatter(
x=x,
y=y,
**trace_options,
)
return self.go.Scatter(x=x, y=y, **trace_options)

@staticmethod
def wrap_text(text, width):
Expand Down
5 changes: 5 additions & 0 deletions tests/unit/test_plots.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,11 @@ def test_posterior_plots(self, sampling_result):
# Plot posterior predictions
sampling_result.plot_predictive()

# Plot the prior and posterior distributions
pybop.plot.distribution(
sampling_result.problem.parameters, sampling_result.posterior
)

def test_with_ipykernel(self, dataset, fitting_problem, result):
import ipykernel

Expand Down
Loading