Useful Data Tips

Bullet Charts for KPI Dashboards

⏱️ 24 sec read 📊 Data Visualization

Bullet charts display progress toward goals in a compact, linear format. They replace gauges and meters with a more space-efficient design that shows actual performance, targets, and qualitative ranges.

Bullet Chart Components

1. Qualitative ranges (background bars):
   - Poor (red)
   - Satisfactory (yellow)
   - Good (green)

2. Actual performance (dark bar):
   - Current achievement level

3. Target marker (vertical line):
   - Goal or benchmark

Shows: Are we meeting our target? By how much?

Creating Bullet Charts in Python

import plotly.graph_objects as go

# Sales performance
actual = 85
target = 100
ranges = [60, 80, 100]  # Poor, OK, Good

fig = go.Figure(go.Indicator(
    mode="number+gauge+delta",
    value=actual,
    delta={'reference': target},
    title={'text': "Sales Performance"},
    gauge={
        'shape': "bullet",
        'axis': {'range': [None, 120]},
        'threshold': {
            'line': {'color': "black", 'width': 2},
            'thickness': 0.75,
            'value': target
        },
        'steps': [
            {'range': [0, 60], 'color': "#ffcccc"},
            {'range': [60, 80], 'color': "#ffffcc"},
            {'range': [80, 100], 'color': "#ccffcc"}
        ],
        'bar': {'color': "#333333"}
    }
))

fig.show()

Multiple Bullet Charts

import plotly.graph_objects as go
from plotly.subplots import make_subplots

metrics = {
    'Revenue': {'actual': 85, 'target': 100, 'max': 120},
    'Profit': {'actual': 92, 'target': 90, 'max': 110},
    'Customer Sat': {'actual': 78, 'target': 85, 'max': 100},
    'Market Share': {'actual': 45, 'target': 50, 'max': 60}
}

fig = make_subplots(
    rows=len(metrics),
    cols=1,
    subplot_titles=list(metrics.keys()),
    vertical_spacing=0.15
)

for idx, (name, data) in enumerate(metrics.items(), 1):
    fig.add_trace(go.Indicator(
        mode="number+gauge",
        value=data['actual'],
        title={'text': name},
        gauge={
            'shape': "bullet",
            'axis': {'range': [None, data['max']]},
            'threshold': {
                'line': {'color': "red", 'width': 2},
                'value': data['target']
            },
            'bar': {'color': "darkblue"}
        }
    ), row=idx, col=1)

fig.update_layout(height=600)
fig.show()

When to Use Bullet Charts

Bullet Charts vs Alternatives

Gauge Bullet Chart
Takes up lots of space Compact, linear
Hard to compare multiple Easy to stack and compare
Low data-ink ratio High information density

Best Practices

Pro Tip: Bullet charts are superior to gauges for dashboards—they show the same information in 1/4 the space. Use them when you need to display many KPIs compactly!

← Back to Visualization Tips