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.
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.