Skip to learning content

DATA SCIENCE PYTHON PLAYGROUND

Data Foundations · A little practice goes a long way.

← Visualise lessonsTINY TABLES · REAL PYTHON · YOUR PACE
Make a useful report · V36 · 8 MIN

Avoid misleading charts

Make the scale and selection honest.

Exercises within this concept

  1. FollowFollow the techniqueCurrent exercise
  2. ChangeAdapt a requirement
  3. TransferCombine earlier skills

Understand the idea

Bar length represents magnitude, so use a zero baseline. Choose an order that supports the comparison without changing the values.

Concept sketch: zero baseline; deliberate category orderTotal, descending09A6B3Czero baseline; deliberate category order
Illustration · not the exercise output

A small example

Values 4 and 5 differ by 25%. A y-axis beginning at 3 exaggerates their apparent bar-length ratio.

Follow the code

Apply the idea to the supplied table. Read from top to bottom; the final line displays the result.

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(figsize=(6, 4))
means = df.groupby("flavour")["price"].mean().sort_values(ascending=False)
ax.bar(means.index, means.values)
ax.set_ylim(bottom=0)
ax.set(title="Candy shop", xlabel="flavour", ylabel="Mean price")
fig.tight_layout()
plt.show()

What each part does

sort_values(ascending=False)
a meaningful category order
ax.set_ylim(bottom=0)
honest bar-length baseline
Other choices for later exercises
alpha=
transparency for overlapping points
order=[...]
set a deliberate category order

Your inputs

The editable setup on the right creates df. Run executes the setup and your work from top to bottom.

Candy shop · 6 synthetic rows
candyflavourpriceratingshelf
Gummy Bearfruity1.24.1A
Choco Popchocolate2.14.6B
Mint Bitemint1.53.8A
Berry Loopfruity2.84.4B
Cocoa Cubechocolate3.44.9A
Lemon Dropfruity1.84B

Your task · Follow

  1. Using df, compare mean price by flavour as bars, highest mean first.
  2. Start the y-axis at zero so lengths represent the price comparison fairly.
  3. Chart: title "Candy shop"; x "flavour"; y "Mean price".
Hint

Choose the observations first, then map the requested measurements to the chart.

Reveal solution

One way to do it. Keep any supplied setup in the editor and use this in the Your work section.

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(figsize=(6, 4))
means = df.groupby("flavour")["price"].mean().sort_values(ascending=False)
ax.bar(means.index, means.values)
ax.set_ylim(bottom=0)
ax.set(title="Candy shop", xlabel="flavour", ylabel="Mean price")
fig.tight_layout()
plt.show()
Your task · Follow
  1. Using df, compare mean price by flavour as bars, highest mean first.
  2. Start the y-axis at zero so lengths represent the price comparison fairly.
  3. Chart: title "Candy shop"; x "flavour"; y "Mean price".

Tab: indent · Shift+Tab: outdent · Esc, then Tab: leave editor

Edit Python. Control or Command plus Enter runs it. Tab indents by four spaces. Shift plus Tab outdents. Press Escape, then Tab or Shift plus Tab to leave the editor.

Each run executes all editor code in a fresh Python session. Display charts with plt.show().

Python starts when you open a lesson.

Output

Run your code to see what Python returns.