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

如何将Plotly环形雷达图指定环设为白色并加宽?

Plotly环形雷达图:自定义特定环样式问题解决

问题描述

我在使用Plotly绘制环形雷达图时,需要将第3环和第7环设置为白色并加宽,以此区分不同层级。尝试使用line_color等参数时,仅影响扇区而非环本身。

原示例代码:

import plotly.graph_objects as go
import matplotlib.cm as cm
import matplotlib.colors as mcolors

# 示例数据(来自表格的平均值)
dimensionen = [
    '数据/技术', '组织与流程', '战略与治理',
    '思维模式与文化', '可实施性与协作', '外部市场参与者'
]

# 各维度的量表平均值(来自表格)
mittelwerte = {
    '数据/技术': 6, '组织与流程': 5, '战略与治理': 7,
    '思维模式与文化': 8, '可实施性与协作': 3, '外部市场参与者': 2
}

# Viridis颜色映射用于选色
viridis = cm.get_cmap('viridis', 12)
colors = [mcolors.to_hex(viridis(i)) for i in range(viridis.N)]

# 创建扩展环形雷达图的函数
def create_extended_donut_radar(dimensionen, mittelwerte):
    num_dimensionen = len(dimensionen)
    num_scales = 11  # 0到10共11个量表等级

    fig = go.Figure()

    for idx, dim_name in enumerate(dimensionen):
        mittelwert = mittelwerte[dim_name]

        # 为每个量表等级添加扇区
        for scale in range(num_scales):
            inner_radius = scale * 0.09 + 0.05  # 调整为等间距
            outer_radius = inner_radius + 0.09  # 调整为等间距

            if scale == 0:
                color = 'white'
            elif scale <= mittelwert:
                color = colors[scale]
            else:
                color = 'lightgrey'

            fig.add_trace(go.Barpolar(
                r=[inner_radius, outer_radius],
                theta=[(360 / num_dimensionen) * idx],
                width=[(360 / num_dimensionen) - 1],
                marker_color=color,
                marker_line_color='black',
                marker_line_width=2,
                opacity=0.7
            ))

    # 调整布局
    fig.update_layout(
        title='',
        title_font_size=24,
        title_x=0.5,
        polar=dict(
            radialaxis=dict(visible=False),
            angularaxis=dict(visible=False)
        ),
        showlegend=False
    )

    # 在默认浏览器中显示Plotly图表
    fig.show(renderer='browser')

# 创建环形雷达图
create_extended_donut_radar(dimensionen, mittelwerte)

示意图:标注目标环的环形雷达图

解决方案

原代码使用Barpolar绘制扇区,无法直接修改环形样式。需单独添加Scatterpolar轨迹绘制目标环形,确保其显示在所有扇区上方。

修改后的完整代码

import plotly.graph_objects as go
import matplotlib.cm as cm
import matplotlib.colors as mcolors

# 示例数据(来自表格的平均值)
dimensionen = [
    '数据/技术', '组织与流程', '战略与治理',
    '思维模式与文化', '可实施性与协作', '外部市场参与者'
]

# 各维度的量表平均值(来自表格)
mittelwerte = {
    '数据/技术': 6, '组织与流程': 5, '战略与治理': 7,
    '思维模式与文化': 8, '可实施性与协作': 3, '外部市场参与者': 2
}

# Viridis颜色映射用于选色
viridis = cm.get_cmap('viridis', 12)
colors = [mcolors.to_hex(viridis(i)) for i in range(viridis.N)]

# 创建扩展环形雷达图的函数
def create_extended_donut_radar(dimensionen, mittelwerte):
    num_dimensionen = len(dimensionen)
    num_scales = 11  # 0到10共11个量表等级

    fig = go.Figure()

    for idx, dim_name in enumerate(dimensionen):
        mittelwert = mittelwerte[dim_name]

        # 为每个量表等级添加扇区
        for scale in range(num_scales):
            inner_radius = scale * 0.09 + 0.05  # 调整为等间距
            outer_radius = inner_radius + 0.09  # 调整为等间距

            if scale == 0:
                color = 'white'
            elif scale <= mittelwert:
                color = colors[scale]
            else:
                color = 'lightgrey'

            fig.add_trace(go.Barpolar(
                r=[inner_radius, outer_radius],
                theta=[(360 / num_dimensionen) * idx],
                width=[(360 / num_dimensionen) - 1],
                marker_color=color,
                marker_line_color='black',
                marker_line_width=2,
                opacity=0.7
            ))

    # 添加自定义环形:第3环和第7环
    target_rings = [3, 7]
    ring_width = 3
    for ring_num in target_rings:
        # 计算目标环的半径(对应scale的外半径)
        ring_radius = ring_num * 0.09 + 0.05 + 0.09
        # 绘制闭环环形
        fig.add_trace(go.Scatterpolar(
            r=[ring_radius] * 360,
            theta=list(range(360)),
            mode='lines',
            line=dict(color='white', width=ring_width),
            showlegend=False
        ))

    # 调整布局
    fig.update_layout(
        title='',
        title_font_size=24,
        title_x=0.5,
        polar=dict(
            radialaxis=dict(visible=False),
            angularaxis=dict(visible=False)
        ),
        showlegend=False
    )

    # 在默认浏览器中显示Plotly图表
    fig.show(renderer='browser')

# 创建环形雷达图
create_extended_donut_radar(dimensionen, mittelwerte)

代码说明

  1. 添加自定义环形:在所有扇区绘制完成后,通过Scatterpolar用360个点形成完整闭环,对应第3环和第7环的位置。
  2. 样式调整:设置line.color='white'和line.width实现白色加宽效果。
  3. 层级控制:由于Scatterpolar轨迹在Barpolar之后添加,会自动显示在扇区上方,确保自定义环形可见。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:45:24