在数据可视化的世界里,饼图是最直观的展示比例关系的工具之一。

然而,传统的静态饼图已经无法满足现代数据分析的需求。Plotly作为一款强大的可视化库,不仅提供了饼图丰富的基础功能,还支持交互效果和动态更新等高级特性。

本文我们将深入探讨Plotly在饼图绘制上的高级功能,包括交互效果和动态更新等技巧。

这些功能在以下场景中尤为重要:

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

饼图交互效果

点击分离切片

Plotly允许我们通过点击切片实现分离效果,增强用户与图表的交互体验。

但是,为了实现点击切片分离的效果,需要使用Plotly的事件处理机制,通常结合Dash框架来实现。

import dash
from dash import dcc, html, Input, Output, State
import plotly.graph_objects as go app = dash.Dash(__name__) # 基础数据
labels = ["A", "B", "C", "D"]
values = [25, 20, 30, 25]
pull = [0, 0, 0, 0] # 初始状态无偏移 app.layout = html.Div(
[
dcc.Graph(
id="interactive-pie-chart",
figure={
"data": [
go.Pie(
labels=labels,
values=values,
pull=pull,
textinfo="percent+label",
insidetextorientation="radial",
marker=dict(line=dict(color="#000000", width=2)),
)
]
},
clickData=None, # 初始点击数据
),
html.Div(id="output-container"),
]
) @app.callback(
Output("interactive-pie-chart", "figure"),
Input("interactive-pie-chart", "clickData"),
State("interactive-pie-chart", "figure"),
)
def update_pull(clickData, figure):
"""更新点击切片的偏移量"""
if clickData:
point = clickData["points"][0]
index = labels.index(point["label"]) # 更新pull数组
new_pull = [0.1 if i == index else 0 for i in range(len(values))] # 更新图表
figure["data"][0]["pull"] = new_pull
figure["data"][0]["marker"]["colors"] = [
"#ff9999" if i == index else "#636efa" for i in range(len(values))
] return figure if __name__ == "__main__":
app.run(debug=True)

运行效果:

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

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

悬停提示

悬停效果是提升用户体验的关键,Plotly提供了强大的自定义能力。

使用%{variable}语法映射数据字段,通过customdata传递额外信息,同时结合hovertemplate实现复杂提示。

# 创建饼图
fig = go.Figure(
data=[
go.Pie(
labels=["A", "B", "C"],
values=[30, 40, 30],
customdata=["上升", "下降", "上升"],
),
]
) fig.update_traces(
hovertemplate="类别: %{label}<br>"
+ "数值: %{value}<br>"
+ "占比: %{percent}<br>"
+ "趋势: %{customdata}<extra></extra>"
)

动态饼图

动态更新是现代数据可视化的核心能力,Plotly结合Dash框架可以轻松实现。

import dash
from dash import dcc, html, Input, Output
import plotly.graph_objects as go app = dash.Dash(__name__) app.layout = html.Div([
dcc.Input(id='input-values', type='text', value='25,20,30,25'),
html.Button('更新图表', id='update-button'),
dcc.Graph(id='dynamic-pie-chart')
]) @app.callback(
Output('dynamic-pie-chart', 'figure'),
Input('update-button', 'n_clicks'),
Input('input-values', 'value')
)
def update_pie_chart(n_clicks, values_str):
values = list(map(int, values_str.split(',')))
fig = go.Figure(go.Pie(labels=labels, values=values))
return fig if __name__ == '__main__':
app.run(debug=True)

在这个示例中,用户可以通过输入一个数字来动态更新饼图的数据。

当用户输入新的值时,update_pie函数会被触发,它会根据新的数据重新生成饼图。

我们还可以进一步扩展这个功能,实现多级联动筛选、动态排序和颜色映射更新等,让饼图更加智能化和个性化。

总结

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

  1. 实现了点击分离、悬停提示等交互效果
  2. 开发了基于用户输入的动态更新功能

这些高级功能不仅提升了数据可视化的表现力,还增强了用户的交互体验。

