
©[悠悠智汇笔记] 版权所有
🙏请尊重劳动成果,守护每一份劳动心血;⚖️未经授权,不得以为任何方式转载、摘编或抄袭。🔄转载合作请后台联系授权,侵权必究。
本期分享基于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可直接获取完整的示例数据和代码
如有帮助,您的点赞、评论、转发是我持续创作的动力~

