How to Make a Double Bar Graph in Excel (Budget vs Actual Done Right)
The double bar graph is the chart finance actually uses. Two bars per month — what you budgeted, what you spent — side by side so the gap is visible without anyone reading a number. It goes on the front page of the management pack, and it takes about forty seconds to insert and twenty minutes to stop looking amateur.
The twenty minutes are the bars sitting so far apart that the pairs stop reading as pairs, one series hiding behind the other because someone touched the secondary axis, six-figure axis labels eating a third of the plot area, and a category axis that has quietly decided your months are dates. This post builds the budget-versus-actual version end to end on current Microsoft 365: layout, insert steps, the clustered-versus-stacked decision, the two settings that fix bar spacing, labelling that informs instead of cluttering, and the this-year-versus-last-year variant.
First, the naming: Excel does not call it a bar graph
Everyone says "double bar graph". Excel splits the term in two:
- Column chart — bars run vertically, categories along the bottom. This is what most people mean.
- Bar chart — bars run horizontally, categories down the left.
So "double bar graph" is, in Excel's language, a clustered column chart (or a clustered bar chart if you want it lying down). "Clustered" is the word doing the work: multiple series grouped per category. Search the ribbon for "double bar" and you will find nothing.
Orientation follows the categories. Time — months, quarters, years — takes a clustered column, because time reads left to right. Long names, more than about ten of them, or cost-centre and GL-account labels take a clustered bar, so the text sits horizontally rather than at 45 degrees. Rotated axis labels are the most common self-inflicted wound in a management pack.
Lay the data out so Excel gets it right first time
Excel guesses the series, the categories and the orientation from the shape of the block you select. Give it the shape it expects and the default chart is nearly finished.
| A | B | C | |
|---|---|---|---|
| 1 | Month | Budget | Actual |
| 2 | Jan | 68,000 | 71,820 |
| 3 | Feb | 68,000 | 66,140 |
| 4 | Mar | 72,000 | 78,300 |
| 5 | Apr | 72,000 | 69,450 |
Four rules behind that block:
- Categories in the first column, one series per column after it. Two series columns give two bars per month; a third gives three per cluster. "Double" is not a chart type, just a count of columns.
- Header text in row 1. Those cells become the legend entries, so write "Budget" and "Actual", not "B" and "A".
- Keep the months as text — "Jan", "Feb". If column A contains real dates, Excel switches the category axis to a date axis and spaces the points by calendar distance, shifting the bars and inserting phantom gaps for missing months. The fix: right-click the category axis > Format Axis > Axis Options > Axis Type > Text axis.
- Never leave the first column holding bare numbers. If A1 is empty or holds text, Excel reads row 1 and column A as labels. But if column A holds numbers — years like 2024, 2025, 2026 — Excel plots them as a third data series and you get a mysterious extra bar towering over everything. Format that column as text.
Two habits that pay for themselves. Make it a Table: select the block, press Ctrl+T, tick "My table has headers". Charts built on a Table extend automatically when you add July. If you are assembling the block from a transaction list rather than typing it, the SUMIFS and PivotTable routes are in summarising data in Excel.
And use NA() for months that have not happened yet. A blank Actual cell is fine, but a formula returning "" is not — an empty string charts as zero, so December shows a bar flat on the axis as though you spent nothing:
=IF(ISBLANK('Ledger'!D2),NA(),'Ledger'!D2)
#N/A is the one value Excel charts as genuinely absent.
Insert the clustered column chart
- Select the whole block including headers and the category column.
- Insert tab > Charts group > the Insert Column or Bar Chart icon.
- Under 2-D Column, choose the thumbnail whose tooltip reads Clustered Column — the leftmost one in that row on current builds. Hover to confirm rather than counting: the neighbouring Stacked Column icon looks near-identical at that size, and the thumbnail order has shifted between Excel versions.
- The chart appears with Budget and Actual side by side, a legend, and a title reading "Chart Title".
Two shortcuts: with the range selected, Alt+F1 drops a default chart onto the sheet, F11 onto its own chart sheet.
If the bars are grouped by series instead of by month — two tall clusters labelled Budget and Actual, with six months inside each — Excel read the block the other way round. Select the chart, then Chart Design tab > Data group > Switch Row/Column. That one button is the fix; the sheet does not need rearranging.
For the horizontal version, choose 2-D Bar > Clustered Bar at step 3, and make one correction Excel will not make for you: a bar chart plots the first row at the bottom, so January ends up beneath June and the chart reads upside down. Right-click the category axis > Format Axis > Axis Options > tick Categories in reverse order, then set Horizontal axis crosses to At maximum category so the labels jump back to the left. Both settings, always, or the labels end up stranded on the right.
Clustered, stacked or 100% stacked
The three thumbnails sit next to each other and answer completely different questions.
| Chart type | Question it answers | Use it for |
|---|---|---|
| Clustered | How does A compare with B, category by category? | Budget vs actual, this year vs last, forecast vs plan |
| Stacked | What is the total, and what is inside it? | Revenue by product line per month, cost build-up |
| 100% stacked | What is the mix, ignoring size? | Cost of sales as a share of revenue |
Budget versus actual is always clustered. Stacking budget on top of actual produces a column of 139,820 for January that means nothing — no total in the business equals budget plus actual. The chart still looks tidy, so the mis-click survives review.
The real limit on clustered charts is series count: two is comfortable, three workable, four the ceiling. Beyond that the clusters turn into a picket fence and readers stop matching colours to the legend.
Fix the spacing: gap width and series overlap
This is the step that separates a default chart from a designed one. Right-click any bar > Format Data Series > the Series Options icon (three vertical bars). Two sliders:
- Series Overlap (−100% to 100%) — spacing inside a pair. At −100% the bars are pushed fully apart; at 0% they touch; positive values overlap them, later series in front.
- Gap Width (0% to 500%) — spacing between pairs, as a percentage of one bar's width. At 500% the gaps are five bars wide and the columns look like pins.
On current Microsoft 365 builds (checked as of 2026) the default is Overlap −27%, Gap Width 219%, which is why the stock chart reads as twelve lonely bars rather than six pairs — older versions ship slightly different numbers, so read what your own pane says rather than assuming. The gap inside a pair has to be smaller than the gap between pairs:
| Setting | Default | Set it to | Effect |
|---|---|---|---|
| Series Overlap | −27% | 0% to −10% | Bars touch, or nearly — the pair reads as one unit |
| Gap Width | 219% | 60% to 100% | Pairs separate cleanly, bars gain useful width |
Both apply to the whole plot, not just the series you right-clicked. Avoid positive overlap here: it hides part of the shorter bar behind the taller one, and readers misjudge the value they cannot see.
The overlap problem you did not ask for
If your two bars sit fully on top of each other — one series completely hidden — the cause is almost never the overlap slider. It is the secondary axis. A series plotted there is drawn in its own coordinate space that knows nothing about the primary series, so both start at the same position at full width. The fix: right-click that series > Format Data Series > Series Options > Plot Series On > Primary Axis. Budget and actual share a unit and an order of magnitude, so a secondary axis here is nearly always an accident.
If you genuinely need one — variance percentage, say — do not fight it with bars. Use Chart Design > Change Chart Type > Combo, keep Budget and Actual as Clustered Column on the primary axis, and set Variance % to Line on the secondary, so the line rides above the clusters instead of competing with them. The same combo technique underpins the cost-volume-profit chart.
Labels people can actually read
Every element below is toggled from the + button (Chart Elements) at the top-right corner of a selected chart; hover an item and click its arrow for sub-options.
Axis numbers, scaled. Revenue in the tens of thousands produces axis labels like 80,000 that eat width and add nothing. Right-click the value axis > Format Axis > Number > Category: Custom > enter:
#,##0,"k"
The trailing comma divides the display by 1,000, so 80,000 shows as 80k; two commas — #,##0,,"m" — gives millions. Stored values are untouched, so name the unit once in the title: "Revenue vs budget (AED 000s)".
Data labels, but not on both series. Labelling Budget and Actual doubles the ink and halves the readability. Label one — usually Actual. Click that series once to select all its bars, then + > Data Labels > Outside End, and apply the same scaled code via Format Data Labels > Number.
Or label the variance instead of the value — the version that earns the chart page one. Add a helper column holding the variance as text:
=TEXT((C2-B2)/B2,"+0.0%;-0.0%")
Select the Actual series, + > Data Labels, then right-click a label > Format Data Labels > Label Options > tick Value From Cells, select the helper range, untick Value. Each Actual bar now carries "+5.6%" or "−2.7%", and the chart states the conclusion rather than leaving it to be inferred.
A self-updating title. Click the chart title once, type = in the formula bar, click a cell holding ="Budget vs actual — "&TEXT(TODAY(),"mmm yyyy"), press Enter.
Legend at the top (+ > Legend > Top) — a right-hand legend steals plot width for no benefit with two entries. And colour with intent: give Budget a light grey or outline-only fill and Actual one strong colour, via Format tab > Shape Fill / Shape Outline. The reference bar recedes, the measured bar advances, and the comparison happens without a legend lookup. Gridlines can usually go once the bars are labelled.
How HISAB 360 helps
The chart above is maybe fifteen clicks once you know the route, and every month it is the same fifteen clicks on fresh data. HISAB 360 is a paid Excel add-in with an AI chat panel docked inside the workbook, and its chart engine handles that repetition: ask for a clustered column chart of budget against actual by month and it builds the chart from your range, applies sensible gap width and overlap, scales the axis, labels one series rather than both, and places it clear of your data.
It matters more when the block underneath is not typed by hand. HISAB connects to six accounting systems — QuickBooks Online, Xero, Zoho Books, Odoo, FreshBooks and Sage Accounting — pulling GL activity, invoices and bills into sheets, so the Actual column comes from the ledger rather than last week's export. Ask the panel to summarise that activity by month and category and you have the two-column block the chart needs.
Honest limits: it is Windows desktop Excel only — Microsoft 365 or 2016 and later, not Mac, not Excel on the web — and it is paid, with a 15-day trial that includes 50 AI credits and needs no card. A generated chart still deserves the check you would give a junior's: confirm the series are the right way round and the axis starts at zero.
The same chart, this year versus last
Swap the two series — Month, 2025, 2026 instead of Month, Budget, Actual — and the identical construction answers a different question: are we ahead of where we were? Same steps, three adjustments.
- Order the columns chronologically, prior year first. The eye reads left to right inside each pair as earlier to later, and reversing it makes growth look like decline for the first few seconds.
- Colour the prior year grey and the current year solid. History is context; this year is the subject.
- Truncate the current year at the last closed month with the
NA()formula from earlier, so November and December show no bar at all. A current-year series that collapses to the axis reads as a business falling off a cliff, and someone will react before they read the footnote.
Where the comparison feeds a forecast rather than a report, the growth-rate mechanics belong in building a financial model in Excel.
When the chart still looks wrong
| Symptom | Cause | Fix |
|---|---|---|
| Two clusters instead of twelve | Series and categories swapped | Chart Design > Switch Row/Column |
| An unexpected third bar, much taller | Column A holds numbers read as data | Format column A as text |
| Uneven spacing, gaps for missing months | Excel used a date axis | Format Axis > Axis Type > Text axis |
| One series hidden behind the other | Series on the secondary axis | Format Data Series > Plot Series On > Primary Axis |
| Bars vanish when you filter the sheet | Charts ignore hidden rows by default | Select Data > Hidden and Empty Cells > tick "Show data in hidden rows and columns" |
| Zero-height bars for future months | Formula returns "", which charts as 0 | Return NA() instead |
| Differences look enormous | Value axis does not start at zero | Format Axis > Bounds > Minimum > 0 |
That last one matters most. Excel sometimes sets the axis minimum above zero to fill the plot area, which visually triples a 4% variance. On a column or bar chart the axis must start at zero — the length of the bar is the quantity. Line charts can be truncated; bars cannot.
After the chart: explaining the gap
A double bar graph does one job well — it shows where the gap is. It cannot say why, and the meeting moves to why within about ten seconds: volume-versus-rate decomposition, sign conventions for whether a positive variance is favourable, commentary per line. See variance analysis in Excel for the mechanics and building a P&L in Excel for the statement the budget column ties back to. Build the chart from the same block that feeds the variance table and the two agree by construction; build it from a pasted snapshot and they will not.
Frequently asked questions
How do I make a double bar graph in Excel?
Lay the data out with categories in the first column and one column per series — for example Month, Budget, Actual. Select the whole block including headers, then go to Insert > Insert Column or Bar Chart > Clustered Column (the first 2-D thumbnail). Two data columns produce two bars per category. If the bars group the wrong way, use Chart Design > Switch Row/Column.
What is the difference between a clustered and a stacked bar chart?
Clustered places the series side by side, so you compare them against each other — the right choice for budget versus actual or this year versus last. Stacked places them end to end so the bar's total length is the sum, which suits a build-up such as revenue by product line. Stacking budget and actual produces a total that has no meaning.
Why are my two bars overlapping in Excel?
If the bars sit partly on top of each other, Series Overlap is set to a positive value: right-click a bar > Format Data Series > Series Options and set Overlap to 0% or slightly negative. If one series completely hides the other, the cause is different — that series is plotted on the secondary axis. In the same pane, set Plot Series On to Primary Axis.
How do I get more space between the pairs of bars?
Use Gap Width in the same Format Data Series pane. It sets the space between clusters as a percentage of bar width; the default 219% is generous, and 60–100% gives wider bars with clear separation. Series Overlap handles spacing within each pair — set that near 0% so the two bars read as one unit. Both apply to every series at once.
Try HISAB 360 on your own workbook
HISAB 360 is an AI assistant inside Excel for accountants and finance teams — it writes macros, Power Query and formulas from plain English, and connects two-way to QuickBooks, Xero, Zoho Books, Odoo, FreshBooks and Sage. The 15-day trial is the full product, no card required.