CamDavidsonPilon / Probabilistic-Programming-and-Bayesian-Methods-for-Hackers

aka "Bayesian Methods for Hackers": An introduction to Bayesian methods + probabilistic programming with a computation/understanding-first, mathematics-second point of view. All in pure Python ;)
http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/
MIT License
26.51k stars 7.84k forks source link

Chapter 1: Bug in plotting prior & posterior probabilities due to giving lw a string as an input #560

Open mark-yong opened 1 year ago

mark-yong commented 1 year ago

Attempting to execute the following code in Ch 1 results in TypeError: must be real number, not str:

figsize(12.5, 4)
colours = ["#348ABD", "#A60628"]

prior = [0.20, 0.80]
posterior = [1.0 / 3, 2.0 / 3]
plt.bar(
    [0, 0.7],
    prior,
    alpha=0.70,
    width=0.25,
    color=colours[0],
    label="prior distribution",
    lw="3",
    edgecolor=colours[0],
)

Changing the code to the following where lw=3 instead of '3' fixes the problem

figsize(12.5, 4)
colours = ["#348ABD", "#A60628"]

prior = [0.20, 0.80]
posterior = [1.0 / 3, 2.0 / 3]
plt.bar(
    [0, 0.7],
    prior,
    alpha=0.70,
    width=0.25,
    color=colours[0],
    label="prior distribution",
    lw=3,
    edgecolor=colours[0],
)

Matplotlib's documentation for set_linewidth states the function only expects floats; strings this may have worked in previous versions, but the current version may have broken something

    def set_linewidth(self, w):
        """
        Set the patch linewidth in points.

        Parameters
        ----------
        w : float or None
        """

https://github.com/matplotlib/matplotlib/blob/v3.7.1/lib/matplotlib/patches.py#L384

Advise to always use numbers when setting linewidth instead of strings

Version of matplotlib: 3.7.1

mark-yong commented 1 year ago

PRs 557 & 559 both appear to be attempts to fix this issue