pyCirclize: Python의 원형 시각화

Mar 18 2023
pyCirclize를 사용하면 복잡한 원형 데이터 시각화가 쉬워집니다. 원형 데이터 시각화는 데이터 간의 네트워크 및 흐름과 같은 상호 관계를 표현하는 데 자주 사용됩니다. 다음 다이어그램은 데이터의 상호 관계를 명확하고 아름답게 시각화할 수 있는 코드 다이어그램이라고 합니다.

pyCirclize로 복잡한 원형 데이터 시각화가 쉬워졌습니다.

순환 데이터 시각화는 데이터 간의 네트워크 및 흐름과 같은 상호 관계를 표현하는 데 자주 사용됩니다. 다음 다이어그램은 데이터의 상호 관계를 명확하고 아름답게 시각화할 수 있는 코드 다이어그램 이라고 합니다.

코드 다이어그램 예

생물정보학 분야에서 원형 데이터 시각화 도구(Perl 모듈)인 Circos는 게놈 정보와 유전자 네트워크의 시각적 표현에 널리 사용되며, 우리는 종종 다양한 데이터의 수치, 통계 및 상호 관계의 원형 시각화를 보게 됩니다 .

Circos 플롯 예

이 기사에서는 사용자가 Python API에서 Chord Diagram 및 Circos Plot 과 같은 순환 데이터 시각화를 쉽고 유연하게 수행할 수 있도록 개발된 Python 패키지인 pyCirclize를 소개합니다 . 예를 들어 사용자는 다음과 같은 순환 데이터 시각화를 수행할 수 있습니다.

pyCirclize 예제 플롯 갤러리

설치

pyCirclize는 pip 또는 conda 명령 으로 설치할 수 있습니다 .

# Install PyPI package
pip install pycirclize
# Install conda-forge package
conda install -c conda-forge pycirclize

pyCirclize는 circlize (R 패키지) 에서 영감을 받은 섹터 및 트랙 과 함께 원형 레이아웃 디자인을 사용합니다 . 각 섹터에 서로 다른 유형의 데이터를 할당할 수 있으며 데이터 플로팅을 위한 여러 트랙을 섹터 내에 자유롭게 배치할 수 있습니다.

예를 들어 다음 코드는 아래 조건으로 원형 시각화 그림을 그립니다.

  • 각 섹터 크기: A=10, B=15, C=12, D=20, E=15
  • 섹터 간 간격: 5도
  • 각 섹터의 3개 트랙(0 <= 반경 <= 100)
  • from pycirclize import Circos
    
    # Initialize circos sectors
    sectors = {"A": 10, "B": 15, "C": 12, "D": 20, "E": 15}
    circos = Circos(sectors, space=5)
    
    for sector in circos.sectors:
        # Plot sector axis & name text
        sector.axis(fc="none", ls="dashdot", lw=2, ec="black", alpha=0.5)
        sector.text(f"Sector: {sector.name}={sector.size}", size=15)
        # Set Track01 (Radius: 75 - 100)
        track1 = sector.add_track((75, 100))
        track1.axis(fc="tomato", alpha=0.5)
        track1.text(track1.name)
        # Set Track02 (Radius: 45 - 70)
        track2 = sector.add_track((45, 70))
        track2.axis(fc="cyan", alpha=0.5)
        track2.text(track2.name)
        # Set Track03 (Radius: 15 - 40)
        track3 = sector.add_track((15, 40))
        track3.axis(fc="lime", alpha=0.5)
        track3.text(track3.name)
    
    circos.savefig("example01.png")
    
           
                    
    Fig. Circular Layout Design

from pycirclize import Circos
import numpy as np
np.random.seed(0)

sectors = {"A": 10, "B": 15, "C": 12, "D": 20, "E": 15}
circos = Circos(sectors, space=5)
for sector in circos.sectors:
    # Plot sector name
    sector.text(f"Sector: {sector.name}", r=110, size=15)
    # Create x positions & randomized y values for data plotting
    x = np.arange(sector.start, sector.end) + 0.5
    y = np.random.randint(0, 100, len(x))
    # Plot line
    line_track = sector.add_track((75, 100), r_pad_ratio=0.1)
    line_track.axis()
    line_track.xticks_by_interval(1)
    line_track.line(x, y)
    # Plot points
    points_track = sector.add_track((45, 70), r_pad_ratio=0.1)
    points_track.axis()
    points_track.scatter(x, y)
    # Plot bar
    bar_track = sector.add_track((15, 40), r_pad_ratio=0.1)
    bar_track.axis()
    bar_track.bar(x, y)

