Skip to main content

QGIS Basics for Journalists

Turn a spreadsheet of council figures into a map that stands up to scrutiny — using free, open-source desktop GIS. No subscription, no server.

Last reviewed: Next review due:

1. What is QGIS and why journalists use it

QGIS is a free, open-source Geographic Information System — desktop software for storing, analysing and mapping spatial data. A GIS understands that a row of data has a location: a council area, a postcode, a river, a school. That lets you join ordinary tables to geographic boundaries and draw the result as a map. For journalists, it is the bridge between a downloaded dataset and a publishable graphic that shows where a story is happening.

Unlike a quick online map maker, QGIS gives you full control over the projection, the classification and the styling — the exact decisions that determine whether a map informs or misleads. It is the tool behind a great deal of local and national data journalism, and everything below can be done on a standard laptop.

2. Installing QGIS

Download the installer from qgis.org. You will be offered two streams: the Long Term Release (LTR), which is the most stable and best for newsroom work, and the latest release with newer features. Choose the LTR unless you need a specific new tool. The installer also bundles GDAL, the underlying geospatial toolkit, so command-line utilities such as ogr2ogr are available too.

On first launch the interface can look busy. The three things you use constantly are the Layers panel (bottom left, listing what is on the map), the map canvas (the big central view) and the attribute table (the spreadsheet behind any layer, opened by right-clicking it).

3. Loading a base map and vector layers

A base map gives geographic context. The simplest route is the built-in QuickMapServicesplugin (Plugins → Manage and Install Plugins), which adds OpenStreetMap and other tile backgrounds in one click. Load it first so everything else sits on top.

Next add your vector layers — the shapes you care about. Use Layer → Add Layer → Add Vector Layer, then browse to a shapefile (.shp) or GeoJSON (.geojson). Boundary files for UK councils, wards and constituencies come from the ONS Open Geography Portal. If you ever need to convert between formats, GDAL does it from the OSGeo4W shell:

ogr2ogr -f GPKG wards.gpkg wards.geojson

Check the layer's coordinate reference system (CRS). UK national data is usually in British National Grid (EPSG:27700); web tiles use Web Mercator (EPSG:3857). QGIS reprojects on the fly, but mixing them without care distorts distances and areas.

4. Attribute tables and the all-important code column

Right-click a boundary layer and choose Open Attribute Table. Each row is one area, and among the columns you will find a name and a GSS (ONS) code — a stable identifier such as E06000001 for a local authority. That code, not the name, is your reliable join key. Names change, get abbreviated and carry inconsistent punctuation; codes do not.

Before you go further, confirm your data spreadsheet also carries the same code column and that it is stored as text. A code read as a number can silently lose a leading zero and break every join.

5. Joining a data table to boundary geometry

This is the core skill. Add your statistics as a delimited-text or CSV layer (Layer → Add Layer → Add Delimited Text Layer; tick “No geometry” since it is a plain table). Then open the boundary layer's Properties → Joins, click the plus, and match the join field in your table to the target field (the GSS code) in the boundaries.

Reopen the boundary attribute table and your council figures now appear as extra columns. If they are blank, the codes did not match — check for stray spaces, differing case, or a text-versus-number mismatch. A useful sanity check is to compare the joined row count against the number of areas you expected.

Joins are virtual and recalculated each time. To freeze the result, right-click the layer and choose Export → Save Features As, writing a new GeoPackage.

6. Choropleth (graduated) styling

A choropleth shades each area by a value. Open the layer's Properties → Symbology and switch the renderer from Single Symbol to Graduated. Choose the value column, pick a colour ramp, set the number of classes, and click Classify.

The single most important rule: map a rate, not a raw count. A map of the number of burglaries will just be a map of where people live. Instead map burglaries per 1,000 households. If your table lacks a rate, calculate one in the Field Calculator:

("offences" / "households") * 1000

Use a sequential colour ramp (light to dark) for a single quantity, and a diverging ramp only when there is a meaningful midpoint, such as change from an average. Avoid rainbow ramps, which imply categories that are not there.

7. Classification: quantiles versus natural breaks

The classification method decides where the boundaries between colour bands fall — and it can completely change the story a map appears to tell. There is no neutral default, so choose consciously:

  • 1Quantiles — equal number of areas per band. Guarantees a full colour spread, but can exaggerate tiny differences and hide large ones.
  • 2Natural breaks (Jenks) — bands drawn at natural gaps in the data. Usually the most faithful for skewed distributions; the default worth reaching for.
  • 3Equal interval — the value range split into even steps. Honest for evenly spread data, but often dumps most areas into one band.
  • 4Standard deviation — bands measured from the mean. Useful for showing which areas are unusual, but hard for general readers to interpret.

Whatever you pick, try two or three methods and compare. If the headline pattern only appears under one classification, that is a warning sign, not a finding.

8. Labels and a legend

Turn on labels in Properties → Labels → Single Labels, choosing the name column. Add a halo (a light buffer around the text) so labels stay readable over dark shading, and do not label every area if the map becomes cluttered — label the ones your story names.

