Skip to content

Visualization

fiber_matrix.visualization.plotting

draw_rve(fibers, boundaries, fig=None, ax=None, frame=None, label_fibers=False, label_boundaries=False)

Draws the RVE (fibers and boundaries) on the given figure and axes.

Parameters:

Name Type Description Default
fibers List[Fiber]

List of fibers to draw.

required
boundaries List[LinearBoundary]

List of boundaries to draw.

required
fig Figure

Figure to draw on. Creates new if None.

None
ax Axes

Axes to draw on. Creates new if None.

None
frame int

If provided, saves the plot as a frame image in 'frames/' directory.

None
label_fibers bool

Whether to label fibers with their index.

False
label_boundaries bool

Whether to label boundaries with their index.

False

Returns:

Type Description
Tuple[Optional[Figure], Optional[Axes]]

The figure and axes objects used, or (None, None) if matplotlib is missing.

Source code in fiber_matrix/visualization/plotting.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
def draw_rve(
    fibers: List[Fiber],
    boundaries: List[LinearBoundary],
    fig=None,
    ax=None,
    frame=None,
    label_fibers=False,
    label_boundaries=False,
) -> Tuple[Optional[Any], Optional[Any]]:
    """Draws the RVE (fibers and boundaries) on the given figure and axes.

    Parameters
    ----------
    fibers : List[Fiber]
        List of fibers to draw.
    boundaries : List[LinearBoundary]
        List of boundaries to draw.
    fig : matplotlib.figure.Figure, optional
        Figure to draw on. Creates new if None.
    ax : matplotlib.axes.Axes, optional
        Axes to draw on. Creates new if None.
    frame : int, optional
        If provided, saves the plot as a frame image in 'frames/' directory.
    label_fibers : bool, optional
        Whether to label fibers with their index.
    label_boundaries : bool, optional
        Whether to label boundaries with their index.

    Returns
    -------
    Tuple[Optional[Figure], Optional[Axes]]
        The figure and axes objects used, or (None, None) if matplotlib is missing.
    """
    if matplotlib is None:
        print("Matplotlib not installed, skipping visualization.")
        return (None, None)

    if fig is None:
        fig = plt.figure()
    if ax is None:
        ax = plt.axes()
    else:
        ax.clear()

    ax.get_xaxis().set_ticks([])
    ax.get_yaxis().set_ticks([])
    ax.set_aspect("equal")

    _draw_boundaries(boundaries, ax, label_boundaries)
    for fiber in fibers:
        # We need to manually call draw on fiber or implement it here.
        # Ideally, we move the draw logic here to avoid matplotlib dependency in models.
        _draw_fiber(fiber, ax, label_fibers)

    ax.autoscale()
    ax.margins(0.1)

    # Create a postscript drawing for the frame if the frame number is provided
    if frame is not None:
        if not os.path.exists("frames"):
            os.mkdir("frames")
        plt.savefig(
            os.path.join("frames", str(frame) + "_RVE.png"),
            transparent=True,
            bbox_inches="tight",
        )

    return (fig, ax)