当前位置:首页>python>Python绘制绝美的分组径向柱状图(附数据和代码)

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

  • 2026-10-21 13:28:01
Python绘制绝美的分组径向柱状图(附数据和代码)

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

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

我用Python绘制了一个分组的径向柱状图,有时也叫圆形柱状图或极坐标柱状图。如果你有几十个变量,且这些变量属于 4-5 个不同的类别(如代码中的“研究对比组别A/B/C”),径向柱状图可以非常直观地通过颜色块将它们区分开。

01

定义参数

这一步确立了径向图的视觉骨架,包括中心孔径、数据生长区和最外层的装饰环半径。

1
2
3
4
5
6
7

INNER_HOLE = 22      # 中心留白圆孔的半径BAR_START = 28       # 柱状图开始生长的起点BAR_MAX_R = 100      # 100% 数据对应的最大半径AXIS_LINE_END = 105  # 放射状背景分割线的终点LABEL_RADIUS = 112   # 项目名称(Label)所在的半径OUTER_RING_START = 135 # 最外圈分类装饰环的内径OUTER_RING_END = 160   # 最外圈分类装饰环的外径

02

分组与映射配置

这一步定义了不同数据组的量程范围 (Range) 和刻度点 (Ticks)。这决定了原始数据(如 0-100)如何被压缩或拉伸到图表的物理空间中。

1
2
3
4
5
6
7

# 核心业务逻辑配置字典group_configs = {    "研究对比组别A": {"range": (0, 100), "ticks": [75, 100]},    "研究对比组别B": {"range": (0, 100), "ticks": [10, 25]},    "研究对比组别C": {"range": (0, 100), "ticks": [85, 100]},    "研究对比组别D": {"range": (0, 100), "ticks": [50, 100]}}

03

数据预处理

这一步主要进行数据清洗。它能兼容“85%”这种字符串格式或 0.85 这种小数格式,将其统一转化为 0-100 的浮点数以便绘图。

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

# 核心业务逻辑配置字典def format_data_value(val):    # 处理百分比字符串    if isinstance(val, str) and '%' in val:        return float(val.replace('%', ''))    # 处理小数映射    if isinstance(val, (int, float)) and val <= 1.0:        return val * 100    return float(val)# 注意:此行代码依赖于外部定义的 DataFrame 对象 'df'df['value'] = df['value'].apply(format_data_value)}

04

极坐标空间位置计算

计算每个扇区(Sector)的起始弧度。这是实现圆形排版的关键数学步骤,确保每个组都能平分 360 度圆周。

1
2
3
4
5
6
7
8
9

# 计算组间距与弧度分配num_groups = len(df['group'].unique())quad_arc = 2 * np.pi / num_groups  # 每个组分配的总弧度padding = 0.05  # 组与组之间的留白间隙# 生成当前组内每个柱子的具体角度位置# 提示:idx 需在循环中定义start_angle = idx * quad_arcthetas = np.linspace(start_angle + padding, (idx + 1) * quad_arc - padding, len(g_data))

05

核心绘图

主要使用的 Matplotlib 极坐标绘图。代码中设置了特殊的旋转逻辑确保了文字在圆周的任何位置都能“底朝圆心”或“水平分布”,避免文字倒置。

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

# 绘制数据柱状体ax.bar(thetas, heights, width=bar_width, bottom=BAR_START, color=group_color)# 文字旋转逻辑:根据角度自动调整对齐方式(ha)for th, val in zip(thetas, values):    deg = np.degrees(th)    rot = 90 - deg    # 如果角度在 90 到 270 度之间,文字需要翻转 180 度以保持正向    if 90 < deg % 360 < 270:        rot += 180        align = "right"    else:        align = "left"    ax.text(th, LABEL_RADIUS, "Sample", rotation=rot, ha=align, va="center")

06

环境初始化

最后一步,如果有中文的情况下,可以设置中文字体渲染(防止出现方块乱码),初始化极坐标画布,并将最终结果保存为高分辨率图片。

1
2
3
4
5
6
7
8
9
10
11

# 设置字体环境(黑体)plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 初始化极坐标画布fig, ax = plt.subplots(figsize=(14, 14), subplot_kw={"projection": "polar"})ax.set_theta_zero_location("N")  # 0度置于正北ax.set_axis_off()               # 隐藏默认的雷达图背景线# 保存并输出plt.savefig("radial_chart_v2.png", dpi=300, bbox_inches="tight")

另外,代码可以根据数据的情况,自动绘制不同数量的组别情况,比如下面这幅图又是3类别的。

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

THE

END

数据和代码怎么获取?

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

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

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

猜您喜欢
往期精选▼

1. Python绘制Nature同款绝美雷达图(附数据和代码)

2. Python绘制Nature期刊同款环状热图(附数据和代码)

3. Python绘制网络相关性热图

4. Python绘制超美的小提琴图

5. R语言绘制多变量网络相关性热图(附完整数据和代码)

#数据可视化#科研绘图 #环状热图 #Python #Matplotlib #Pycirclize

最新文章

随机文章