Polar Stem Plot

Polar stem plots display data as radial lines extending from the origin (r=0) to each data point, with markers at the endpoints. They're useful for visualizing discrete samples in polar coordinates.

Basic Example

using Fugl
using Fugl: Text

# Create data points at regular angular intervals
theta = range(0, 2π, length=12)
r = 0.5f0 .+ 0.3f0 .* sin.(3.0f0 .* theta)

# Dark theme styling
dark_card_style = ContainerStyle(
    background_color=Vec4f(0.15, 0.15, 0.18, 1.0),
    border_color=Vec4f(0.25, 0.25, 0.30, 1.0),
    border_width=1.5f0,
    padding=12.0f0,
    corner_radius=6.0f0
)

dark_title_style = TextStyle(
    size_points=18,
    color=Vec4f(0.9, 0.9, 0.95, 1.0)
)

polar_style = PolarStyle(
    background_color=Vec4f(0.08, 0.10, 0.14, 1.0),
    show_radial_grid=true,
    show_angular_grid=true,
    radial_grid_color=Vec4f(0.25, 0.25, 0.30, 1.0),
    angular_grid_color=Vec4f(0.25, 0.25, 0.30, 1.0),
    show_outer_circle=true,
    outer_circle_color=Vec4f(0.9, 0.9, 0.95, 1.0),
    outer_circle_width=2.0f0,
    label_color=Vec4f(0.9, 0.9, 0.95, 1.0)
)

polar_state = PolarState(
    theta_start=0.0f0,
    theta_direction=:counterclockwise,
    num_angular_lines=12,
    angular_label_format=:degrees
)

function MyApp()
    Card(
        "Basic Polar Stem Plot",
        PolarPlot(
            [
                PolarStem(
                    Float32.(r),
                    Float32.(theta),
                    line_color=Vec4f(0.4, 0.6, 0.9, 1.0),
                    line_width=2.0f0,
                    fill_color=Vec4f(0.4, 0.6, 0.9, 1.0),
                    border_color=Vec4f(0.9, 0.9, 0.95, 1.0),
                    marker_size=10.0f0,
                    border_width=1.5f0
                )
            ],
            polar_style,
            polar_state
        ),
        style=dark_card_style,
        title_style=dark_title_style
    )
end

screenshot(MyApp, "polarStemBasic.png", 812, 812);

Basic Polar Stem

Multiple Data Series

using Fugl
using Fugl: Text

# Create two data series at different frequencies
theta = range(0, 2π, length=16)
r1 = 0.7f0 .+ 0.2f0 .* cos.(2.0f0 .* theta)
r2 = 0.4f0 .+ 0.15f0 .* cos.(4.0f0 .* theta)

# Dark theme styling
dark_card_style = ContainerStyle(
    background_color=Vec4f(0.15, 0.15, 0.18, 1.0),
    border_color=Vec4f(0.25, 0.25, 0.30, 1.0),
    border_width=1.5f0,
    padding=12.0f0,
    corner_radius=6.0f0
)

dark_title_style = TextStyle(
    size_points=18,
    color=Vec4f(0.9, 0.9, 0.95, 1.0)
)

polar_style = PolarStyle(
    background_color=Vec4f(0.08, 0.10, 0.14, 1.0),
    show_radial_grid=true,
    show_angular_grid=true,
    radial_grid_color=Vec4f(0.25, 0.25, 0.30, 1.0),
    angular_grid_color=Vec4f(0.25, 0.25, 0.30, 1.0),
    show_outer_circle=true,
    outer_circle_color=Vec4f(0.9, 0.9, 0.95, 1.0),
    outer_circle_width=2.0f0,
    label_color=Vec4f(0.9, 0.9, 0.95, 1.0)
)

polar_state = PolarState(
    theta_start=Float32(π/2),  # 0° points up
    theta_direction=:counterclockwise,
    num_angular_lines=8,
    angular_label_format=:degrees
)

