Search code examples
pythonmatplotlibplotbezier

Changing the opacity of the polygons in the Python Bezier package


I want to change the opacity the polygon plots made with this Python Bezier package.

Here is the code I tried:

import bezier
import matplotlib.pyplot as plt
import numpy

plt.clf()

nodes0 = numpy.asfortranarray([[0.0, 1.0, 2.0], [0.0, -1.0, 0.0]])
edge0 = bezier.Curve(nodes0, degree=2)

nodes1 = numpy.asfortranarray([[2.0, 2.0], [0.0, 1.0]])
edge1 = bezier.Curve(nodes1, degree=1)

nodes2 = numpy.asfortranarray([[2.0, 1.0, 0.0], [1.0, 2.0, 1.0]])
edge2 = bezier.Curve(nodes2, degree=2)

nodes3 = numpy.asfortranarray([[0.0, 0.0], [1.0, 0.0]])
edge3 = bezier.Curve(nodes3, degree=1)

curved_poly = bezier.CurvedPolygon(edge0, edge1, edge2, edge3)

# ax.set_alpha(1.0)                    # <-- I tried this, does not produce any effect.
ax = curved_poly.plot(pts_per_edge=12) # <-- Does not take alpha argument.

# plt.plot(alpha=1)                    # <-- I tried this, does not produce any effect.
plt.show()

The code produces the following plots:

enter image description here

enter image description here


Solution

  • This library is not well-documented, and apart from the axis and the general color for both line and area, there seems to be nothing that you can pass on to the plot. But we can retrieve the plotted objects (in this case, the plotted Bezier curve consists of a Line2D and a PathPatch object) and modify them:

    import bezier
    import matplotlib.pyplot as plt
    import numpy
    from matplotlib.lines import Line2D
    from matplotlib.patches import PathPatch
    
    
    fig, (ax1, ax2) = plt.subplots(2)
    
    nodes0 = numpy.asfortranarray([[0.0, 1.0, 2.0], [0.0, -1.0, 0.0]])
    edge0 = bezier.Curve(nodes0, degree=2)
    
    nodes1 = numpy.asfortranarray([[2.0, 2.0], [0.0, 1.0]])
    edge1 = bezier.Curve(nodes1, degree=1)
    
    nodes2 = numpy.asfortranarray([[2.0, 1.0, 0.0], [1.0, 2.0, 1.0]])
    edge2 = bezier.Curve(nodes2, degree=2)
    
    nodes3 = numpy.asfortranarray([[0.0, 0.0], [1.0, 0.0]])
    edge3 = bezier.Curve(nodes3, degree=1)
    
    curved_poly = bezier.CurvedPolygon(edge0, edge1, edge2, edge3)
    
    
    curved_poly.plot(pts_per_edge=12, color="green", ax=ax1) 
    
    for item in ax1.get_children():
        if isinstance(item, Line2D):
            item.set_color("red")
            item.set_alpha(0.7)
        if isinstance(item, PathPatch):
            item.set_alpha(0.1)
    plt.show()
    

    Sample output: enter image description here