Monthly sessions by acquisition source
Growth is a comparison of slopes, so every source is drawn on one axis at one scale - not one panel each.
How it decided
Web traffic: 1,825 rows, 6 columns. day, source and sessions. Bounce rate is a different question.
1,825 rows in, 60 out across 3 columns. Growth is a comparison of slopes, so every source is drawn on one axis at one scale - not one panel each.
line. One line per source on a shared axis. Small multiples would make the slopes incomparable, which is the whole question.
Palette, spacing, axis titles and legend placement applied. 0 issues found.
The transformation
This is the code, not a description of it — the chart above was drawn from what it returns, and the notebook download runs the same lines against the same file.
df["month"] = df["day"].astype("datetime64[ns]").dt.to_period("M").dt.to_timestamp()
result = df.groupby(["month", "source"], as_index=False)["sessions"].sum()
What it charted
60 rows out of 1,825, 3 columns. First 8 shown.
| month | source | sessions |
|---|---|---|
| 2025-01-01 | Direct | 68415 |
| 2025-01-01 | Organic | 147228 |
| 2025-01-01 | Paid | 51087 |
| 2025-01-01 | Referral | 17537 |
| 2025-01-01 | Social | 25915 |
| 2025-02-01 | Direct | 61944 |
| 2025-02-01 | Organic | 132899 |
| 2025-02-01 | Paid | 46253 |