Creates a Primavera-style interactive Gantt chart with Work Breakdown Structure (WBS) hierarchy and activities. The chart features color-coded WBS items, indented labels, scrollable view for large projects, and dynamic date formatting.

Ganttify(
  wbs_structure,
  activities,
  chart_title = "Project Gantt Chart with WBS",
  x_range = NULL,
  milestone_lines = NULL,
  color_config = NULL,
  display_config = NULL,
  label_config = NULL,
  bar_config = NULL,
  layout_config = NULL
)

Arguments

wbs_structure

A data frame with 3 columns: ID (character), Name (character), and Parent (character). Parent should be "None" or "" for root level items.

activities

A data frame with 5 required columns, 2 optional columns, and any number of additional columns:

  • WBS_ID (character): Associated WBS item identifier

  • Activity_ID (character): Unique activity identifier

  • Activity_Name (character): Activity name

  • Start_Date (character): Planned start date in MM/DD/YYYY format

  • End_Date (character): Planned end date in MM/DD/YYYY format

  • Start_Date_Actual (character, optional): Actual start date in MM/DD/YYYY format

  • End_Date_Actual (character, optional): Actual end date in MM/DD/YYYY format. If Start_Date_Actual is provided but End_Date_Actual is missing, the actual bar will show from Start_Date_Actual to today (if today > Start_Date_Actual).

  • Additional columns (optional): Any extra columns (e.g., Status, Agency, Priority) are preserved and can be used for attribute-based coloring via color_config with mode="attribute".

When actual dates are provided, activities display as stacked bars: planned on top (solid color) and actual on bottom (diagonal stripe pattern).

chart_title

Character. Title displayed at the top of the chart. Default "Project Gantt Chart with WBS".

x_range

Character vector. Date range for x-axis zoom (e.g., c("2024-01-01", "2024-12-31")). If NULL, shows full project range.

milestone_lines

Data frame or NULL. Optional milestone lines to display on the chart. If provided, must be a data frame with the following columns:

  • date (required): Date for the vertical line (character in MM/DD/YYYY format or Date object)

  • label (required): Text label to display on the line

  • color (optional): Line color (e.g., "red", "#FF0000"). Defaults to color palette if not provided.

  • dash (optional): Line style - "solid", "dash", "dot", or "dashdot". Default "dash".

  • width (optional): Line width in pixels. Default 2.

  • label_position (optional): Label position - "top", "middle", or "bottom". Default "top".

Default NULL (no milestone lines).

color_config

List or NULL. Configuration for chart colors. Structure depends on mode:

  • mode="wbs" (default if NULL): Activities inherit colors from parent WBS

    list(mode = "wbs", wbs = list("W1" = "#FF6B6B", "W2" = "#4ECDC4"))
  • mode="uniform": All activities same color, WBS same color

    list(mode = "uniform", uniform = list(wbs = "#34495E", activity = "#2ECC71"))
  • mode="attribute": Color activities by attribute column (e.g., Status)

    list(mode = "attribute",
             attribute = list(column = "Status",
                            mapping = list("completed" = "green", "in-progress" = "orange"),
                            wbs = "#34495E"))

If NULL, uses mode="wbs" with default color palette. Default NULL.

display_config

List or NULL. Controls visibility of chart elements. Structure:

  • wbs: List with show (logical), show_labels (logical), show_names_on_bars (logical)

  • activity: List with show (logical), show_names_on_bars (logical)

Example:

list(
  wbs = list(show = TRUE, show_labels = TRUE, show_names_on_bars = TRUE),
  activity = list(show = TRUE, show_names_on_bars = FALSE)
)

If NULL, uses defaults shown above. Default NULL.

label_config

List or NULL. Template strings for labels. Structure:

  • activity: List with yaxis (template for y-axis labels) and bar (template for bar labels)

  • wbs: List with yaxis and bar templates

Available placeholders for activity: name, id, start, end, start_actual, end_actual, duration, wbs_id (use with curly braces) Available placeholders for wbs: name, id, start, end, duration (use with curly braces) Example:

list(
  activity = list(yaxis = "{name} ({start} - {end})", bar = "{name}"),
  wbs = list(yaxis = "{name}", bar = "{name}")
)

If NULL, uses default template for all labels. Default NULL.

bar_config

List or NULL. Styling configuration for bars. Structure:

  • wbs: List with opacity (0-1) and height (numeric)

  • activity: List with opacity (0-1), height (numeric), dim_opacity (0-1), and dim_past_activities (logical)

The dim_past_activities field controls whether activities that end before today are dimmed. When TRUE, completed activities use the dim_opacity value instead of the regular opacity. Example:

list(
  wbs = list(opacity = 0.3, height = 0.3),
  activity = list(opacity = 1.0, height = 0.8, dim_opacity = 0.3, dim_past_activities = FALSE)
)

If NULL, uses defaults shown above. Default NULL.

layout_config

List or NULL. Chart layout settings. Structure:

  • buffer_days: Numeric, days to add before/after timeline for margin

  • indent_size: Numeric, spaces per indentation level

  • max_visible_rows: Numeric, maximum visible rows (enables scrolling)

  • y_scroll_position: Numeric or NULL, initial scroll position

  • yaxis_label_width: Numeric, width of y-axis label area in pixels (default 300)

  • yaxis_label_max_chars: Numeric or NULL, maximum characters for labels before truncating with "..." (NULL = no truncation)

  • hover_popup_max_chars: Numeric, maximum characters per line in hover popups before wrapping to next line (default 50)

Example:

list(
  buffer_days = 30,
  indent_size = 2,
  max_visible_rows = 20,
  y_scroll_position = NULL,
  yaxis_label_width = 300,
  yaxis_label_max_chars = NULL,
  hover_popup_max_chars = 50
)

If NULL, uses defaults shown above. Default NULL.

Value

A plotly object containing the interactive Gantt chart. Can be displayed directly or saved using htmlwidgets::saveWidget().

Examples

# \donttest{
# Load test data
data(test_project)

# Basic Gantt chart with WBS colors
chart <- Ganttify(
  wbs_structure = test_project$wbs_structure,
  activities = test_project$activities,
  color_config = list(mode = "wbs", wbs = test_project$colors)
)
chart
# Uniform color mode chart <- Ganttify( wbs_structure = test_project$wbs_structure, activities = test_project$activities, color_config = list( mode = "uniform", uniform = list(wbs = "#34495E", activity = "#2ECC71") ) ) chart
# Attribute-based coloring (requires extra column in activities) # Add a Status column to activities dataframe activities_with_status <- test_project$activities activities_with_status$Status <- sample(c("completed", "in-progress", "pending"), nrow(activities_with_status), replace = TRUE) chart <- Ganttify( wbs_structure = test_project$wbs_structure, activities = activities_with_status, color_config = list( mode = "attribute", attribute = list( column = "Status", mapping = list("completed" = "green", "in-progress" = "orange", "pending" = "gray"), wbs = "#34495E" ) ) ) chart
# WBS-only view using display_config chart <- Ganttify( wbs_structure = test_project$wbs_structure, activities = test_project$activities, display_config = list(activity = list(show = FALSE)) ) chart
# Custom labels showing date ranges chart <- Ganttify( wbs_structure = test_project$wbs_structure, activities = test_project$activities, label_config = list( activity = list(yaxis = "{name} ({start} - {end})") ) ) chart
# Customize bar heights and enable dimming for past activities chart <- Ganttify( wbs_structure = test_project$wbs_structure, activities = test_project$activities, bar_config = list( wbs = list(opacity = 0.5, height = 0.4), activity = list(height = 0.9, dim_past_activities = TRUE, dim_opacity = 0.4) ) ) chart
# Add "today" line as a milestone chart <- Ganttify( wbs_structure = test_project$wbs_structure, activities = test_project$activities, milestone_lines = data.frame( date = Sys.Date(), label = "Today", color = "red" ) ) chart
# Narrow label area with truncation chart <- Ganttify( wbs_structure = test_project$wbs_structure, activities = test_project$activities, layout_config = list( yaxis_label_width = 200, yaxis_label_max_chars = 25 ) ) chart
# }