Skip to content

DS 103 · Module 1

See Accurately: Visual Choice and Chart Reading

Start from the question a chart must answer, then choose the chart family, scale, and encoding that answer it honestly.

Start Section 1
0 / 5 completed
Sync my progressJoin a session to keep progress across devices and share it with your instructor

Info

After you join, your completed lesson numbers are sent to your instructor together with your learner code, so they can see your progress. Use the codes your instructor gave you, and do not enter your name, company secrets or other personal data. Progress is kept with the rest of that session's data.

Learning objectives

  • Start from analytical question and audience; define one primary message per chart
  • Match analytical intent to chart family; avoid chart types that distort comparisons
  • Use scales honestly; understand zero baselines, log scales, sorting, and denominator effects
  • Use restrained encodings; direct labels; color-independent meaning; accessible text alternatives
  • Create comparison, trend, and distribution charts from a common dataset and critique them

The job of a chart

30 min

The Job of a Chart: Answer a Question, Not Decorate

Learning objective: start from analytical question and audience; define one primary message per chart.

A colleague asks you to "visualize the quarterly numbers." If you open a spreadsheet and pick whatever chart type looks nice, you have already lost the thread: a chart is not decoration, it is the answer to a specific question for a specific audience. Before choosing a chart type, you need to know what question it answers and what the one sentence underneath it should say.

Decoration first

Pick an attractive chart type, add every available metric, apply a colorful theme, and hope the reader finds the point.

Question first

Question
State the one analytical question this chart must answer (a comparison, a trend, a distribution, a relationship, or a composition).
Audience
Identify who reads this and what decision or follow-up question they have.
Message
Write the one sentence the chart should let the reader say out loud.
From vague request to a chart brief
Vague requestChart brief
"Visualize the quarterly numbers"Question: which of our five product lines grew fastest this quarter? Audience: department head deciding where to invest next quarter.
"Show the ESG data"Question: how has our water-intensity metric trended over the last two years? Audience: sustainability committee checking progress against a target.
This course's dataset (load first, ask the question before plotting)
import pandas as pd

# clean: a multi-entity, multi-period indicator table (ESG / campus / operations)
df = pd.read_csv("DS103_Indicators_Clean.csv")
df.shape
df.head()

# Before plotting anything: what is the ONE question this chart must answer?
question = "Which entities had the highest emissions intensity in the latest period?"

Warning

Data safety reminder: every exercise in this course uses the synthetic files provided. Unless authorized, never paste confidential institutional or company data, customer data, or personal data into an AI tool or a practice environment.

Info

Human, AI, Human: a person defines the question, the audience, and the one message a chart must carry; AI may help draft the chart; a person checks whether the result actually answers the stated question before it ships.
  • State the question in one sentence, and make it exactly one of: comparison, trend, distribution, relationship, or composition
  • Name the audience as a specific role or decision-maker, not "everyone"
  • Write the message so the reader can say it out loud within five seconds, with no extra explanation needed
  • Write the brief before drawing anything, not as a caption added after the chart is already built
Example: turning "chart the sales team numbers" into a brief

A sales manager originally asked only to "chart the sales team numbers." After a follow-up question, the real question turned out to be "which region's new-customer conversion rate dropped the most over the last four quarters?", and the audience was the regional director deciding where to put next quarter's training budget. With that brief in hand, the right chart type (a trend line colored by region with direct labels) is almost immediate, without testing seven or eight chart types first.

A strong message

  • Fits in one sentence with no spoken explanation needed
  • Names a specific entity, period, or value
  • States clearly what is being compared, tracked, or highlighted

A weak message

  • Only repeats variable names already on the axis or legend
  • Needs a spoken explanation before the point lands
  • Tries to answer more than one question at once
Check yourself

A manager asks you to "make a chart of everything in the sales file." What should you do first?

A manager asks you to "make a chart of everything in the sales file." What should you do first?

Key takeaway: A chart earns its place by answering one specific question for one specific audience, not by displaying more data.

Chart families

40 min

Comparison, Trend, Distribution, Relationship, Composition

Learning objective: match analytical intent to chart family; avoid chart types that distort comparisons.

Most analytical questions fall into a small number of families, and each family has a chart type that answers it well and several that quietly distort it. Learning to name the family first makes the chart choice almost automatic.

Five question families and their honest chart types
FamilyQuestion shapeChart that answers it wellCommon distortion to avoid
ComparisonHow do categories compare on one metric?Bar chart (sorted, shared baseline)Pie chart with many slices; 3-D bars that distort height
TrendHow does a metric change over time?Line chartBar chart with inconsistent time intervals
DistributionHow are values spread across a population?Histogram or box plotA single average that hides the spread
RelationshipHow do two continuous variables relate?Scatter plotA trend line shown without the underlying points
CompositionHow do parts make up a whole?Stacked bar (few categories) or 100% stacked barPie chart with more than about five slices
Same data, two chart families, two different questions
import matplotlib.pyplot as plt