『Plotly实战指南』--饼图绘制高级篇的更多相关文章

  1. SpringBootTest单元测试实战、SpringBoot测试进阶高级篇之MockMvc讲解

    1.@SpringBootTest单元测试实战 简介:讲解SpringBoot的单元测试 1.引入相关依赖 <!--springboot程序测试依赖,如果是自动创建项目默认添加--> &l ...

  2. 『Numpy学习指南』Matplotlib绘图

    数据生成: import numpy as np import matplotlib.pyplot as plt func = np.poly1d(np.array([,,,])) func1 = f ...

  3. 『Numpy学习指南』排序&索引&抽取函数介绍

    排序: numpy.lexsort(): numpy.lexsort()是个排字典序函数,因为很有意思,感觉也蛮有用的,所以单独列出来讲一下: 强调一点,本函数只接受一个参数! import nump ...

  4. Apache Beam实战指南 | 大数据管道(pipeline)设计及实践

    Apache Beam实战指南 | 大数据管道(pipeline)设计及实践  mp.weixin.qq.com 策划 & 审校 | Natalie作者 | 张海涛编辑 | LindaAI 前 ...

  5. 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景

    大家好,我是melo,一名大三后台练习生 专栏回顾 索引的原理&&设计原则 欢迎关注本专栏:MySQL高级篇 本篇速览 在我们上一篇文章中,讲到了索引的原理&&设计原则 ...

  6. 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

    作者:阿里云用户mr_wid ,z)NKt#   @I6A9do   如果感觉该评测对您有所帮助, 欢迎投票给本文: UO<claV   RsfTUb)<   投票标题:  28.[阿里云 ...

  7. 2017-2018-2 20155303『网络对抗技术』Exp6:信息收集与漏洞扫描

    2017-2018-2 20155303『网络对抗技术』 Exp6:信息收集与漏洞扫描 --------CONTENTS-------- 一.原理与实践说明 1.实践内容 2.基础问题 二.实践过程记 ...

  8. 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

    2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...

  9. 2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践

    2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践 --------CONTENTS-------- 1. 免杀原理与实践说明 实验说明 基础问题回答 2. 使用msf ...

  10. 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践

    2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...

随机推荐

  1. CDS标准视图:分配到任务清单的维护包数据 I_PckgTaskListOpalLocData

    视图名称:分配到任务清单的维护包数据 I_PckgTaskListOpalLocData 视图类型:基础 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IPCKTLO ...

  2. SpringBoot(四) - 整合Mybatis,逆向工程,JPA,Mybatis-plus

    1.SpringBoot整合MyBatis 1.1 application.yml # 数据源配置 spring: datasource: driver-class-name: com.mysql.c ...

  3. java多线程---总结(1)

    线程创建.start.run 一.创建线程方式 java创建线程的方式,主要有三种:类Thread.接口Runnable.接口Callable. 1.Thread和Runnable进行比较 他们之间的 ...

  4. 常用的MySQL备份/还原 的方法

    mysql备份数据库 mysql备份单个数据库 #mysql备份某个库格式: mysqldump -h主机名 -P端口 -u用户名 -p"密码" --database 数据库名 & ...

  5. CRT优化RSA

    转载:利用中国剩余定理加速 RSA RSA 作为世界上使用最为流行的公钥密码算法,被广泛应用在数据加密和数字签名上. 为了提高加密和签名验证的效率,一般会将RSA的加密指数(一般是公钥位数)设置的较小 ...

  6. 使用_begin{thebibliography}__bibitem 如何参考文献

    本人是tex新手,如果各位大佬有更好的方法欢迎分享,不胜感激. 适用情况 本文适用于使用\begin{thebibliography}和\bibitem排序的情况,如果使用bibtex排序那么网上很多 ...

  7. 认识soui4js(第5篇):使用扩展控件

    无论内置控件多么丰富,也不可能满足用户所有需求.总有时候用户需要自己扩展控件. soui4js推荐使用C++来扩展控件,然后通过实现一个js模块来提供js使用. 扩展控件通常涉及到图形上下文的频繁交互 ...

  8. deepseek-v3 论文阅读

    模型结构 MLA(Multi-Head Latent Attention) 主要作用是在保证效果的基础上, 利用低秩压缩的原理优化kvCache, 加速推理, 同时节省训练显存. 先回忆下MHA, 在 ...

  9. Python if分支

    分支语句: 1.单分支语句 1 if 条件表达式: 2 print("如果成立怎么养怎么样") 例:让用户输入年龄,如果大于18就可以去网吧偷耳机age = int(input(& ...

  10. 别再为文本提取抓狂!一站式文本提取神器Kreuzberg 助你解决PDF、图片、文档等多格式文件的文本提取难题

    大家好,我是六哥,相信很多朋友肯定都有过从各种文档里提取文本的经历,那过程可太让人头疼了!今天就给大家分享一款超实用的现代Python库--Kreuzberg,帮你轻松解决文本提取的难题. 一.Kre ...