Bullet Charts for KPI Dashboards
A bullet chart (also called a bullet graph) is a compact horizontal bar that shows a single measure against a target marker, on top of shaded qualitative ranges like poor/satisfactory/good. Stephen Few designed it as a space-efficient replacement for dashboard gauges: same information, about a quarter of the space.
What Are the Components of a Bullet Chart?
Every bullet chart has three layers: a dark featured bar for the actual measure, a perpendicular line for the target, and two to five muted background bands encoding qualitative performance ranges. You read it in one glance: did the bar cross the target line, and which band did it land in?
1. Performance measure (dark inner bar)
- The actual value, e.g. revenue to date
2. Comparative measure / target (vertical tick)
- Goal, budget, or last year's value
3. Qualitative ranges (background bands)
- e.g. Poor | Satisfactory | Good
- Use shades of ONE hue (light to dark gray),
not red/yellow/green traffic lights
Optional: a second tick for a secondary
comparison (e.g. same period last year)
Bullet Chart vs Gauge: Which Should You Use?
Use a bullet chart almost every time: it encodes the same actual-vs-target information as a radial gauge in a fraction of the space, and because bullets are linear, a dozen of them stack into an instantly comparable column, which gauges can't do.
| 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 |
| Familiar "speedometer" look | Needs a one-time explanation |
The gauge's only real advantage is familiarity. If your stakeholders insist on gauges, show them ten KPIs as stacked bullets next to ten gauges once; the argument usually ends there.
How Do You Make a Bullet Chart in Excel?
Excel has no native bullet chart type, but a stacked bar chart plus an error bar gets you there in about five minutes: the ranges become stacked segments, the actual value becomes a narrow overlaid bar, and the target becomes an error-bar tick.
1. Data: ranges as increments (Poor=60, OK=20, Good=20),
plus Actual=85 and Target=100
2. Insert > Stacked Bar chart with all five values
3. Move "Actual" to the Secondary Axis and raise its
gap width (~350%) so it draws as a narrow inner bar
4. Recolor range segments light/medium/dark gray;
make Actual near-black
5. For Target: set the series fill to none, then add
a custom minus-direction Error Bar (100%) to draw
the vertical tick
6. Sync both axes to the same min/max, then delete
the secondary axis
How Do You Make a Bullet Chart in Python?
In matplotlib, draw the ranges as layered barh calls, the measure as a thinner bar on top, and the target with axvline; in Plotly, bullet is a built-in shape of the Indicator trace.
import matplotlib.pyplot as plt
actual, target = 85, 100
ranges = [(0, 60, "#d9d9d9"), (60, 80, "#bdbdbd"), (80, 120, "#969696")]
fig, ax = plt.subplots(figsize=(6, 1.2))
for start, end, color in ranges: # qualitative bands
ax.barh(0, end - start, left=start, height=0.8, color=color)
ax.barh(0, actual, height=0.3, color="#222222") # measure bar
ax.axvline(target, ymin=0.15, ymax=0.85, # target tick
color="black", linewidth=2)
ax.set_yticks([]); ax.set_xlim(0, 120)
ax.set_title("Sales vs Target", loc="left")
plt.show()
The Plotly version is shorter because the shape is native:
import plotly.graph_objects as go
fig = go.Figure(go.Indicator(
mode="number+gauge+delta",
value=85,
delta={'reference': 100},
gauge={
'shape': "bullet",
'axis': {'range': [None, 120]},
'threshold': {'line': {'color': "black", 'width': 2},
'value': 100},
'steps': [{'range': [0, 60], 'color': "#d9d9d9"},
{'range': [60, 80], 'color': "#bdbdbd"},
{'range': [80, 120], 'color': "#969696"}],
'bar': {'color': "#222222"}
}
))
fig.show()
How Do You Make a Bullet Chart in Tableau?
Tableau ships bullet graphs in the Show Me panel: put your measure and target on a worksheet, click the bullet graph icon, and Tableau draws the bar, reference line, and distribution bands automatically.
1. Drag the KPI dimension to Rows, Actual to Columns
2. Add Target to Detail
3. Show Me > Bullet Graph
4. If the bar and tick are swapped, right-click the
axis > "Swap Reference Line Fields"
5. Right-click the axis > Edit Reference Line to set
the 60%/80% distribution bands of target
Which Bullet Chart Components and Libraries Exist?
Most major charting libraries offer a bullet chart component either natively or via a small plugin, so for the web you rarely need to build one from raw rectangles.
- D3.js: no core bullet type, but Mike Bostock's classic bullet chart plugin (
d3.bullet) is the reference implementation most wrappers descend from. - ECharts: compose one from a horizontal stacked
barseries plusmarkLinefor the target; the gallery's bullet example is copy-paste ready. - Plotly / plotly.js: native support via the
indicatortrace withgauge.shape: "bullet". - Highcharts: a first-class
bulletseries type in the official bullet module (modules/bullet.js), withtargetOptionsand plot bands for ranges. - React components: Nivo ships
@nivo/bullet; amCharts and Syncfusion also include bullet graph components with tooltips and animation built in.
When Should You Use Bullet Charts?
Reach for bullet charts whenever you need many actual-vs-target comparisons in limited space, which is exactly the situation in most KPI dashboards and scorecards.
- KPI dashboards and performance scorecards
- Goal and quota tracking
- Budget vs actual comparisons
- Space-limited reports (each bullet needs ~30px of height)
They pair naturally with sparklines in a metrics table: sparkline for the trend, bullet for status vs target. For the surrounding layout, see dashboard design principles.
Bullet Chart Best Practices
The design rules are mostly about restraint: muted bands, one dark measure bar, and consistent scales so a column of bullets reads like a single table.
- Use 3 (at most 5) qualitative ranges in shades of a single hue, not traffic-light colors
- Keep the measure bar the darkest element on the chart
- Align bullets vertically and share scales where metrics are comparable
- Show the actual value as a number next to each bullet
- Make the target line prominent; it's the whole point
- Reverse the band order for "lower is better" metrics like cost or churn
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