latest = df[df["period"] == df["period"].max()]
comparison = latest[latest["metric"] == "emissions_intensity"].sort_values("value", ascending=False)

# Comparison question: bar chart, sorted, shared baseline
plt.bar(comparison["entity_id"], comparison["value"])

trend = df[(df["entity_id"] == "E01") & (df["metric"] == "emissions_intensity")].sort_values("period")
# Trend question: line chart over the same metric, one entity, many periods
plt.plot(trend["period"], trend["value"])

Warning

A pie chart with more than about five categories forces the reader to compare small angles, which people are bad at doing accurately. If the real question is a ranked comparison, a sorted bar chart nearly always communicates it better.
  • Name the question family before opening any charting tool: comparison, trend, distribution, relationship, or composition
  • A sorted bar chart with a shared baseline is the safest default for category comparisons
  • Reserve line charts for values that change over a continuous sequence, usually time
  • Do not force a composition chart (pie, stacked bar) onto a comparison question; it hides the ranking the reader actually needs
Example: ignoring the question family leads to a misleading chart

An analyst wanted to show how five service sites differ in on-time delivery rate, but picked a colorful pie chart because "it looked more lively." Because the slice angles were close in size, readers could not tell which site was actually lagging. Switching to a sorted bar chart made the lagging site immediately visible, without changing a single number.

  1. Name the question family
    State whether this is a comparison, trend, distribution, relationship, or composition question before doing anything else.
  2. Check the category count
    For comparison or composition questions, once categories run past five to seven, a bar chart is usually clearer than a pie chart or a crowded legend.
  3. Pick the matching chart and check for distortion risk
    Use the table to choose the matching chart family, then check it against the common distortions to avoid.
Check yourself

You need to compare the total emissions of six product lines for the latest quarter. Which chart family fits this question?

You need to compare the total emissions of six product lines for the latest quarter. Which chart family fits this question?

Key takeaway: Naming the question family first - comparison, trend, distribution, relationship, or composition - nearly determines the right chart type on its own.

Axes, scales, and baselines

35 min

Axes, Scales, Ordering, and Baselines

Learning objective: use scales honestly; understand zero baselines, log scales, sorting, and denominator effects.

A chart can use the right chart type and still mislead through its scale. The most common ways this happens are a bar chart that does not start at zero, a linear scale used for values that span several orders of magnitude, an arbitrary sort order, and a raw count compared without its denominator.

Honest scale choices

  • Bar charts start their value axis at 0
  • A log scale is used, and labeled, when values span orders of magnitude
  • Categories are sorted by the value being compared, not alphabetically by default
  • A rate or ratio is shown when comparing entities of different sizes

Risky scale choices

  • A bar chart y-axis starting at a non-zero value, exaggerating small differences
  • A linear scale that compresses small values into invisibility
  • An unexplained sort order that happens to favor one conclusion
  • A raw count compared across entities of very different sizes with no denominator
Check the baseline and the ratio, not just the chart type
# A bar chart's y-axis must include 0, or the visual gap is exaggerated
plt.bar(comparison["entity_id"], comparison["value"])
plt.ylim(bottom=0)

# Comparing entities of different sizes: use a ratio, not a raw count, when one exists
per_unit = comparison.assign(rate=comparison["value"] / comparison["denominator"])
When a denominator changes the answer
Raw comparisonRate comparisonWhy it matters
Entity A has more total incidents than Entity BEntity A has fewer incidents per 1,000 staff than Entity BEntity A is a much larger organization; the raw count alone reflects size, not performance

Warning

A truncated y-axis is one of the most common and most persuasive ways a chart misleads without anyone changing a single number. Always check where the axis starts before trusting how large a difference looks.
Example: a linear scale hides a small site's change

In a bar chart comparing electricity use across sites, the largest site used 40 times more power than the smallest. On a linear scale, the smaller sites sit almost on the axis line and their year-over-year change is invisible. A clearly labeled log scale reveals every site's relative change, but the chart must say "log scale" explicitly, or readers will misjudge how large the gaps really are.

  • Does the bar chart's value axis start at 0?
  • Do the values span multiple orders of magnitude, requiring a labeled log scale?
  • Is the sort order justified by something other than favoring one conclusion?
  • Has a raw count been converted to a rate before comparing entities of different sizes?
Check yourself

A bar chart's y-axis runs from 80 to 100 instead of 0 to 100, and two bars at 90 and 96 look roughly twice as tall as each other. What is the most correct description of this chart?

A bar chart's y-axis runs from 80 to 100 instead of 0 to 100, and two bars at 90 and 96 look roughly twice as tall as each other. What is the most correct description of this chart?

Key takeaway: A chart can use the right chart type and still mislead through its axis baseline, its scale, its sort order, or a missing denominator.

Color, labels, and accessibility

35 min

Color, Labels, and Accessibility

