找回密码
 立即注册
首页 业界区 业界 『Plotly实战指南』--饼图绘制高级篇

『Plotly实战指南』--饼图绘制高级篇

东门芳洲 3 天前
在数据可视化的世界里,饼图是最直观的展示比例关系的工具之一。
然而,传统的静态饼图已经无法满足现代数据分析的需求。Plotly作为一款强大的可视化库,不仅提供了饼图丰富的基础功能,还支持交互效果和动态更新等高级特性。
本文我们将深入探讨Plotly在饼图绘制上的高级功能,包括交互效果和动态更新等技巧。
这些功能在以下场景中尤为重要:

  • 仪表盘交互:用户需要通过点击、悬停等操作深入了解数据
  • 数据探索工具:动态更新帮助用户实时分析不同数据集
  • 动态报告展示:动态交互性让报告更具吸引力和专业性
饼图交互效果

点击分离切片

Plotly允许我们通过点击切片实现分离效果,增强用户与图表的交互体验。
但是,为了实现点击切片分离的效果,需要使用Plotly的事件处理机制,通常结合Dash框架来实现。
  1. import dash
  2. from dash import dcc, html, Input, Output, State
  3. import plotly.graph_objects as go
  4. app = dash.Dash(__name__)
  5. # 基础数据
  6. labels = ["A", "B", "C", "D"]
  7. values = [25, 20, 30, 25]
  8. pull = [0, 0, 0, 0]  # 初始状态无偏移
  9. app.layout = html.Div(
  10.     [
  11.         dcc.Graph(
  12.             id="interactive-pie-chart",
  13.             figure={
  14.                 "data": [
  15.                     go.Pie(
  16.                         labels=labels,
  17.                         values=values,
  18.                         pull=pull,
  19.                         textinfo="percent+label",
  20.                         insidetextorientation="radial",
  21.                         marker=dict(line=dict(color="#000000", width=2)),
  22.                     )
  23.                 ]
  24.             },
  25.             clickData=None,  # 初始点击数据
  26.         ),
  27.         html.Div(id="output-container"),
  28.     ]
  29. )
  30. @app.callback(
  31.     Output("interactive-pie-chart", "figure"),
  32.     Input("interactive-pie-chart", "clickData"),
  33.     State("interactive-pie-chart", "figure"),
  34. )
  35. def update_pull(clickData, figure):
  36.     """更新点击切片的偏移量"""
  37.     if clickData:
  38.         point = clickData["points"][0]
  39.         index = labels.index(point["label"])
  40.         # 更新pull数组
  41.         new_pull = [0.1 if i == index else 0 for i in range(len(values))]
  42.         # 更新图表
  43.         figure["data"][0]["pull"] = new_pull
  44.         figure["data"][0]["marker"]["colors"] = [
  45.             "#ff9999" if i == index else "#636efa" for i in range(len(values))
  46.         ]
  47.     return figure
  48. if __name__ == "__main__":
  49.     app.run(debug=True)
复制代码
运行效果:
1.gif

其中,代码主要涉及的内容包括:

  • Dash框架:使用Dash框架来创建交互式Web应用。
  • clickData:用于捕获用户点击事件的数据。它包含点击切片的详细信息
  • 回调函数:@callback装饰器,监听图表的点击事件。点击切片时,回调函数会被触发
  • 更新pull属性:在回调函数中,根据点击的切片索引更新pull数组,从而实现切片分离效果
  • 高亮显示:通过更新marker.colors属性,使被点击的切片高亮显示
悬停提示

悬停效果是提升用户体验的关键,Plotly提供了强大的自定义能力。
使用%{variable}语法映射数据字段,通过customdata传递额外信息,同时结合hovertemplate实现复杂提示。
  1. # 创建饼图
  2. fig = go.Figure(
  3.     data=[
  4.         go.Pie(
  5.             labels=["A", "B", "C"],
  6.             values=[30, 40, 30],
  7.             customdata=["上升", "下降", "上升"],
  8.         ),
  9.     ]
  10. )
  11. fig.update_traces(
  12.     hovertemplate="类别: %{label}<br>"
  13.     + "数值: %{value}<br>"
  14.     + "占比: %{percent}<br>"
  15.     + "趋势: %{customdata}<extra></extra>"
  16. )
复制代码
2.gif

动态饼图

动态更新是现代数据可视化的核心能力,Plotly结合Dash框架可以轻松实现。
  1. import dash
  2. from dash import dcc, html, Input, Output
  3. import plotly.graph_objects as go
  4. app = dash.Dash(__name__)
  5. app.layout = html.Div([
  6.     dcc.Input(id='input-values', type='text', value='25,20,30,25'),
  7.     html.Button('更新图表', id='update-button'),
  8.     dcc.Graph(id='dynamic-pie-chart')
  9. ])
  10. @app.callback(
  11.     Output('dynamic-pie-chart', 'figure'),
  12.     Input('update-button', 'n_clicks'),
  13.     Input('input-values', 'value')
  14. )
  15. def update_pie_chart(n_clicks, values_str):
  16.     values = list(map(int, values_str.split(',')))
  17.     fig = go.Figure(go.Pie(labels=labels, values=values))
  18.     return fig
  19. if __name__ == '__main__':
  20.     app.run(debug=True)
复制代码
3.gif

在这个示例中,用户可以通过输入一个数字来动态更新饼图的数据。
当用户输入新的值时,update_pie函数会被触发,它会根据新的数据重新生成饼图。
我们还可以进一步扩展这个功能,实现多级联动筛选、动态排序和颜色映射更新等,让饼图更加智能化和个性化。
总结

通过本文的深入探讨,我们掌握了Plotly在饼图绘制上的高级技巧:

  • 实现了点击分离、悬停提示等交互效果
  • 开发了基于用户输入的动态更新功能
这些高级功能不仅提升了数据可视化的表现力,还增强了用户的交互体验。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册