This page lists all the built-in charts you can put in an HTML report.

It is possible to create your own charts without forking the codebase, although the process isn’t obvious or documented. If you really want to do that then reach out and we can talk.


cycletime_scatterplot

Plots the cycle time (y axis) against the date that the work completed (x axis).

cycletime_scatterplot

You can customize this report with grouping_rules as shown below.

Rule Description
label The name used for the group
color The color used for the group. If a colour isn’t set then it will be randomly chosen.
ignore Discard this item from the dataset

Cycletime Scatterplot

Example

cycletime_scatterplot do
  grouping_rules do |issue, rules|
    # Put all data into groups by type. Use the name of the
    # type as the label for the group
    rules.label = issue.type
    if issue.type == 'Story'
      # Set the color of stories to be green
      rules.color = 'green'
    else issue.type == 'Spike'
      # Ignore spikes
      rules.ignore
    else
      rules.color = 'yellow'
    end
  end
end

cycletime_histogram

Plots the distribution of cycle times. How many times did something complete in three days?

By looking at the histogram, we can see groupings of different types of work and we can also tell how predictable the work is by how much the cycle times cluster together.

cycletime_histogram

This chart supports the same grouping rules as Throughput Chart. See that chart for an example..

Rules options

Rule Description
label The name used for the group
color The color used for the group. If no color is specified then it will be randomly chosen.
ignore Discard this item from the dataset

Cycletime Histogram


throughput_chart

A line chart showing how many items completed each week (Monday to Sunday)

throughput_chart

By default, this splits data across issue types and also shows a totals line.

Rules options

Rule Description
label The name used for the group
color The color used for the group. If no color is specified then it will be randomly chosen.
ignore Discard this item from the dataset

Example

throughput_chart do
  grouping_rules do |issue, rules|
    # Put all data into groups by type. Use the name of the
    # type as the label for the group
    rules.label = issue.type
    if issue.type == 'Story'
      # Set the colour of stories to be green
      rules.color = 'green'
    else issue.type == 'Spike'
      # Ignore spikes
      rules.ignore
    else
      rules.color = 'yellow'
    end
  end
end

Throughput chart


aging_work_in_progress_chart

For items that have started but not finished, what column are they currently in and how old are they?

aging_work_in_progress_chart

This chart supports the same grouping rules as Throughput Chart. See that chart for an example..

Rules options

Rule Description
label The name used for the group
color The color used for the group. If no color is specified then it will be randomly chosen.
ignore Discard this item from the dataset

daily_wip_by_age_chart

For each day in the period, how many items were in progress? Items are colour coded based on how long they’ve been in progress.

daily_wip_by_age_chart

Daily WIP by Age


daily_wip_by_blocked_stalled_chart

For each day in the period, how many items are blocked (Flagged in Jira terms) or stalled (no status changes in the last five days)?

daily_wip_by_blocked_stalled_chart

Daily WIP by Blocked/Stalled


daily_wip_by_parent

Grouping the WIP by the parent ticket. This is useful to see if we’re focused on more strategic goals (small number of epics) or whether our focus is scattered.

daily_wip_by_parent

daily_wip_chart

The daily WIP charts above are just customized versions of the more generic daily_wip_chart. If you want to build your own, you can do that with code like the example below. This example groups the daily WIP by the parent of the ticket in progress.

daily_wip_chart do
  header_text 'Daily WIP by Parent'
  description_text <<-TEXT
    How much work is in progress, grouped by the parent of the issue. This will give us an
    indication of how focused we are on higher level objectives. If there are many parent
    tickets in progress at the same time, either this team has their focus scattered or we
    aren't doing a good job of splitting those parent tickets. Neither of those is desirable.
  TEXT
  grouping_rules do |issue, rules|
    rules.label = issue.parent&.key || 'No parent'
    rules.color = 'white' if rules.label == 'No parent' 
  end
end

expedited_chart

This chart shows how many items are expedited and how long they’ve been that way. Configure what it means for an item to be expedited through the expedited_priority_names key in project specific settings

expedited_chart

sprint_burndown

Displays all the sprint burndowns that happened during this period. By default, this renders two charts - the top one is burndown by story points and the bottom one is burndown by story count. If you only want one or the other then you can customize that.

# Generate both burndowns
sprint_burndown

# Generate only the story point burndown
sprint_burndown :points_only

# Generate only the story count burndown
sprint_burndown :counts_only

estimate_accuracy_chart

Graphs the estimates (y axis) against the actual cycle time of the item. It’s useful to be able to see how much correlation there is between the estimates and the actual time it took. By default, it uses story points for the estimate although that can be configured as seen below.

Estimate accuracy chart

There is never any correlation between the two, which begs the question “why we even do story point estimates if they’re never accurate?” More on that here.

estimate_accuracy_chart

What if you don’t use the story point field and use something custom like TShirt sizes? You can specify that with the yaxis

estimate_accuracy_chart do
  y_axis(sort_order: %w[Small Medium Large], label: "TShirt Sizes") do |issue, started_time|
    issue.raw['fields']['custom_field_34'] 
  end 
end

Note: In this example, custom_field_34 is meant to show what’s possible. It’s almost certainly not going to be called that in your instance. You have to find what field is holding the value you need.

Parameters Description
sort_order All the possible options in the order you want to see them displayed. Bottom to top.
label The label you want displayed on the axis
block The code that will extract the value from the issue object. This is custom to your setup

dependency_chart

Jira gives you the ability to link issues. So you can say that one issue depends on another or one blocks another. This visualizes all of those relationships.

dependency_chart

Note that this requires graphviz to be installed. See the GraphViz website for installation instructions.

You can customize this chart with two different kinds of rules. One to describe the actual issues themselves and the other to describe the links between issues.

issue_rules

To customize the individual issues.

Rule Description
color The color used for the group
ignore Discard this item from the dataset

Example

dependency_chart do
  # Set custom colours based on the type of the object.
  # Note that this sample just uses the same colour scheme
  # that you get by default so you'll probably want to change
  # the colour values if you're using this.
  issue_rules do |issue, rules|
    rules.color = case issue.type
    when 'Story'
      '#90EE90'
    when 'Task'
      '#87CEFA'
    when 'Bug', 'Defect'
      '#ffdab9'
    when 'Epic'
      '#fafad2'
    else
      '#dcdcdc'
    end

    # Ignore sub tasks
    rules.ignore if issue_type == 'Sub-task'
  end
end

To customize the links between issues

Rule Description
line_color The color used for the group
ignore Discard this item from the dataset
merge_bidirectional keep: ‘outward’ If there are bidirectional links (ie A depends on B and B also depends on A) then only draw one of the two lines
use_bidirectional_arrows If there are bidirectional links then display an arrow at both ends of the line.
dependency_chart do
  link_rules do |link, rules|
    case link.name
    when 'Cloners'
      # We don't want to see any clone links at all.
      rules.ignore
    when 'Blocks'
      # For blocks, by default Jira will have links going both
      # ways and we want them only going one way. Also make the
      # link red.
      rules.merge_bidirectional keep: 'outward'
      rules.line_color = 'red'
    when 'Sync'
      # For sync, also only show one link but this time put 
      # arrows at both ends
      rules.merge_bidirectional keep: 'outward'
      rules.use_bidirectional_arrows
    end
  end
end