news 2026/2/12 9:06:50

Plotly高级可视化库的使用方法(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Plotly高级可视化库的使用方法(一)

前言

在我平时的工作中,常常用到可视化来分析数据,但是matplotlib生成的是静态图片,分析使用起来多有不变,因此渐渐的plotly成为了我工作中数据分析的主力库。特此开一篇博客,系统总结对plotly的理解,也借机学习一些高级的功能。

Express和GraphObject

在plotly中,有两种导入的方式,一个是express(import plotly.express as px) 和 graphobject(import plotly.graphobjext as go), 这两种模式的区别是 express 是一种高级API的实现,提供了比较好的封装,如果我们有一个比较好的dateframe或者字典类型的数据,那么使用px是比较轻松的。而go则是一种底层的api,因此常常要配置一些比较复杂的属性,但是同时自由度也是最高的。

Express 中都有什么工具

所谓的“工具”,我在此将他们封装的各种"线型",下面罗列一下他们提供的线型:

import plotly.express as px print(dir(px)) ====================== ['Constant', 'IdentityMap', 'NO_COLOR', 'Range', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_chart_types', '_core', '_doc', '_imshow', '_special_inputs', 'area', 'bar', 'bar_polar', 'box', 'choropleth', 'choropleth_map', 'choropleth_mapbox', 'colors', 'data', 'defaults', 'density_contour', 'density_heatmap', 'density_map', 'density_mapbox', 'ecdf', 'funnel', 'funnel_area', 'get_trendline_results', 'histogram', 'icicle', 'imshow', 'imshow_utils', 'line', 'line_3d', 'line_geo', 'line_map', 'line_mapbox', 'line_polar', 'line_ternary', 'np', 'optional_imports', 'parallel_categories', 'parallel_coordinates', 'pie', 'scatter', 'scatter_3d', 'scatter_geo', 'scatter_map', 'scatter_mapbox', 'scatter_matrix', 'scatter_polar', 'scatter_ternary', 'set_mapbox_access_token', 'strip', 'sunburst', 'timeline', 'treemap', 'trendline_functions', 'violin']

下面以px.bar为例,罗列一下可以配置的的属性:

import plotly.express as px import plotly.graph_objects as go help(px.bar) ============================================ Help on function bar in module plotly.express._chart_types: bar(data_frame=None, x=None, y=None, color=None, pattern_shape=None, facet_row=None, facet_col=None, facet_col_wrap=0, facet_row_spacing=None, facet_col_spacing=None, hover_name=None, hover_data=None, custom_data=None, text=None, base=None, error_x=None, error_x_minus=None, error_y=None, error_y_minus=None, animation_frame=None, animation_group=None, category_orders=None, labels=None, color_discrete_sequence=None, color_discrete_map=None, color_continuous_scale=None, pattern_shape_sequence=None, pattern_shape_map=None, range_color=None, color_continuous_midpoint=None, opacity=None, orientation=None, barmode='relative', log_x=False, log_y=False, range_x=None, range_y=None, text_auto=False, title=None, subtitle=None, template=None, width=None, height=None) -> plotly.graph_objs._figure.Figure In a bar plot, each row of `data_frame` is represented as a rectangular mark. Parameters ---------- data_frame: DataFrame or array-like or dict This argument needs to be passed for column names (and not keyword names) to be used. Array-like and dict are transformed internally to a pandas DataFrame. Optional: if missing, a DataFrame gets constructed under the hood using the other arguments. x: str or int or Series or array-like Either a name of a column in `data_frame`, or a pandas Series or array_like object. Values from this column or array_like are used to position marks along the x axis in cartesian coordinates. Either `x` or `y` can optionally be a list of column references or array_likes, in which case the data will be treated as if it were 'wide' rather than ...

这里提供两种查询一个方法的属性的方法:

import plotly.express as px # 获取完整的文档字符串 full_doc = px.bar.__doc__ # 提取并打印前几行作为摘要 print("--- 简要描述摘要 ---") for line in full_doc.split('\n')[:5]: print(line.strip())
import plotly.express as px import inspect # 使用 inspect.signature 提取函数签名 signature = inspect.signature(px.bar) print("\n--- 函数签名摘要 ---") print(signature) ============================= --- 函数签名摘要 --- (data_frame=None, x=None, y=None, color=None, pattern_shape=None, facet_row=None, facet_col=None, facet_col_wrap=0, facet_row_spacing=None, facet_col_spacing=None, hover_name=None, hover_data=None, custom_data=None, text=None, base=None, error_x=None, error_x_minus=None, error_y=None, error_y_minus=None, animation_frame=None, animation_group=None, category_orders=None, labels=None, color_discrete_sequence=None, color_discrete_map=None, color_continuous_scale=None, pattern_shape_sequence=None, pattern_shape_map=None, range_color=None, color_continuous_midpoint=None, opacity=None, orientation=None, barmode='relative', log_x=False, log_y=False, range_x=None, range_y=None, text_auto=False, title=None, subtitle=None, template=None, width=None, height=None) -> plotly.graph_objs._figure.Figure

plotly的线型的属性是有很多的,以上为顶级属性,就有几十种,加之plotly中的属性是运行相互嵌套的,所以一层一层嵌套下去,属性可以说是有无数种,可以完成极其复杂的绘图任务。

Express如何绘制多条曲线

在实际工作场景中,多条曲线进行对比是必不可少的。

import plotly.express as px import pandas as pd # 1. 准备长格式数据 data = { 'Month': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5], 'Product': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'], 'Sales': [100, 120, 110, 140, 150, 80, 95, 105, 115, 130] } df = pd.DataFrame(data) # 2. 调用 px.line,并使用 'Product' 列进行着色/分组 fig = px.line( df, x='Month', # X 轴:月份 y='Sales', # Y 轴:销售额 color='Product', # ✨ 核心:告诉 Plotly 按 'Product' 列分组绘制多条曲线 title='产品A和B的月销售趋势' ) fig.show()

运行这段代码后,会得到一个包含两条曲线的线图:

一条蓝色曲线,对应于 Product 列中值为 ‘A’ 的所有行。

一条红色曲线(或另一种颜色),对应于 Product 列中值为 ‘B’ 的所有行。

总结: 在 Plotly Express 中绘制多条曲线,关键在于使用 px.line 函数,并将您想要区分的分组列赋值给 color 参数。

GraphObject的方式怎么写

使用go方式进行绘图代码的编写,首先我们要捋清楚一个完整的go的结构是怎么样的。
下面提供两种写法:
写法一:标准写法

importplotly.graph_objectsasgo# --- 0. 准备数据 ---months=['Jan','Feb','Mar','Apr','May']sales_A=[100,150,130,170,180]sales_B=[120,130,160,150,190]# --- 步骤 1:准备轨迹 (Traces) ---# Trace 1:产品 A - 红色实线 + 方块标记trace_A=go.Scatter(x=months,y=sales_A,mode='lines+markers',name='Product A',# ✨ 核心定制:使用 line 和 marker 属性line=dict(color='red',width=2),marker=dict(symbol='square',size=8))# Trace 2:产品 B - 蓝色虚线 + 圆形标记trace_B=go.Scatter(x=months,y=sales_B,mode='lines+markers',name='Product B',# ✨ 核心定制:使用 line 和 marker 属性line=dict(color='blue',width=4,dash='dot'),# 设置虚线和宽度marker=dict(symbol='circle',size=10))# --- 步骤 2:定义图表 (Figure) ---fig=go.Figure(data=[trace_A,trace_B],# 传入所有轨迹# 可以在此处定义初始布局layout=go.Layout(title='GO模式下的产品销售趋势对比',xaxis_title='月份',yaxis_title='销售额',hovermode="x unified"# 统一悬停提示))# --- 步骤 3:定制与展示 ---# 进一步调整布局,例如图例位置fig.update_layout(legend=dict(orientation="h",# 水平放置图例yanchor="bottom",y=1.02,xanchor="right",x=1))fig.show()

写法二: 更灵活

importplotly.graph_objectsasgo# 1. 创建空 Figurefig=go.Figure()# 2. 逐个添加 Trace 对象fig.add_trace(go.Scatter(...))fig.add_trace(go.Bar(...))# 3. 更新 Layout 对象fig.update_layout(title='新标题',xaxis_title='X轴')

写法一是一个标准的go结果的写法,通过分治思想,将每一部分定义完,然后传入到Figure中。也就是Figure里面可以传trace对象与layout对象。
其中trace对象使用go.Scatter创建,layout对象是一个go.layout。另外在定义完Figure后,可以在外部使用fig.update_layout进一步更新。

写法二是一个更加灵活的写法,是定义完FIgure之后,通过add_trace来进行添加trace。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/12 4:46:15

代码实现 基于 DeepEval 框架实现工单摘要质量的批量自动评估

代码实现 基于 DeepEval 框架实现工单摘要质量的批量自动评估 一、代码核心目标与整体流程 基于 DeepEval 框架实现工单摘要质量的批量自动评估:对接自定义 OpenAI 兼容接口(34ku),读取 Excel 中的「原始工单对话+人工/模型生成的工单摘要」,通过 DeepEval 的 Summariza…

作者头像 李华
网站建设 2026/2/4 9:52:00

计算单链表的长度

参考视频 2-9 单链表求表长和插入链点操作_哔哩哔哩_bilibili 暂无力扣参考题 题目 #include <stdio.h> #include <stdlib.h>typedef int ElemType; typedef struct LNode {ElemType data;struct LNode *next; }LNode,*LinkList;LinkList Create();/* 细节在此不…

作者头像 李华
网站建设 2026/1/29 13:42:26

全网最全的Cobalt Strike使用教程-内网渗透之域控攻击篇!黑客技术零基础入门到精通教程建议收藏!

免责声明本号所发布的文章及工具只限交流学习&#xff0c;本人不承担任何责任&#xff01;一、前言 在本篇文章中我将继续为大家介绍一些攻击域控制器时常用的一些方法&#xff0c;为了方便演示&#xff0c;我是直接在目标域控制器下进行一系列操作的&#xff0c;在真实环境下&…

作者头像 李华
网站建设 2026/1/29 13:19:06

Dify部署过程中连接Qwen3-32B API的认证配置

Dify 集成 Qwen3-32B API 的认证配置实践 在当前企业加速构建智能系统的大背景下&#xff0c;如何将高性能大模型安全、高效地嵌入现有平台&#xff0c;已成为AI工程落地的关键挑战。Dify 作为一款支持低代码编排的AI应用开发平台&#xff0c;正被越来越多团队用于快速搭建对话…

作者头像 李华
网站建设 2026/2/9 21:50:04

要学会降低写作门槛

如果每天的卡片写作数量低于预期&#xff0c;那就要调整心态。要有一种积极、融合的心态&#xff1a;万物皆可写。 今天想做什么重要的事&#xff1f;要处理什么重要的工作&#xff1f;开会遇到什么问题&#xff1f;开会要提前准备发言吗&#xff1f;要回复别人什么重要的事情…

作者头像 李华
网站建设 2026/2/10 10:00:58

火山引擎AI大模型开放平台接入Qwen3-VL-8B实操

火山引擎AI大模型开放平台接入Qwen3-VL-8B实操 在电商客服中&#xff0c;用户上传一张商品图问“这是什么手机&#xff1f;能用5G吗&#xff1f;”——过去这样的问题只能靠人工判断&#xff0c;响应慢、成本高&#xff1b;如今&#xff0c;借助多模态大模型&#xff0c;系统不…

作者头像 李华