circos.savefig("example02.png")

      
                
Fig. Plot Data on Track

pyCirclize는 섹터 내 또는 데이터 사이의 링크를 그리는 기능을 구현합니다. 이 기능을 통해 사용자는 데이터 간의 네트워크 및 흐름과 같은 상호 관계를 시각화할 수 있습니다. 또한 사용자는 각 링크의 색상, 질감 및 방향을 자유롭게 설정할 수 있습니다.

from pycirclize import Circos

sectors = {"A": 10, "B": 20, "C": 15}
name2color = {"A": "red", "B": "blue", "C": "green"}
circos = Circos(sectors, space=5)
for sector in circos.sectors:
    track = sector.add_track((95, 100))
    track.axis(fc=name2color[sector.name])
    track.text(sector.name, color="white", size=12)
    track.xticks_by_interval(1)

# Plot links in various styles
circos.link(("A", 0, 1), ("A", 7, 8))
circos.link(("A", 1, 2), ("A", 7, 6), color="skyblue")
circos.link(("A", 9, 10), ("B", 4, 3), direction=1, color="tomato")
circos.link(("B", 5, 7), ("C", 6, 8), direction=1, ec="black", lw=1, hatch="//")
circos.link(("B", 18, 16), ("B", 11, 13), r1=90, r2=90, color="violet", ec="red", lw=2, ls="dashed")
circos.link(("C", 1, 3), ("B", 2, 0), direction=1, color="limegreen")
circos.link(("C", 11.5, 14), ("A", 4, 3), direction=2, color="chocolate", ec="black", lw=1, ls="dotted")

circos.savefig("example03.png")

      
                
Fig. Plot Link

pyCirclize는 행렬 또는 from-to 테이블 데이터에서 코드 다이어그램을 쉽게 그리는 기능을 구현합니다.

코드 다이어그램(매트릭스):

from pycirclize import Circos
import pandas as pd

# Create matrix data (10 x 10)
row_names = list("ABCDEFGHIJ")
col_names = row_names
matrix_data = [
    [51, 115, 60, 17, 120, 126, 115, 179, 127, 114],
    [108, 138, 165, 170, 85, 221, 75, 107, 203, 79],
    [108, 54, 72, 123, 84, 117, 106, 114, 50, 27],
    [62, 134, 28, 185, 199, 179, 74, 94, 116, 108],
    [211, 114, 49, 55, 202, 97, 10, 52, 99, 111],
    [87, 6, 101, 117, 124, 171, 110, 14, 175, 164],
    [167, 99, 109, 143, 98, 42, 95, 163, 134, 78],
    [88, 83, 136, 71, 122, 20, 38, 264, 225, 115],
    [145, 82, 87, 123, 121, 55, 80, 32, 50, 12],
    [122, 109, 84, 94, 133, 75, 71, 115, 60, 210],
]
matrix_df = pd.DataFrame(matrix_data, index=row_names, columns=col_names)

# Initialize from matrix (Can also directly load tsv matrix file)
circos = Circos.initialize_from_matrix(
    matrix_df,
    space=3,
    r_lim=(93, 100),
    cmap="tab10",
    ticks_interval=500,
    label_kws=dict(r=94, size=12, color="white"),
)

circos.savefig("chord_diagram01.png")

      
                
Fig. Chord Diagram by Matrix

from pycirclize import Circos
from pycirclize.parser import Matrix
import pandas as pd

# Create from-to table dataframe & convert to matrix
fromto_table_df = pd.DataFrame(
    [
        ["A", "B", 10],
        ["A", "C", 5],
        ["A", "D", 15],
        ["A", "E", 20],
        ["A", "F", 3],
        ["B", "A", 3],
        ["B", "G", 15],
        ["F", "D", 13],
        ["F", "E", 2],
        ["E", "A", 20],
        ["E", "D", 6],
    ],
    columns=["from", "to", "value"],  # Column name is optional
)
matrix = Matrix.parse_fromto_table(fromto_table_df)

