scientific-skills/Data Analysis/circos-plot-generator/SKILL.md
Generate Circos configuration files for circular genomics data visualization. Supports genomic variations (SNPs, CNVs, structural variants), cell-cell communication networks, and custom track configurations for publication-ready circular plots.
npx skillsauth add aipoch/medical-research-skills circos-plot-generatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
4 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate configuration files for Circos circular visualization plots, enabling genomics data visualization including genomic variations, chromosome ideograms, cell-cell communication networks, and custom track annotations. Simplifies the complex Circos configuration process for researchers without Perl expertise.
Key Capabilities:
scripts/main.py.references/ for task-specific guidance.See ## Prerequisites above for related details.
Python: 3.10+. Repository baseline for current packaged skills.yaml: unspecified. Declared in requirements.txt.config = { "type": "variation", "title": "Genomic Landscape", "data": "variants.csv", "output": "./output" }
result = generate_and_render(config, render=True)
**Output Files:**
| File | Description | Format |
|------|-------------|--------|
| `circos.conf` | Main configuration | Text |
| `data/karyotype.txt` | Chromosome definitions | Text |
| `data/*.txt` | Track data files | TSV |
| `circos.png` | Raster image (if rendered) | PNG |
| `circos.svg` | Vector image (if rendered) | SVG |
**Rendering Requirements:**
| Component | Installation | Command |
|-----------|--------------|---------|
| **Circos** | `conda install -c bioconda circos` | `circos -conf circos.conf` |
| **Perl** | Usually pre-installed | Required by Circos |
| **GD library** | System package | Image generation |
**Best Practices:**
- ✅ **Generate SVG for publication** - scalable, editable
- ✅ **Use PNG for drafts** - faster rendering
- ✅ **Check file sizes** - high-res images can be large
- ✅ **Archive configurations** - for reproducibility
**Common Issues and Solutions:**
**Issue: Circos installation fails**
- Symptom: "circos: command not found"
- Solution: Use conda installation; check Perl and GD dependencies
**Issue: Rendering produces warnings**
- Symptom: Many "skip" or "warning" messages
- Solution: Usually harmless; check output image quality; adjust data ranges
---
## Implementation Details
See `## Workflow` above for related details.
- Execution model: validate the request, choose the packaged workflow, and produce a bounded deliverable.
- Input controls: confirm the source files, scope limits, output format, and acceptance criteria before running any script.
- Primary implementation surface: `scripts/main.py`.
- Reference guidance: `references/` contains supporting rules, prompts, or checklists.
- Parameters to clarify first: input path, output path, scope filters, thresholds, and any domain-specific constraints.
- Output discipline: keep results reproducible, identify assumptions explicitly, and avoid undocumented side effects.
## Quick Check
Use this command to verify that the packaged script entry point can be parsed before deeper execution.
```bash
python -m py_compile scripts/main.py
Use these concrete commands for validation. They are intentionally self-contained and avoid placeholder paths.
python -m py_compile scripts/main.py
python scripts/main.py --help
Upstream Skills:
cnv-caller-plotter: Generate CNV calls for visualization in Circoscrispr-screen-analyzer: Prepare hit data for genomic context visualizationbio-ontology-mapper: Map features to genomic coordinates for track displayDownstream Skills:
dpi-upscaler-checker: Verify output resolution meets publication requirementsjournal-cover-prompter: Generate AI prompts for journal covers using Circos plotsfigure-legend-gen: Create figure legends for complex Circos visualizationsComplete Workflow:
WGS Data → cnv-caller-plotter → circos-plot-generator → dpi-upscaler-checker → Publication Figure
Create tracks for visualizing genomic variations including SNPs, CNVs, and structural variants.
from scripts.main import CircosConfig
# Configuration for genomic variation plot
config = {
"type": "variation",
"title": "Sample Genomic Variations",
"data": "variations.csv",
"width": 1200,
"height": 1200,
"color_scheme": "nature",
"output": "./circos_output"
}
# Generate configuration
generator = CircosConfig(config)
config_path = generator.generate()
print(f"Configuration generated: {config_path}")
print(f"Tracks included:")
print(" - Histogram track for SNPs/CNVs")
print(" - Link track for structural variants")
print(" - Chromosome ideogram")
Input Data Format:
| Column | Description | Example |
|--------|-------------|---------|
| chrom | Chromosome name | chr1, chrX |
| start | Start position | 1000000 |
| end | End position | 2000000 |
| type | Variation type | SNP, CNV, TRANSLOCATION |
| value | Score or magnitude | 0.5, -0.8 |
| target_chrom | For SVs: target chromosome | chr5 |
| target_start | For SVs: target start | 5000000 |
Variation Types Supported:
| Type | Visualization | Color Coding | |------|--------------|--------------| | SNP | Histogram points | Blue/Red (gain/loss) | | CNV | Histogram bars | Green/Orange (amplification/deletion) | | TRANSLOCATION | Links between chromosomes | Purple ribbons | | INVERSION | Intra-chromosomal links | Yellow | | DELETION | Histogram bars | Red | | DUPLICATION | Histogram bars | Blue |
Best Practices:
Common Issues and Solutions:
Issue: Too many data points causing clutter
Issue: Chromosome naming mismatch
Create circular plots showing interactions between cell types in tissues or tumors.
from scripts.main import CircosConfig
# Configuration for cell-cell communication
config = {
"type": "cell-comm",
"title": "Tumor Microenvironment Interactions",
"data": "cell_communication.csv",
"width": 1000,
"height": 1000,
"color_scheme": "cell",
"output": "./cell_comm_plots"
}
generator = CircosConfig(config)
config_path = generator.generate()
print("Cell-cell communication plot configured:")
print(" - Cell types arranged in circle")
print(" - Connection ribbons showing interactions")
print(" - Labels for each cell type")
Input Format for Cell Communication:
| Column | Description | Example |
|--------|-------------|---------|
| source | Source cell type | T_Cell |
| target | Target cell type | Macrophage |
| weight | Interaction strength (0-1) | 0.8 |
| type | Interaction type | Ligand-Receptor, Secreted |
Visualization Features:
| Feature | Description | Use Case | |---------|-------------|----------| | Ribbon links | Connection width ∝ interaction strength | Show communication intensity | | Cell segments | Each cell type as chromosome segment | Compare cell type abundance | | Labels | Cell type names outside circle | Identify cells easily | | Colors | Distinct colors per cell type | Distinguish cell types |
Best Practices:
Common Issues and Solutions:
Issue: Too many cell types causing confusion
Issue: Bidirectional interactions not clear
Generate chromosome ideograms showing banding patterns and genomic coordinates.
from scripts.main import CircosConfig, CHROMOSOME_SIZES
# View available chromosomes
print("Available chromosomes (GRCh38/hg38):")
for chrom, size in CHROMOSOME_SIZES.items():
size_mb = size / 1_000_000
print(f" {chrom}: {size_mb:.1f} Mb")
# Custom chromosome selection
config = {
"type": "variation",
"title": "Chr1-5 Variations",
"chromosomes": ["chr1", "chr2", "chr3", "chr4", "chr5"], # Subset
"width": 1000,
"height": 1000,
"output": "./chr1-5_plots"
}
# Note: Chromosome selection handled in data preprocessing
Chromosome Specifications:
| Chromosome | Size (bp) | Display Color | |------------|-----------|---------------| | chr1 | 248,956,422 | Red | | chr2 | 242,193,529 | Orange | | chr3 | 198,295,559 | Yellow | | ... | ... | ... | | chrX | 156,040,895 | Purple | | chrY | 57,227,415 | Grey |
Ideogram Features:
| Feature | Description | Configuration | |---------|-------------|---------------| | Spacing | Gap between chromosomes | 0.005r (0.5% of radius) | | Thickness | Chromosome bar width | 25 pixels | | Labels | Chromosome names | Outside circle | | Bands | Cytogenetic bands | Show/hide option | | Ticks | Scale markers | 5u and 25u spacing |
Best Practices:
Common Issues and Solutions:
Issue: Small chromosomes (chr21, chrY) hard to see
Issue: Mitochondrial DNA not included
Overlay multiple data tracks in concentric circles for complex visualizations.
from scripts.main import CircosConfig
# Multi-track configuration
config = {
"type": "custom",
"title": "Multi-Track Genome View",
"width": 1200,
"height": 1200,
"tracks": [
{
"type": "histogram",
"file": "data/cnv_track.txt",
"color": "color0" # Red
},
{
"type": "histogram",
"file": "data/snp_track.txt",
"color": "color1" # Blue
},
{
"type": "link",
"file": "data/sv_links.txt",
"color": "color2" # Green
}
],
"output": "./multi_track"
}
generator = CircosConfig(config)
config_path = generator.generate()
Track Positioning:
| Track | Radius Range | Typical Use | |-------|--------------|-------------| | Outer 1 | 0.95r - 0.80r | Primary data (CNVs) | | Outer 2 | 0.80r - 0.65r | Secondary data (SNPs) | | Middle | 0.65r - 0.50r | Links/connections | | Inner | 0.50r - 0.35r | Annotations/labels |
Track Types:
| Type | Data Format | Best For | |------|-------------|----------| | Histogram | chr start end value | Continuous values (CNVs, expression) | | Scatter | chr start end value x y | Point data with categories | | Heatmap | chr start end value0 value1... | Multi-sample comparisons | | Link | chr1 start1 end1 chr2 start2 end2 | Connections (SVs, interactions) | | Text | chr start end label | Gene names, annotations |
Best Practices:
Common Issues and Solutions:
Issue: Tracks overlapping
Issue: Scale differences between tracks
Select from predefined color schemes or define custom colors for publication consistency.
from scripts.main import CircosConfig, COLOR_SCHEMES
# View available color schemes
print("Available color schemes:")
for name, colors in COLOR_SCHEMES.items():
print(f"\n{name.upper()}:")
print(f" Colors: {', '.join(colors[:4])}...")
# Example outputs for each scheme
scheme_examples = {
"default": ["red", "blue", "green", "orange"],
"nature": ["#E64B35", "#4DBBD5", "#00A087", "#3C5488"],
"lancet": ["#00468B", "#ED0000", "#42B540", "#0099B4"],
"cell": ["#1B9E77", "#D95F02", "#7570B3", "#E7298A"]
}
# Usage
config = {
"type": "variation",
"color_scheme": "nature", # Publication-quality colors
# ... other config
}
Color Schemes:
| Scheme | Style | Best For | |--------|-------|----------| | default | Basic colors | Quick visualization, drafts | | nature | Nature journal colors | Nature publications | | lancet | Lancet journal colors | Medical/clinical papers | | cell | Cell journal colors | Cell biology papers |
Custom Colors:
# Define custom scheme
my_colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FFEAA7"]
COLOR_SCHEMES["custom"] = my_colors
config["color_scheme"] = "custom"
Best Practices:
Common Issues and Solutions:
Issue: Colors not distinct enough
Issue: Colors don't match brand/institution
Generate complete Circos configuration and optionally render the plot.
import subprocess
from pathlib import Path
from scripts.main import CircosConfig
def generate_and_render(config: dict, render: bool = False) -> dict:
"""
Generate Circos config and optionally render plot.
Returns:
dict with paths and status
"""
# Generate configuration
generator = CircosConfig(config)
config_path = generator.generate()
result = {
"config_path": config_path,
"data_dir": str(generator.data_dir),
"rendered": False,
"output_image": None
}
# Attempt to render
if render:
output_dir = Path(config["output"])
try:
proc_result = subprocess.run(
["circos", "-conf", config_path],
capture_output=True,
text=True,
cwd=output_dir
)
if proc_result.returncode == 0:
result["rendered"] = True
result["output_image"] = str(output_dir / "circos.png")
print("✅ Plot rendered successfully!")
else:
print(f"❌ Rendering failed: {proc_result.stderr}")
except FileNotFoundError:
print("⚠️ Circos not installed. Configuration ready for manual rendering.")
print(f" Run: cd {output_dir} && circos -conf circos.conf")
return result
## Complete Workflow Example
**From variant calls to publication figure:**
```text
# Step 1: Create sample data for testing
python scripts/main.py --create-sample variation --output ./data
# Step 2: Generate configuration
python scripts/main.py \
--data ./data/sample_variations.csv \
--type variation \
--title "Tumor Genomic Landscape" \
--color-scheme nature \
--width 1200 \
--height 1200 \
--output ./plots
# Step 3: Render plot (requires Circos)
python scripts/main.py \
--data ./data/sample_variations.csv \
--type variation \
--output ./plots \
--render
Python API Usage:
from scripts.main import CircosConfig
import pandas as pd
def create_genomic_landscape_plot(
variation_data: pd.DataFrame,
output_dir: str = "./circos_output",
title: str = "Genomic Variations"
) -> str:
"""
Create comprehensive genomic landscape Circos plot.
Args:
variation_data: DataFrame with columns [chrom, start, end, type, value]
output_dir: Output directory for files
title: Plot title
Returns:
Path to generated configuration file
"""
# Save data to CSV
data_path = f"{output_dir}/input_data.csv"
variation_data.to_csv(data_path, index=False)
# Generate configuration
config = {
"type": "variation",
"title": title,
"data": data_path,
"width": 1200,
"height": 1200,
"color_scheme": "nature",
"output": output_dir
}
generator = CircosConfig(config)
config_path = generator.generate()
# Print summary
print(f"✅ Circos configuration generated")
print(f" Config: {config_path}")
print(f" Data directory: {generator.data_dir}")
print(f"\nTo render:")
print(f" circos -conf {config_path}")
return config_path
# Example with sample data
sample_data = pd.DataFrame({
'chrom': ['chr1', 'chr1', 'chr2', 'chr5', 'chrX'],
'start': [1000000, 5000000, 1000000, 5000000, 5000000],
'end': [2000000, 6000000, 1500000, 7000000, 8000000],
'type': ['SNP', 'CNV', 'SNP', 'TRANSLOCATION', 'DELETION'],
'value': [0.5, -0.8, 0.3, None, -1.0],
'target_chrom': [None, None, None, 'chr2', None],
'target_start': [None, None, None, 8000000, None],
'target_end': [None, None, None, 10000000, None]
})
config_file = create_genomic_landscape_plot(
sample_data,
output_dir="./my_plot",
title="Sample Genomic Landscape"
)
Expected Output Files:
circos_output/
├── circos.conf # Main configuration
├── data/
│ ├── karyotype.txt # Chromosome definitions
│ ├── variations.txt # Histogram data
│ └── links.txt # Structural variant links
└── (after rendering)
├── circos.png # Raster output
└── circos.svg # Vector output
Scenario: Visualize genomic alterations in a tumor sample for publication.
{
"plot_type": "variation",
"title": "Tumor Genomic Landscape",
"data_layers": [
"CNV (outer track)",
"SNV density (middle track)",
"Structural variants (links)"
],
"color_scheme": "nature",
"resolution": "1200x1200",
"publication": "Nature Medicine"
}
Workflow:
Output Example:
Cancer Genomic Landscape Plot:
- CNV track: 47 copy number alterations
- SNV track: 2,847 mutations (density)
- SV links: 12 translocations, 8 inversions
Key findings visible:
- Chr8 MYC amplification
- Chr17 TP53 deletion
- Chr7-14 translocation
Publication ready: 1200x1200 PNG + SVG
Scenario: Visualize cell-cell communication in tumor microenvironment.
{
"plot_type": "cell-comm",
"title": "TME Communication Network",
"cell_types": [
"T_Cell", "B_Cell", "Macrophage",
"NK_Cell", "Tumor_Cell", "Fibroblast"
],
"data_source": "CellChat analysis",
"filter": "weight > 0.3",
"color_scheme": "cell"
}
Workflow:
Output Example:
TME Communication Network:
Cell types: 6
Interactions: 24 (filtered from 156)
Major communication axes:
- T_Cell → Macrophage (strongest)
- Dendritic → T_Cell
- Tumor → Macrophage
Insights:
- Immunosuppressive signaling dominant
- Limited NK cell activation
Scenario: Compare synteny between two species or strains.
{
"plot_type": "custom",
"title": "Human-Mouse Synteny",
"tracks": [
{
"type": "link",
"data": "synteny_blocks.txt",
"description": "Conserved regions"
}
],
"genomes": ["hg38", "mm10"],
"color_by": "chromosome"
}
Workflow:
Output Example:
Synteny Comparison:
Human chromosomes: 22 + X + Y
Mouse chromosomes: 19 + X + Y
Syntenic blocks: 342
Key observations:
- Chr12 conservation strong
- Multiple breakpoints on Chr1
- X chromosome largely conserved
Scenario: Track clonal evolution through treatment timepoints.
{
"plot_type": "custom",
"title": "Clonal Evolution Over Time",
"timepoints": ["Baseline", "Post-Treatment", "Relapse"],
"tracks": [
"Baseline CNV",
"Post-Treatment CNV",
"Relapse CNV",
"Clonal links"
],
"color_scheme": "lancet"
}
Workflow:
Output Example:
Clonal Evolution Plot:
Timepoints: 3
Clones tracked: 5
Evolutionary trajectory:
- Baseline: 3 subclones
- Post-treatment: 1 dominant clone
- Relapse: New clone emergence
Therapeutic implications:
- Pre-existing resistance clone expanded
- New mutation acquired at relapse
Data Preparation:
Configuration:
Rendering:
Publication:
Data Issues:
❌ Inconsistent chromosome names → Data missing from plot
❌ Coordinates out of bounds → Rendering errors
❌ Too many data points → Cluttered, slow rendering
❌ Missing values not handled → Gaps or errors
Configuration Issues:
❌ Tracks overlap → Data unreadable
❌ Colors too similar → Can't distinguish tracks
❌ Font too small → Labels unreadable
❌ Image too small → Poor resolution
Interpretation Issues:
❌ No scale reference → Values unclear
❌ Missing legend → Data types unexplained
❌ No chromosome labels → Location unclear
❌ Too much information → Figure overwhelming
Problem: Configuration generates but Circos won't render
conda install -c bioconda circosProblem: Plot is blank or missing data
Problem: Colors not as expected
Problem: Links/connections not showing
Problem: Text labels overlapping
Problem: Rendering is very slow
Available in references/ directory:
External Resources:
Located in scripts/ directory:
main.py - Circos configuration generator with support for variations and cell communicationDefault: red, blue, green, orange, purple, cyan
Nature: #E64B35, #4DBBD5, #00A087, #3C5488, #F39B7F, #8491B4
Lancet: #00468B, #ED0000, #42B540, #0099B4, #925E9F, #FDAF91
Cell: #1B9E77, #D95F02, #7570B3, #E7298A, #66A61E, #E6AB02
| Parameter | Type | Default | Required | Description |
|-----------|------|---------|----------|-------------|
| --data | string | - | Yes | Input data file (TSV/CSV format) |
| --output, -o | string | circos.svg | No | Output SVG file path |
| --type | string | variation | No | Plot type (variation, cell-communication) |
| --colors | string | default | No | Color scheme (default, nature, lancet, cell) |
| --radius | float | 400 | No | Plot radius in pixels |
| --help, -h | flag | - | No | Show help message |
# Generate genomic variation Circos plot
python scripts/main.py --data variations.tsv --output genome.svg
# Cell communication plot with custom colors
python scripts/main.py --data cell_comm.tsv --type cell-communication --colors nature
# Custom radius
python scripts/main.py --data data.tsv --radius 500 --output large.svg
Variation data (TSV format):
chromosome position value
chr1 1000000 0.5
chr1 2000000 -0.3
chr2 500000 0.8
Cell communication data (TSV format):
cell_type1 cell_type2 interaction_strength
T_cell B_cell 0.75
Macrophage T_cell 0.60
| Risk Indicator | Assessment | Level | |----------------|------------|-------| | Code Execution | Python script executed locally | Low | | Network Access | No external API calls | Low | | File System Access | Read input data, write output SVG | Low | | Data Exposure | Processes genomic data | Low | | Resource Usage | Generates SVG files (can be large) | Low |
# Python 3.7+
# No external packages required (uses standard library)
# Output: SVG format (viewable in web browsers)
Last Updated: 2026-02-09
Skill ID: 186
Version: 2.0 (K-Dense Standard)
Every final response should make these items explicit when they are relevant:
scripts/main.py fails, report the failure point, summarize what still can be completed safely, and provide a manual fallback.This skill accepts requests that match the documented purpose of circos-plot-generator and include enough context to complete the workflow safely.
Do not continue the workflow when the request is out of scope, missing a critical input, or would require unsupported assumptions. Instead respond:
circos-plot-generatoronly handles its documented workflow. Please provide the missing required inputs or switch to a more suitable skill.
Use the following fixed structure for non-trivial requests:
If the request is simple, you may compress the structure, but still keep assumptions and limits explicit when they affect correctness.
tools
Generates complete conventional oncology bulk-transcriptome biomarker and hub-gene research designs from a user-provided cancer type and study direction. Always use this skill whenever a user wants to design, plan, or build a tumor bioinformatics study centered on differential expression, prognostic filtering or risk modeling, PPI-based hub-gene prioritization, diagnostic/prognostic evaluation, clinical association, immune infiltration context, methylation context, and optional tissue or cell validation. Covers five study patterns (signature-first prognostic workflow, hub-gene-first biomarker workflow, hybrid signature-to-hub workflow, immune-context biomarker workflow, translational validation workflow) and always outputs four workload configs (Lite / Standard / Advanced / Publication+) with recommended primary plan, step-by-step workflow, figure plan, validation strategy, minimal executable version, publication upgrade path...
development
Generates complete conventional non-oncology bioinformatics research designs from a user-provided disease context, process-related gene family or biological theme, and validation direction. Use when a study centers on multi-dataset bulk transcriptome integration, DEG analysis, process-gene intersection, enrichment analysis, GSEA, PPI hub-gene prioritization, TF/miRNA regulatory networks, ROC-based biomarker evaluation, and immune infiltration analysis. Covers five study patterns (process-DEG discovery, enrichment/GSEA interpretation, hub-gene prioritization, regulatory-network and immune interpretation, multi-layer public validation) and always outputs Lite / Standard / Advanced / Publication+ with a recommended primary plan, stepwise workflow, figure plan, validation hierarchy, minimal executable version, publication upgrade path, and strictly verified literature retrieval.
tools
Plans confounder control, variable adjustment logic, and bias mitigation strategies at the protocol stage for clinical, epidemiologic, translational, observational, and biomarker studies. Always use this skill when a user needs to identify major confounders, decide which variables should or should not be adjusted for, compare matching/stratification/weighting approaches, anticipate selection or measurement bias, or pressure-test a study design before execution. Focus on bias sensing, causal structure awareness, variable-role classification, and critical design review rather than generic statistical advice.
testing
Generates complete comparative network-toxicology research designs from a user-provided exposure pair, shared toxic phenotype, and validation direction. Use when a study centers on two related exposures under one outcome and needs target collection, shared-vs-specific target decomposition, enrichment, PPI hub prioritization, docking, optional transcriptomic cross-checks, and conservative mechanistic synthesis. Covers five study patterns and always outputs Lite / Standard / Advanced / Publication+ with a recommended primary plan, stepwise workflow, figure plan, validation hierarchy, minimal executable version, publication upgrade path, and strictly verified literature retrieval.