A choropleth is meaningless without a legend that states the units and the class breaks. Make sure the legend spells out exactly what the colours represent, for example “burglaries per 1,000 households, 2024”, so no reader can mistake a rate for a count.

9. Exporting a publication map

Never screenshot the canvas. Open Project → New Print Layout, which is a proper page designer. Add the map frame, then a legend, a scale bar, a north arrow, a title, and — crucially — a credit line naming the data source and the date.

Export at 300 dpi or more for print, or as SVG or PDF for a vector file a designer can rescale cleanly. For the web, a PNG around 150 dpi is fine. Keep the QGIS project file (.qgz) so the map is reproducible and can be corrected or updated later.

10. The ethics of map framing

Every map is an argument. The classification, the colour ramp, the number of bands and the choice of rate versus count are all editorial decisions that shape what the reader believes. A map is not more objective than a chart just because it looks like geography.

  • Beware the large-area illusion — sparsely populated rural areas dominate the visual field even when few people live there.
  • Small counts produce unstable rates; a tiny ward can top a map on a handful of events. Consider suppressing or flagging low-denominator areas.
  • State your classification method and source in the caption so the map can be checked.
  • Do not cherry-pick the one classification that produces the sharpest divide.

11. Geoprocessing you will grow into

Once joins and choropleths feel comfortable, QGIS opens up a set of analytical tools that answer richer questions. You do not need them on day one, but they are worth knowing exist:

  • Buffer — draw a zone a set distance around features, for example how many homes sit within 400 metres of a proposed site.
  • Spatial join — attach data to features by location rather than by code, such as counting incidents that fall inside each ward.
  • Dissolve — merge smaller areas into larger ones, rolling wards up into councils.
  • Clip — cut one layer to the outline of another, to focus a national dataset on your patch.

These live under the Processing Toolbox and Vector menus. Treat spatial joins with care: the result is only as trustworthy as the geographies you feed in, so prefer an official code lookup over a spatial guess whenever one exists.

12. Mapping checklist

  • I joined my data on the GSS code, not the area name.
  • I checked that no areas came back blank after the join.
  • I mapped a rate per head or per household, not a raw count.
  • I tried more than one classification and chose the most faithful.
  • My legend states the units, the year and the class breaks.
  • My exported map carries a source credit and a date.
  • I saved the .qgz project so the map is reproducible.

Get the boundaries

UK council, ward, constituency and small-area boundaries come from the ONS Open Geography Portal. Our boundary-data guide explains which geography to pick and where the codes come from.

Frequently asked questions

Is QGIS really free, and how does it compare to ArcGIS?
Yes. QGIS is free, open-source software released under the GNU General Public Licence, funded by donations and a volunteer community. There is no licence fee, no seat limit, and no expiry. It runs on Windows, macOS and Linux. ArcGIS Pro, from Esri, is the commercial standard used by many councils and government bodies, and it has some advanced features QGIS lacks. But for the vast majority of newsroom mapping — joining data to boundaries, styling choropleths and exporting print maps — QGIS does everything you need without a subscription.
What file formats will I encounter, and which should I prefer?
The two most common vector formats are the shapefile (a cluster of files sharing a name, with .shp, .shx, .dbf and .prj extensions that must be kept together) and GeoJSON (a single readable text file). The ONS and many public bodies publish boundaries as both. GeoPackage (.gpkg) is a modern single-file format that avoids the shapefile column-name length limit and is worth preferring for your own working files. QGIS opens all of these with Layer, then Add Layer, then Add Vector Layer.
My data table will not join to the boundaries. What is wrong?
Almost always a mismatch in the join key. Check that both the boundary layer and your spreadsheet use the same code — ideally the ONS GSS code, such as E06000001, rather than a name. Names fail because of case, punctuation and spelling variants: 'St. Helens' versus 'St Helens', or a trailing space. Confirm the join field is stored as text in both layers, since a code read as a number can drop leading zeros. Open both attribute tables and compare a few values side by side before joining.
Which classification method should I use for a choropleth?
There is no neutral choice, so pick deliberately and disclose it. Quantiles put an equal number of areas in each colour band, which guarantees a full spread of colour but can exaggerate small differences. Natural breaks (Jenks) find clusters in the data and usually look the most faithful for skewed distributions. Equal interval splits the value range into even steps, which is honest for evenly spread data but can leave most areas in one band. Always map a rate, not a raw count, or you will simply be mapping population.
How do I get a high-resolution map out of QGIS for print or the web?
Do not screenshot the map canvas. Use the Print Layout (Project, then New Print Layout), which is a separate page designer. Add the map, a legend, a scale bar, a north arrow, a title and your data-source credit. Set the export resolution to at least 300 dots per inch for print, or export to SVG or PDF for a vector graphic your designer can scale without pixelation. For the web, a PNG at 150 dpi is usually sufficient. Always include the source and the date on the map itself.