Topical Map Visualiser
Use cases
Reads a tagged keyword CSV with a two-level topic hierarchy (parent > subtopic > keyword) and builds a zoomable D3.js circle packing chart via Jinja2 templating.
Circles are sized by one of five metrics: count, impressions, clicks, first_page_count (position 1-10) or top_3_count (position 1-3).
The chart uses a 10-colour pastel palette with 0.6 opacity for parent nodes.
Outputs a standalone HTML file for sharing or embedding.
Platform
Python script (requires Python 3.x)
Input
Tagged keyword CSV with parent topic, subtopic and keyword columns
Optional: metric columns (impressions, clicks, or position from GSC)
Output
Interactive zoomable circle packing HTML chart. Click circles to zoom in, click background to zoom out.
Features
- D3.js v6 zoomable circle packing chart
- 5 sizing metrics: count, impressions, clicks, first_page_count, top_3_count
- Jinja2 HTML templating with 10-colour pastel palette
- Click-to-zoom navigation with 750ms animated transitions
- Column mapping for parent, subtopic and keyword columns
- Standalone HTML download for embedding or sharing
How to use
- 1 Upload a tagged keyword CSV
- 2 Select the metric for circle sizing in the sidebar
- 3 Map the parent topic, subtopic and keyword columns
- 4 Map any required metric columns (position, impressions or clicks)
- 5 Click Generate Chart
- 6 Download the standalone HTML file
Frequently asked questions
- What CSV format does it expect?
- A CSV with at least three columns representing a two-level hierarchy: parent topic, subtopic and keyword. Column names are mappable in the sidebar (defaults: Parent, Child, query). For metrics other than count, you also need a position, impressions or clicks column.
- How does the count metric work?
- Each keyword contributes a value of 1 regardless of any other data. Circle size reflects the number of keywords within each subtopic and parent topic. This is the only metric that requires no numeric columns beyond the hierarchy.
- What do first_page_count and top_3_count measure?
- first_page_count counts keywords with a position column value between 1 and 10 (inclusive). top_3_count counts keywords with position 1 to 3. Keywords outside those ranges contribute zero to their parent circle size.
- Can I embed the chart in a presentation or report?
- Yes. The Download HTML button gives you a standalone HTML file with inline D3.js v6. It loads the D3 library from d3js.org CDN, so an internet connection is needed when viewing. The chart is fully interactive with click-to-zoom.
- How does the zoom interaction work?
- Click any circle to zoom into it (750ms animated transition). Click the background to zoom back out to the root level. Hold Alt while clicking for a slowed 7,500ms transition. Labels appear only for the focused level's children.
Want me to run this for you?
I run this tool as a managed service, or build something custom around your data. You get the insights without touching the code.
Related Tools
Tag keywords using substring matching against up to 7 classification columns.
Two-level eBay related search scraping with ECharts tree visualisations.
Assess keyword difficulty using allintitle, phrase match, and SERP clustering.
Extract keyword fragments from organic result titles with FuzzyWuzzy similarity scoring and Altair frequency charts.
Cluster keywords by SERP overlap using connected components, with clique and core algorithms in the CLI script.
Test if a URL is allowed or blocked by robots.txt rules.
Need something built for your business?
This tool started as bespoke client work. I build custom scripts, data pipelines, and full apps for SEO and product data problems that off-the-shelf tools don't solve.
Tell Me What You Need