当前位置:首页>python>Python绘制切尔斯图(附数据和代码)

Python绘制切尔斯图(附数据和代码)

  • 2026-09-10 04:43:26
Python绘制切尔斯图(附数据和代码)

©[悠悠智汇笔记] 版权所有

🙏请尊重劳动成果,守护每一份劳动心血;⚖️未经授权,不得以为任何方式转载、摘编或抄袭。🔄转载合作请后台联系授权,侵权必究。

本期分享基于Circos绘制切尔斯图,这个图主要用于综合展示不同分组(sector)中多维数据的分布特征及其相互关联关系。

01

基础设置

导入用于加载所需库,并读取绘图所需的主数据和连接线数据

1
2
3
4
5
6
7
8
9
10

from pycirclize import Circosimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltplt.rcParams["font.family"] = "Times New Roman"plt.rcParams["font.size"] = 12df = pd.read_csv("circos_data.csv")link_df = pd.read_csv("circos_links.csv")

02

创建Circos图对象

根据分组数据生成 Circos 图的扇区结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

required_data_cols = {"sector", "lollipop", "line", "bar"}required_link_cols = {"sec1", "start1", "end1", "sec2", "start2", "end2"}if not required_data_cols.issubset(df.columns):    raise ValueError(f"circos_data.csv 缺少列: {required_data_cols - set(df.columns)}")if not required_link_cols.issubset(link_df.columns):    raise ValueError(f"circos_links.csv 缺少列: {required_link_cols - set(link_df.columns)}")sectors = df.groupby("sector").size().to_dict()circos = Circos(sectors, space=5)color_map = {    "A": "#ECA8A9",    "B": "#74AED4",    "C": "#D3E2B7",    "D": "#CFAFD4",    "E": "#F7C97E"}lollipop_color = "#F7C197"

03

绘制各扇区

循环遍历每个 sector,并依次绘制棒棒糖图、折线图和柱状图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

for sector in circos.sectors:    name = sector.name    sub = df[df["sector"] == name].reset_index(drop=True)    sector.text(f"Group: {name}", r=105, size=15)    # Track 1: 棒棒糖图    x1 = np.arange(sector.start, sector.end) + 0.5    y1 = sub["lollipop"].to_numpy(dtype=float)    y1_norm = y1 / y1.max() * 0.9 if y1.max() != 0 else np.zeros_like(y1)    track1 = sector.add_track((80, 100), r_pad_ratio=0.1)    track1.axis()    track1.xticks([])    for xi, yi in zip(x1, y1_norm):        track1.bar([xi], [yi], color=lollipop_color, width=0.1, alpha=0.8, vmax=1)        track1.scatter([xi], [yi], color=lollipop_color, s=50, zorder=10, vmax=1)    # Track 2: 折线图    x2 = np.arange(sector.start, sector.end) + 0.3    y2 = sub["line"].to_numpy(dtype=float)    track2 = sector.add_track((55, 75), r_pad_ratio=0.1)    track2.axis()    track2.line(x2, y2, linewidth=1.5, color=color_map.get(name, "#999999"))    # Track 3: 柱状图    x3 = np.arange(sector.start, sector.end) + 0.2    y3 = sub["bar"].to_numpy(dtype=float)    track3 = sector.add_track((30, 50), r_pad_ratio=0.1)    track3.axis()    track3.bar(        x3,        y3,        width=0.7,        facecolor=color_map.get(name, "#999999"),        alpha=0.6,        linewidth=0.8,        edgecolor=color_map.get(name, "#999999")    )

04

绘制连接线

根据连接数据添加 sector 之间的连线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

for i, row in link_df.iterrows():    link1 = (row["sec1"], int(row["start1"]), int(row["end1"]))    link2 = (row["sec2"], int(row["start2"]), int(row["end2"]))    if i == 0:        circos.link(link1, link2, color="#b0b7d9", ec="green", lw=2.0, ls="dashed")    elif i == 1:        circos.link(link1, link2, color="#80dcfb")    elif i == 2:        circos.link(link1, link2, color="#f8c698", direction=1, hatch="//")    elif i == 3:        circos.link(link1, link2, color="purple", ec="black", lw=0.5, direction=2)    elif i == 4:        circos.link(link1, link2, color="violet")    else:        circos.link(link1, link2, color="grey")

🌿 今日的分享就到这里啦~如果这些内容有为你带来帮助,欢迎轻点右下角的【👍赞】和【👀在看】,也欢迎分享给更多需要的人,感恩~

THE

END

数据和代码怎么获取?

点击关注后,后台回复关键词:

2026_map_014可直接获取完整的示例数据和代码

如有帮助,您的点赞、评论、转发是我持续创作的动力~

猜您喜欢
往期精选▼

1. Python绘制嵌套极坐标图之径向柱状图+箱线图(附数据和代码)

2. Python绘制变种饼图之花瓣玫瑰图(附数据和代码)

3. Python绘制绝美的分组径向柱状图(附数据和代码)

#数据可视化#科研绘图 #切尔斯图 #Python #Matplotlib #Pycirclize

最新文章

随机文章