Multi-Series Plots and Canvas Navigation
VisiData's canvas sheet supports overlaying multiple data series in a single graph using g. — one layer per column, toggled with number keys 1–9. This lesson teaches multi-series overlay, layer control, and full canvas navigation.
The key difference: . plots one column (y-axis) against the key column (x-axis). g. plots every numeric column as a separate layer simultaneously. Use 1–9 to toggle individual layers on/off.
Sample Data Used in This Lesson
mkdir -p ~/github/practice-folder/visidata/09-metrics
cat > ~/github/practice-folder/visidata/09-metrics/server-metrics.csv << 'EOF'
hour,cpu_pct,mem_pct,disk_io_mb,req_per_sec
00,12,45,2.1,320
01,8,43,1.4,180
02,7,42,1.1,120
03,6,41,0.9,90
04,9,43,1.2,140
05,15,46,1.8,280
06,28,52,3.4,620
07,45,61,5.2,1100
08,72,74,8.9,2400
09,85,82,11.2,3200
10,88,84,12.1,3500
11,91,87,13.4,3800
12,89,86,12.8,3650
13,87,85,12.2,3400
14,90,88,13.1,3750
15,88,86,12.9,3600
16,82,81,11.8,3200
17,76,78,10.4,2800
18,65,70,8.1,2100
19,52,63,6.2,1600
20,38,56,4.8,1100
21,28,51,3.3,720
22,22,48,2.8,480
23,16,46,2.2,380
EOF
vd ~/github/practice-folder/visidata/09-metrics/server-metrics.csv
Step 1 — Prepare the Data
# Cast hour to int (x-axis)
# Move to 'hour' column
#
# Cast all metric columns to float
# Move to 'cpu_pct' → %
# Move to 'mem_pct' → %
# Move to 'disk_io_mb' → %
# Move to 'req_per_sec' → %
# Set 'hour' as key column (x-axis)
# Move to 'hour' column
!
Step 2 — Single-Series Plot (.)
Plot one metric first to understand the canvas:
# Move to 'cpu_pct' column
.
Canvas — CPU usage curve over 24 hours:
cpu_pct
│
100│ ·····
90│ ··· ·
80│ · ·
70│ · ·
60│ ·
50│ ·
40│ ·
30│ · ·
20│ · · ·
10│· · ··
0│
└────────────────────────────
0 3 6 9 12 15 18 21 23
hour
Press q to return to the source sheet.
Step 3 — Multi-Series Overlay (g.)
Plot ALL numeric columns as separate overlaid layers:
g.
All 4 metric columns (cpu_pct, mem_pct, disk_io_mb, req_per_sec) are now plotted simultaneously, each in a different color. The canvas shows the relationship between all metrics across the day.
Step 4 — Toggle Individual Layers
Inside the canvas, use number keys to toggle layers on/off:
1 toggle layer 1 (cpu_pct)
2 toggle layer 2 (mem_pct)
3 toggle layer 3 (disk_io_mb)
4 toggle layer 4 (req_per_sec)
Workflow — isolate two metrics for comparison:
# Press 3 → hide disk_io_mb
# Press 4 → hide req_per_sec
# Now only CPU and memory curves are visible — easier to compare
Toggle back:
# Press 3 again → re-show disk_io_mb
# Press 4 again → re-show req_per_sec
Step 5 — Canvas Navigation
| Key | Action |
|---|---|
h j k l | Pan left / down / up / right |
+ | Zoom in (both axes) |
- | Zoom out (both axes) |
_ | Zoom to fit all data on screen |
z_ | Zoom to fit vertically only |
x | Set x-axis range (prompt: start, end) |
y | Set y-axis range (prompt: min, max) |
v | Toggle data labels on/off |
Focus on business hours (09–17):
# Inside the canvas:
x
# Enter start: 9
# Enter end: 17
# Canvas zooms to show only hours 9 through 17
Zoom in on peak at noon:
+ # zoom in
+ # zoom in more
l # pan right to center on hour 12
Step 6 — Drill Into Data Points
# Move the canvas cursor to a data point (use h/j/k/l)
Enter
# Opens the source rows that map to that canvas area
Example — drill into the 11am peak:
# Inside the multi-series canvas:
# Pan to hour=11 area
# Press Enter
# → source sheet filtered to that time window opens
# → you can see all raw metrics for those rows
Press q to return to the canvas.
Step 7 — Compare with Frequency Table Plot
For a bar-chart style view of request volume by time of day:
# Return to source sheet
q
# Open frequency table on 'hour' column
Shift+F
# Move cursor to 'count' column (or re-add req_per_sec as aggregator)
# Plot as bar chart
.
This gives a bar-per-hour view, useful for capacity planning.
Full Canvas Key Reference
| Key | Action |
|---|---|
. | Plot current (y) column vs key (x) column |
g. | Plot all numeric columns as overlaid series |
1–9 | Toggle individual plot layer on/off |
h j k l | Pan canvas |
+ / - | Zoom in / out |
_ | Fit all data |
x | Set x-axis range |
y | Set y-axis range |
v | Toggle labels |
s | Select source rows under canvas cursor |
Enter | Open source rows for canvas area |
q | Return to source sheet |
Hands-On Practice
vd ~/github/practice-folder/visidata/09-metrics/server-metrics.csv
# 1. Cast hour to int (#), mark as key (!)
# 2. Cast cpu_pct, mem_pct to % (float)
# 3. Press . on cpu_pct → single-series canvas
# 4. Press _ → zoom to fit; press + twice → zoom in
# 5. Press q → back to source
# 6. Press g. → multi-series overlay
# 7. Press 3, 4 → hide disk and requests; compare only CPU and memory
# 8. Press 3, 4 again → restore all layers
# 9. Press x → Enter start: 6, end: 12 → zoom to morning rush
# 10. Navigate to peak area → Enter → see source rows for that period