You are viewing a free preview of this lesson.
Subscribe to unlock all 10 lessons in this course and every other course on LearningBro.
The ultimate goal of data visualisation is not just to display data — it is to communicate a message. The most technically sophisticated chart fails if the audience does not understand it or does not care. This lesson covers best practices for chart design, common mistakes to avoid, and the art of data storytelling.
A data story has three components:
| Component | Description |
|---|---|
| Data | The foundation — accurate, relevant, well-prepared |
| Narrative | The story arc — context, conflict, resolution |
| Visuals | The charts — chosen and designed to support the narrative |
A good data story answers: What happened? Why does it matter? What should we do about it?
Every compelling data story follows a structure:
Provide background. Why are we looking at this data? What is the business question?
Show the data. What patterns emerge? What is surprising or concerning?
Deliver the key finding — the "aha moment" that changes understanding.
What should the audience do with this insight? What action follows?
| Practice | Example |
|---|---|
| Use descriptive titles that state the insight, not just the topic | "Sales grew 23% in Q4" instead of "Q4 Sales" |
| Label axes with units | "Revenue (GBP thousands)" |
| Use direct labels on chart elements instead of a legend when possible | Place labels next to lines |
| Keep axis labels horizontal | Rotate only when absolutely necessary |
| Practice | Reason |
|---|---|
| Use colour purposefully | Every colour should encode meaning |
| Highlight the key data point, grey out the rest | Draws attention to the insight |
| Use accessible palettes | 8% of men have colour vision deficiency |
| Be consistent | Same colour = same meaning across charts |
| Practice | Reason |
|---|---|
| Remove chart junk (3D, unnecessary gridlines, borders) | Increases data-ink ratio |
| Align charts for comparison | Side-by-side with shared axes |
| Use white space deliberately | Prevents visual overload |
| Order categories meaningfully (by value, not alphabetically) | Makes comparison easier |
| Mistake | Why It's Harmful | Fix |
|---|---|---|
| Truncated y-axis | Exaggerates differences | Start bar charts at zero |
| Dual y-axes | Implies false correlation | Use two separate charts |
| Too many colours | Overwhelms the viewer | Limit to 5-7 colours |
| Pie chart with many slices | Impossible to compare angles | Use a bar chart |
| Missing context | Numbers without comparison are meaningless | Add benchmarks, targets, or prior periods |
| Decorative elements | Distract from the data | Simplify — less is more |
| Inconsistent scales | Misleading comparison across charts | Use shared axes and scales |
| Rainbow colour maps | Not perceptually uniform | Use sequential or diverging palettes |
Use grey for all data points except the one you want the audience to focus on.
import matplotlib.pyplot as plt
countries = ["UK", "France", "Germany", "Italy", "Spain"]
gdp = [3070, 2780, 4070, 2000, 1390]
colours = ["#CCCCCC"] * len(countries)
colours[2] = "#E74C3C" # Highlight Germany
fig, ax = plt.subplots(figsize=(8, 5))
ax.barh(countries, gdp, color=colours)
ax.set_xlabel("GDP (Billion USD)")
ax.set_title("Germany leads European GDP")
ax.spines[["top", "right"]].set_visible(False)
plt.tight_layout()
plt.show()
Draw attention to specific data points with text and arrows.
import matplotlib.pyplot as plt
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
revenue = [42, 45, 48, 52, 38, 41, 55, 58, 63, 67, 71, 80]
Subscribe to continue reading
Get full access to this lesson and all 10 lessons in this course.