Source code for pybamm.plotting.plot_voltage_components
#
# Method for plotting voltage components
#
import numpy as np
[docs]def plot_voltage_components(
solution, ax=None, show_legend=True, testing=False, **kwargs_fill
):
"""
Generate a plot showing the component overpotentials that make up the voltage
Parameters
----------
solution : :class:`pybamm.Solution`
Solution object from which to extract voltage components
ax : matplotlib Axis, optional
The axis on which to put the plot. If None, a new figure and axis is created.
show_legend : bool, optional
Whether to display the legend. Default is True
testing : bool, optional
Whether to actually make the plot (turned off for unit tests)
kwargs_fill
Keyword arguments, passed to ax.fill_between
"""
import matplotlib.pyplot as plt
# Set a default value for alpha, the opacity
kwargs_fill = {"alpha": 0.6, **kwargs_fill}
if ax is not None:
testing = True
else:
_, ax = plt.subplots()
overpotentials = [
"X-averaged battery reaction overpotential [V]",
"X-averaged battery concentration overpotential [V]",
"X-averaged battery electrolyte ohmic losses [V]",
"X-averaged battery solid phase ohmic losses [V]",
]
# Plot
# Initialise
time = solution["Time [h]"].entries
initial_ocv = solution["X-averaged battery open circuit voltage [V]"](0)
ocv = solution["X-averaged battery open circuit voltage [V]"].entries
ax.fill_between(time, ocv, initial_ocv, **kwargs_fill)
top = ocv
# Plot components
for overpotential in overpotentials:
bottom = top + solution[overpotential].entries
ax.fill_between(time, bottom, top, **kwargs_fill)
top = bottom
V = solution["Battery voltage [V]"].entries
ax.plot(time, V, "k--")
if show_legend:
labels = [
"Voltage",
"Open-circuit voltage",
"Reaction overpotential",
"Concentration overpotential",
"Ohmic electrolyte overpotential",
"Ohmic electrode overpotential",
]
leg = ax.legend(labels, loc="lower left", frameon=True)
leg.get_frame().set_edgecolor("k")
# Labels
ax.set_xlim([time[0], time[-1]])
ax.set_xlabel("Time [h]")
y_min, y_max = 0.98 * np.nanmin(V), 1.02 * np.nanmax(initial_ocv)
ax.set_ylim([y_min, y_max])
if not testing: # pragma: no cover
plt.show()
return ax