You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

雷达图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()

关键修改说明

  1. 雷达图居中对齐:

    • 通过set_theta_zero_location('N')将test1_sample对应的0度极角移至页面顶部,使其成为垂直中线,实现整体居中
    • 用set_theta_direction(-1)维持变量的顺时针排列顺序,避免布局错乱
  2. 标签切线方向显示:

    • 将标签旋转逻辑调整为与对应极角一致,让标签自然贴合雷达图切线方向
    • 设置标签的水平、垂直居中对齐,避免遮挡图表内容

内容的提问来源于stack exchange,提问作者The_Napster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:54:55