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

如何为Plotly饼图的单个切片设置独立透明度?

实现饼图切片单独设置透明度的方案

完全可以像设置pull参数那样,通过传入透明度值列表给每个饼图切片单独设置透明度。结合Dash的点击回调,就能实现点击切片时高亮(保持原透明度)、未点击切片降低透明度的效果,具体实现步骤如下:

  1. 初始饼图配置
    用Plotly Express生成饼图时,先初始化pull和opacity的列表,默认所有切片都不拉出、透明度为1:
import plotly.express as px
from dash import Dash, dcc, html, Input, Output

df = px.data.tips()
fig = px.pie(df, values='tip', names='day')

# 初始化pull和opacity列表,默认全0和全1
fig.update_traces(
    pull=[0]*len(df['day'].unique()),
    opacity=[1]*len(df['day'].unique())
)

app = Dash(__name__)
app.layout = html.Div([
    dcc.Graph(id='pie-graph', figure=fig)
])
  1. 编写Dash回调处理点击事件
    在回调中获取点击的切片索引,更新opacity列表:将点击的切片透明度设为1,其余设为0.5(可自定义),同时同步更新pull参数实现拉出效果:
@app.callback(
    Output('pie-graph', 'figure'),
    Input('pie-graph', 'clickData')
)
def update_pie(clickData):
    fig = px.pie(df, values='tip', names='day')
    categories = df['day'].unique()
    pull_list = [0]*len(categories)
    opacity_list = [0.5]*len(categories)

    if clickData:
        # 获取点击切片的索引
        clicked_idx = clickData['points'][0]['pointIndex']
        # 高亮点击的切片:透明度1,拉出距离0.1
        opacity_list[clicked_idx] = 1
        pull_list[clicked_idx] = 0.1

    fig.update_traces(pull=pull_list, opacity=opacity_list)
    return fig

if __name__ == '__main__':
    app.run_server(debug=True)
  1. 扩展:处理多次点击切换状态
    如果需要点击同一切片时恢复原状,可以加入状态存储(dcc.Store)记录上次点击的索引,判断当前点击是否为同一索引来切换状态:
app.layout = html.Div([
    dcc.Graph(id='pie-graph', figure=fig),
    dcc.Store(id='clicked-store', data=-1)  # 存储上次点击的索引,初始为-1
])

@app.callback(
    [Output('pie-graph', 'figure'), Output('clicked-store', 'data')],
    [Input('pie-graph', 'clickData')],
    [Input('clicked-store', 'data')]
)
def update_pie_toggle(clickData, last_clicked):
    fig = px.pie(df, values='tip', names='day')
    categories = df['day'].unique()
    pull_list = [0]*len(categories)
    opacity_list = [1]*len(categories)

    if clickData:
        clicked_idx = clickData['points'][0]['pointIndex']
        if clicked_idx == last_clicked:
            # 再次点击同一切片,恢复原状
            last_clicked = -1
        else:
            # 高亮新切片
            opacity_list = [0.5]*len(categories)
            opacity_list[clicked_idx] = 1
            pull_list[clicked_idx] = 0.1
            last_clicked = clicked_idx

    fig.update_traces(pull=pull_list, opacity=opacity_list)
    return fig, last_clicked

核心逻辑就是利用Plotly饼图update_traces()方法中,opacity参数支持传入与切片数量匹配的列表,和pull参数的用法完全一致,结合Dash的交互回调就能实现你要的高亮效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:02:14