雷达图spine对齐与标签切线显示问题求助(附Python代码)
多尺度雷达图的两个优化问题解决
问题说明
基于他人提供的代码实现了多尺度雷达图展示,目前需解决两个问题:
- 使雷达图以
test1_sample对应的spine为基准,在页面轴上居中对齐 - 使标签沿雷达图切线方向显示,避免遮挡并保持清晰
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt def _scale_data(data, ranges): x1, x2 = ranges[0] d = data[0] sdata = [d] for d, (y1, y2) in zip(data[1:], ranges[1:]): sdata.append((d-y1) / (y2-y1) * (x2 - x1) + x1) return sdata class ComplexRadar(): def __init__(self, fig, variables, ranges, n_ordinate_levels=5): angles = np.arange(0, 360, 360./len(variables)) axes = [fig.add_axes([0.1,0.1,0.9,0.9], polar=True, label=f"axes{i}") for i in range(len(variables))] # 调整雷达图居中:将test1_sample对应轴移至页面垂直中线 axes[0].set_theta_zero_location('N') # 0度角指向顶部 axes[0].set_theta_direction(-1) # 保持变量顺时针排列 l, text = axes[0].set_thetagrids(angles, labels=variables) # 让标签沿切线方向显示 for txt, angle in zip(text, angles): txt.set_rotation(angle) # 标签旋转角度与极角一致,贴合切线方向 txt.set_ha('center') txt.set_va('center') for ax in axes[1:]: ax.patch.set_visible(False) ax.grid("off") ax.xaxis.set_visible(False) ax.set_theta_zero_location('N') ax.set_theta_direction(-1) for i, ax in enumerate(axes): grid = np.linspace(*ranges[i], num=n_ordinate_levels) gridlabel = [f"{round(x,2)}" for x in grid] gridlabel[0] = "" # 清空原点标签 ax.set_rgrids(grid, labels=gridlabel, angle=angles[i]) ax.spines["polar"].set_visible(False) ax.set_ylim(*ranges[i]) self.angle = np.deg2rad(np.r_[angles, angles[0]]) self.ranges = ranges self.ax = axes[0] def plot(self, data, *args, **kw): sdata = _scale_data(data, self.ranges) self.ax.plot(self.angle, np.r_[sdata, sdata[0]], *args, **kw) def fill(self, data, *args, **kw): sdata = _scale_data(data, self.ranges) self.ax.fill(self.angle, np.r_[sdata, sdata[0]], *args, **kw) variables = ("test1_sample", "test2_sample", "test3_sample","test4_sample", "test5_sample") data = (80, 1000, 288,1, 10045) ranges = [(1, 100), (100, 1000), (50, 400),(0.1, 1), (1000, 15000)] fig1 = plt.figure(figsize=(7, 7)) plt.style.use('classic') radar = ComplexRadar(fig1, variables, ranges) radar.plot(data) radar.fill(data, alpha=0.2) plt.show()
关键修改说明
雷达图居中对齐:
- 通过
set_theta_zero_location('N')将test1_sample对应的0度极角移至页面顶部,使其成为垂直中线,实现整体居中 - 用
set_theta_direction(-1)维持变量的顺时针排列顺序,避免布局错乱
- 通过
标签切线方向显示:
- 将标签旋转逻辑调整为与对应极角一致,让标签自然贴合雷达图切线方向
- 设置标签的水平、垂直居中对齐,避免遮挡图表内容
内容的提问来源于stack exchange,提问作者The_Napster
相关产品推荐
相关产品推荐