Learning objective: use restrained encodings; direct labels; color-independent meaning; accessible text alternatives.

Color is one of the weakest channels for carrying precise meaning: roughly one in twelve men has some form of color-vision deficiency, printed or exported charts often lose color entirely, and a legend forces the reader to look back and forth between the chart and a key. Restrained, redundant encoding fixes all three problems at once.

Encoding choices and their accessibility risk
ChoiceRiskMore accessible alternative
Only red vs. green marks pass/failIndistinguishable to some color-vision-deficient viewers and in grayscaleAdd a shape, pattern, or direct text label alongside the color
A distant legend maps color to categoryForces constant back-and-forth eye movement; easy to misreadLabel each series directly at its line or bar end
A chart title only repeats the axis variable namesWastes the one line most readers actually look atA title that states the chart's main finding or question
Direct labels instead of a distant legend
for _, row in trend.tail(1).iterrows():
    plt.annotate(row["entity_id"], (row["period"], row["value"]))

plt.title("Entity E01: emissions intensity fell 18% since 2023")  # states the finding, not just the axis names

Warning

A chart that only "looks" accessible because it uses a colorblind-friendly palette can still fail if the meaning disappears entirely in grayscale printing or a black-and-white photocopy. Test with a grayscale preview, not just a palette checker.
  • Never let color be the only channel that carries meaning; pair it with a label, shape, or pattern
  • Prefer direct labels on the chart over a legend the reader must decode separately
  • Write titles that state the finding or the question, not just the variable names already on the axes
  • Provide a one- or two-sentence text summary of the chart's main point for screen-reader users
Example: a chart that disappears in grayscale

A chart used red, orange, and yellow to mark risk levels and looked clear on a color screen. A committee asked for a black-and-white printout to pass around in a meeting, and all three colors printed as nearly the same shade of gray, erasing the distinction entirely. Adding shapes (circle, triangle, square) and direct text labels let the printed version communicate the same risk levels correctly.

  1. Preview in grayscale
    Convert the chart to grayscale or a black-and-white print preview and confirm every category is still distinguishable.
  2. Hide the legend, read the direct labels
    Temporarily hide the legend and confirm the reader can still follow each series from its direct label alone.
  3. Read only the title and summary aloud
    Read only the chart title and a one-sentence summary aloud and confirm a screen-reader user would still get the point.
Check yourself

A dashboard uses only red and green dots to show which sites passed or failed a safety check. What is the most correct assessment?

A dashboard uses only red and green dots to show which sites passed or failed a safety check. What is the most correct assessment?

Key takeaway: Restrained, redundant encoding - direct labels, shapes, and informative titles - makes a chart accessible instead of merely colorful.

Guided Lab

45 min

Guided Lab: From Table to Three Evidence Charts

Learning objective: with instructor guidance, create comparison, trend, and distribution charts from a common dataset and critique them.

Info

Lab question: using the same indicators dataset, what does a comparison chart, a trend chart, and a distribution chart each reveal - and what does each one fail to show on its own?
  1. Load and inspect
    Load the clean indicators file and check its shape, entities, periods, and metrics.
  2. Build a comparison chart
    Pick one metric and the latest period; build a sorted bar chart comparing all entities, with a zero baseline.
  3. Build a trend chart
    Pick one entity and metric; build a line chart across all available periods.
  4. Build a distribution chart
    Pick one metric across all entities and periods; build a histogram of its values.
  5. Write one evidence statement per chart
    For each chart, write a one-sentence claim that stays inside what that chart alone can support.
  6. Critique each chart
    For each chart, name one real question it cannot answer on its own.
  7. Check for a denominator effect
    Confirm whether any comparison should use a rate instead of a raw value.
Evidence statement patterns (fill in with your own output)
Chart typeWhat it can supportWhat it cannot support alone
Comparison (bar)"In the latest period, Entity [X] had the highest [metric]."Why entity X is highest, or whether the difference is meaningful over time
Trend (line)"[Metric] for Entity [X] fell/rose by [amount] between [period] and [period]."Whether the trend will continue, or what caused the change
Distribution (histogram)"Most entities fall between [range]; a small number are far above/below that range."Which specific entity is the outlier, without also checking the comparison chart

Warning

None of these three charts alone can support a causal claim about why a value is high, low, or changing. Keep each evidence statement bounded to what that specific chart shows.

Done

If AI helps draft the chart code, check every item yourself: does the axis start at zero where it should, is the sort order meaningful, and does the evidence statement stay inside what the chart actually shows. AI can speed up drafting; verification and the conclusion remain a human responsibility.
  • Stopping after one chart type instead of cross-checking the same conclusion with the other two families
  • Writing an evidence statement that claims more than the chart it sits next to can support
  • Forgetting to check for a denominator effect before comparing raw values across entities of different sizes

Key takeaway: Comparison, trend, and distribution charts each answer a different question from the same data; a trustworthy analysis uses more than one and states clearly what each can and cannot support.

What next?