如何将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)
代码说明
- 添加自定义环形:在所有扇区绘制完成后,通过
Scatterpolar用360个点形成完整闭环,对应第3环和第7环的位置。 - 样式调整:设置
line.color='white'和line.width实现白色加宽效果。 - 层级控制:由于
Scatterpolar轨迹在Barpolar之后添加,会自动显示在扇区上方,确保自定义环形可见。
内容的提问来源于stack exchange,提问作者LGe
相关产品推荐
相关产品推荐

