Challenges and Best Practices in Visualization
A chart can clarify or deceive. This page covers the traps and the habits that keep your visuals honest and useful.
Common challenges
1. Data quality A beautiful chart of wrong data is a beautiful lie. Missing values, duplicates and unit mismatches must be fixed first.
2. Over-simplification Reducing data too much can hide important detail. Averaging away a group difference, or using a pie chart for a complicated relationship, are typical examples.
3. Choosing the wrong chart
- Pie chart with 12 slices - unreadable.
- Line chart for unordered categories - implies a false trend.
- 3D bar charts - the depth distorts heights.
4. Information overload Too many colours, series and labels overwhelm the viewer. One chart should make one main point.
5. Misleading scales
- A bar chart whose y-axis starts at 90 instead of 0 makes a 2% difference look enormous.
- Dual axes can be tuned to show almost any "correlation".
- Inconsistent scales across side-by-side charts trick the eye.
6. Colour problems
About 1 in 12 men have some colour-vision deficiency. Red-green palettes are risky; prefer colour-blind-safe palettes such as viridis or colorblind.
Best practices
- Know your audience. Executives want the headline; analysts want the detail.
- Pick the right chart for the question (see the guide in the previous lesson).
- Keep design clean and consistent - same fonts, colours and label style throughout.
- Give context - title that states the insight, axis labels with units, legend, data source, date.
- Start bar charts at zero; if you must truncate an axis, say so clearly.
- Use colour with purpose - highlight what matters, grey out the rest.
- Remove chart junk - unnecessary gridlines, borders, shadows, decorations.
- Make it interactive and accessible when appropriate - tooltips, filters, alt text, readable font sizes, mobile-friendly layout.
- Annotate the important point directly on the chart.
Before and after in code
# Before: default, unlabeled
plt.bar(quality_counts.index, quality_counts.values)
# After: labelled, purposeful, honest
fig, ax = plt.subplots(figsize=(8, 5))
bars = ax.bar(quality_counts.index, quality_counts.values,
color=["#bbb" if q not in (5, 6) else "#e4572e" for q in quality_counts.index])
ax.set_title("Most wines score 5 or 6", fontsize=14, weight="bold")
ax.set_xlabel("Quality score")
ax.set_ylabel("Number of wines")
ax.bar_label(bars)
ax.spines[["top", "right"]].set_visible(False)
plt.show()
The second version has an insight-style title, highlighted bars, direct value labels and no clutter.
Self-check questions
- Can someone understand the main message in 5 seconds?
- Would the chart still be fair if the person who made it disagreed with the conclusion?
- Are units, sources and time period stated?