circos = Circos.initialize_from_matrix(
    matrix,
    space=3,
    cmap="viridis",
    ticks_interval=5,
    label_kws=dict(size=12, r=110),
    link_kws=dict(direction=1, ec="black", lw=0.5),
)

circos.savefig("chord_diagram02.png")

      
                
Fig. Chord Diagram by From-To Table

다음은 생물 정보학의 게놈 데이터에 대한 Circos Plot의 몇 가지 간단한 예입니다. 익숙하지 않더라도 pyCirclize 플로팅 기능의 유연성을 이해하는 데 도움이 됩니다.

Circos 플롯(바이러스 게놈):

from pycirclize import Circos
from pycirclize.utils import load_prokaryote_example_file
from pycirclize.parser import Genbank

# Load Genbank file
gbk_file = load_prokaryote_example_file("enterobacteria_phage.gbk")
gbk = Genbank(gbk_file)
# Initialize circos sector by genome size
circos = Circos(sectors={gbk.name: gbk.range_size})
circos.text("Enterobacteria phage\n(NC_000902)", size=15)
sector = circos.sectors[0]
# Outer track
outer_track = sector.add_track((98, 100))
outer_track.axis(fc="lightgrey")
outer_track.xticks_by_interval(5000, label_formatter=lambda v: f"{v / 1000:.0f} Kb")
outer_track.xticks_by_interval(1000, tick_length=1, show_label=False)
# Plot forward & reverse CDS genomic features
cds_track = sector.add_track((90, 95))
cds_track.genomic_features(gbk.extract_features("CDS", target_strand=1), plotstyle="arrow", fc="salmon")
cds_track.genomic_features(gbk.extract_features("CDS", target_strand=-1), plotstyle="arrow", fc="skyblue")

circos.savefig("circos_plot01.png")

      
                
Fig. Circos Plot of Viral Genome

from pycirclize import Circos
from pycirclize.utils import ColorCycler, load_eukaryote_example_dataset

# Load hg38 dataset (https://github.com/moshi4/pycirclize-data/tree/main/eukaryote/hg38)
chr_bed_file, cytoband_file, chr_links = load_eukaryote_example_dataset("hg38")

# Initialize Circos from BED chromosomes
circos = Circos.initialize_from_bed(chr_bed_file, space=3)
circos.text("Homo sapiens\n(hg38)", deg=315, r=150, size=12)

# Add cytoband tracks from cytoband file
circos.add_cytoband_tracks((95, 100), cytoband_file)

# Create chromosome color mapping
ColorCycler.set_cmap("hsv") 
chr_names = [s.name for s in circos.sectors]
colors = ColorCycler.get_color_list(len(chr_names))
chr_name2color = {name: color for name, color in zip(chr_names, colors)}

# Plot chromosome name & xticks
for sector in circos.sectors:
    sector.text(sector.name, r=120, size=10, color=chr_name2color[sector.name])
    sector.get_track("cytoband").xticks_by_interval(
        40000000,
        label_size=8,
        label_orientation="vertical",
        label_formatter=lambda v: f"{v / 1000000:.0f} Mb",
    )

# Plot chromosome link
for link in chr_links:
    region1 = (link.query_chr, link.query_start, link.query_end)
    region2 = (link.ref_chr, link.ref_start, link.ref_end)
    color = chr_name2color[link.query_chr]
    if link.query_chr in ("chr1", "chr8", "chr16") and link.query_chr != link.ref_chr:
        circos.link(region1, region2, color=color)

circos.savefig("circos_plot02.png")

      
                
Fig. Circos Plot of Homo Sapiens(hg38) Genome

이 글에서는 matplotlib 기반으로 구현된 라이브러리인 pyCirclize 의 기본 기능을 소개하였다 . pyCirclize는 여기에 소개되지 않은 순환 데이터 시각화를 위한 다양한 기타 기능도 구현합니다. 어떤 종류의 플로팅 기능을 사용할 수 있는지 자세히 알고 싶다면 다음 Plot API 예제를 살펴보는 것이 좋습니다.

pyCirclize가 사용자가 데이터를 분석하고 시각화하는 데 도움이 되기를 바랍니다 .

  • 깃허브:https://github.com/moshi4/pyCirclize
  • 문서:https://moshi4.github.io/pyCirclize