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

如何用Plotly绘制多饼图环形?支持自定义参数与悬停文本

如何绘制带悬停文本的Plotly分段环形图表?

给定以下示例数据,我们需要在每个(x,y)坐标点绘制由[a,b]参数决定比例的分段环形图,并为每个分段添加自定义悬停文本:

x = [1,2,3,4] 
y = [1,2,3,4]
ab = [[1,1], [1,2], [3,7], [15,2]]

以下是可直接运行的解决方案,解决了原有方案无法添加悬停文本的问题:

import plotly.graph_objects as go
import numpy as np

def create_arc(x_center, y_center, radius, start_angle, end_angle, num_points=100):
    # 将角度转换为弧度
    start_rad = np.deg2rad(start_angle)
    end_rad = np.deg2rad(end_angle)
    # 生成角度序列
    angles = np.linspace(start_rad, end_rad, num_points)
    # 计算圆弧的x、y坐标
    arc_x = x_center + radius * np.cos(angles)
    arc_y = y_center + radius * np.sin(angles)
    # 闭合圆弧(连接圆心)
    arc_x = np.concatenate([[x_center], arc_x, [x_center]])
    arc_y = np.concatenate([[y_center], arc_y, [y_center]])
    return arc_x, arc_y

# 初始化图表
fig = go.Figure()

# 环形半径
radius = 0.3

# 遍历每个数据点
for xi, yi, (a, b) in zip(x, y, ab):
    total = a + b
    # 计算两段圆弧的角度范围
    angle_a = (a / total) * 360
    # 添加a对应的分段
    arc_x_a, arc_y_a = create_arc(xi, yi, radius, 0, angle_a)
    fig.add_trace(go.Scatter(
        x=arc_x_a,
        y=arc_y_a,
        fill='toself',
        hovertext=f"坐标: ({xi}, {yi})<br>数值: a={a}",
        hoverinfo='text',
        line=dict(color='white')
    ))
    # 添加b对应的分段
    arc_x_b, arc_y_b = create_arc(xi, yi, radius, angle_a, 360)
    fig.add_trace(go.Scatter(
        x=arc_x_b,
        y=arc_y_b,
        fill='toself',
        hovertext=f"坐标: ({xi}, {yi})<br>数值: b={b}",
        hoverinfo='text',
        line=dict(color='white')
    ))

# 设置布局
fig.update_layout(
    title='带悬停文本的分段环形图',
    xaxis=dict(range=[0, 5], showgrid=False, zeroline=False, tickmode='array', tickvals=x),
    yaxis=dict(range=[0, 5], showgrid=False, zeroline=False, tickmode='array', tickvals=y),
    showlegend=False,
    hovermode='closest'
)

fig.show()

关键说明:

  • 圆弧生成:通过create_arc函数计算分段环形的坐标点,同时闭合圆弧(连接圆心)实现填充效果。
  • 悬停文本:每个Scatter轨迹直接设置hovertext属性,自定义显示坐标和对应数值,通过hoverinfo='text'确保只显示自定义文本。
  • 样式调整:设置line=dict(color='white')避免分段间的线条干扰,关闭网格线和刻度让图表更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:08:00