function MyApp()
    Card(
        "Multiple Stem Series",
        PolarPlot(
            [
                PolarStem(
                    Float32.(r1),
                    Float32.(theta),
                    line_color=Vec4f(0.9, 0.4, 0.4, 1.0),  # Red
                    line_width=2.0f0,
                    fill_color=Vec4f(0.9, 0.4, 0.4, 1.0),
                    border_color=Vec4f(0.9, 0.9, 0.95, 1.0),
                    marker_size=9.0f0,
                    border_width=1.5f0
                ),
                PolarStem(
                    Float32.(r2),
                    Float32.(theta),
                    line_color=Vec4f(0.4, 0.9, 0.4, 1.0),  # Green
                    line_width=2.0f0,
                    fill_color=Vec4f(0.4, 0.9, 0.4, 1.0),
                    border_color=Vec4f(0.9, 0.9, 0.95, 1.0),
                    marker_size=9.0f0,
                    border_width=1.5f0
                )
            ],
            polar_style,
            polar_state
        ),
        style=dark_card_style,
        title_style=dark_title_style
    )
end

screenshot(MyApp, "polarStemMultiple.png", 812, 812);

Multiple Stem Series

Combined with Other Elements

Stem plots can be combined with line and scatter plots for comprehensive data visualization:

using Fugl
using Fugl: Text

# Continuous curve data
theta_line = range(0, 2π, length=200)
r_line = 0.6f0 .+ 0.3f0 .* cos.(3.0f0 .* theta_line)

# Sampled data
theta_stem = range(0, 2π, length=12)
r_stem = 0.6f0 .+ 0.3f0 .* cos.(3.0f0 .* theta_stem)

# Dark theme styling
dark_card_style = ContainerStyle(
    background_color=Vec4f(0.15, 0.15, 0.18, 1.0),
    border_color=Vec4f(0.25, 0.25, 0.30, 1.0),
    border_width=1.5f0,
    padding=12.0f0,
    corner_radius=6.0f0
)

dark_title_style = TextStyle(
    size_points=18,
    color=Vec4f(0.9, 0.9, 0.95, 1.0)
)

polar_style = PolarStyle(
    background_color=Vec4f(0.08, 0.10, 0.14, 1.0),
    show_radial_grid=true,
    show_angular_grid=true,
    radial_grid_color=Vec4f(0.25, 0.25, 0.30, 1.0),
    angular_grid_color=Vec4f(0.25, 0.25, 0.30, 1.0),
    show_outer_circle=true,
    outer_circle_color=Vec4f(0.9, 0.9, 0.95, 1.0),
    outer_circle_width=2.0f0,
    label_color=Vec4f(0.9, 0.9, 0.95, 1.0)
)

polar_state = PolarState(
    theta_start=0.0f0,
    theta_direction=:counterclockwise,
    num_angular_lines=12,
    angular_label_format=:degrees
)

function MyApp()
    Card(
        "Stem + Continuous Curve",
        PolarPlot(
            [
                # Continuous curve (underlying function)
                PolarLine(
                    Float32.(r_line),
                    Float32.(theta_line),
                    color=Vec4f(0.4, 0.4, 0.4, 0.5),  # Semi-transparent gray
                    width=1.5f0
                ),
                # Discrete samples
                PolarStem(
                    Float32.(r_stem),
                    Float32.(theta_stem),
                    line_color=Vec4f(0.4, 0.6, 0.9, 1.0),
                    line_width=2.0f0,
                    fill_color=Vec4f(0.4, 0.6, 0.9, 1.0),
                    border_color=Vec4f(0.9, 0.9, 0.95, 1.0),
                    marker_size=10.0f0,
                    border_width=1.5f0
                )
            ],
            polar_style,
            polar_state
        ),
        style=dark_card_style,
        title_style=dark_title_style
    )
end

screenshot(MyApp, "polarStemCombined.png", 812, 812);

Combined Plot