这一步确立了径向图的视觉骨架,包括中心孔径、数据生长区和最外层的装饰环半径。
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 # 最外圈分类装饰环的外径
这一步定义了不同数据组的量程范围 (Range) 和刻度点 (Ticks)。这决定了原始数据(如 0-100)如何被压缩或拉伸到图表的物理空间中。
# 核心业务逻辑配置字典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]}}
这一步主要进行数据清洗。它能兼容“85%”这种字符串格式或 0.85 这种小数格式,将其统一转化为 0-100 的浮点数以便绘图。
# 核心业务逻辑配置字典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)}
计算每个扇区(Sector)的起始弧度。这是实现圆形排版的关键数学步骤,确保每个组都能平分 360 度圆周。
# 计算组间距与弧度分配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))
主要使用的 Matplotlib 极坐标绘图。代码中设置了特殊的旋转逻辑确保了文字在圆周的任何位置都能“底朝圆心”或“水平分布”,避免文字倒置。
# 绘制数据柱状体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")
最后一步,如果有中文的情况下,可以设置中文字体渲染(防止出现方块乱码),初始化极坐标画布,并将最终结果保存为高分辨率图片。
# 设置字体环境(黑体)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类别的。
🌿 今日的分享就到这里啦~如果这些内容有为你带来帮助,欢迎轻点右下角的【👍赞】和【👀在看】,也欢迎分享给更多需要的人,感恩~
点击关注后,后台回复关键词:
2026_map_002可直接获取完整的示例数据和代码
如有帮助,您的点赞、评论、转发是我持续创作的动力~