ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Plotly.py 表格与图表组合子图:用 make_subplots 在 Python 中创建 Table + Scatter 混合布局

Plotly.py 表格与图表组合子图:用 make_subplots 在 Python 中创建 Table + Scatter 混合布局 数据可视化数据分析【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址https://gitcode.com/gh_mirrors/pl/plotly.py点击查看免费下载doc/python/table-subplots.md演示了 Plotly.py 的一项典型实战能力通过plotly.subplots.make_subplots的specs参数在同一个画布中同时容纳go.Table表格 trace 与go.Scatter折线 trace形成顶部数据表格 下方趋势曲线的数据看板式布局。读完本文你将掌握make_subplots的specs网格声明、row/col定向添加 trace、shared_xaxes轴共享以及表格样式header/cells的完整配置方法并能直接从仓库源码层面理解表格为何被归类为domain子图类型。使用场景为什么需要表格与图表混排在实际的数据分析工作中经常需要同时呈现明细数据与宏观趋势表格负责展示精确数值折线图负责呈现时间序列走势。Plotly.py 的make_subplots允许把二者编排进同一个Figure共享同一套时间轴形成信息互补的复合视图。原文给出的示例即为一幅比特币挖矿 180 天统计看板顶部是包含日期、交易量、市场价、哈希率等多列明细的表格下方两张子图分别绘制挖矿收入Mining revenue与哈希率Hash rate的时间序列曲线。完整示例一张 3 行混合子图以下是关联文档 doc/python/table-subplots.md 中的完整示例它可直接复制运行需要pandas、re以及网络访问以下载公开数据集import plotly.graph_objects as go from plotly.subplots import make_subplots import pandas as pd import re df pd.read_csv(https://raw.githubusercontent.com/plotly/datasets/master/Mining-BTC-180.csv) for i, row in enumerate(df[Date]): p re.compile( 00:00:00) datetime p.split(df[Date][i])[0] df.iloc[i, 1] datetime fig make_subplots( rows3, cols1, shared_xaxesTrue, vertical_spacing0.03, specs[[{type: table}], [{type: scatter}], [{type: scatter}]] ) fig.add_trace( go.Scatter( xdf[Date], ydf[Mining-revenue-USD], modelines, namemining revenue ), row3, col1 ) fig.add_trace( go.Scatter( xdf[Date], ydf[Hash-rate], modelines, namehash-rate-TH/s ), row2, col1 ) fig.add_trace( go.Table( headerdict( values[Date, NumberbrTransactions, OutputbrVolume (BTC), MarketbrPrice, HashbrRate, Cost perbrtrans-USD, MiningbrRevenue-USD, Trasactionbrfees-BTC], fontdict(size10), alignleft ), cellsdict( values[df[k].tolist() for k in df.columns[1:]], align left) ), row1, col1 ) fig.update_layout( height800, showlegendFalse, title_textBitcoin mining stats for 180 days, ) fig.show()逐步拆解从数据清洗到布局声明1. 数据准备与日期清洗数据集Mining-BTC-180.csv中的Date列带有00:00:00时间后缀。示例用正则表达式将其剥离只保留日期部分保证表格与折线图的时间标签干净一致p re.compile( 00:00:00) datetime p.split(df[Date][i])[0] df.iloc[i, 1] datetime这一步对后续shared_xaxesTrue的轴对齐至关重要——上下子图共享 x 轴时刻度标签必须可比较。2. specs声明每个网格单元的子图类型make_subplots的核心是specs一个与网格一一对应的列表的列表。原文中rows3, cols1声明了 3 行 1 列网格specs中每个元素声明该单元格的子图类型specs[[{type: table}], [{type: scatter}], [{type: scatter}]]{type: table}将第 1 行声明为表格子图{type: scatter}将第 2、3 行声明为二维笛卡尔xy子图。shared_xaxesTrue让第 2、3 行散点子图共享 x 轴vertical_spacing0.03则把行间距压缩到 0.03归一化坐标给 800 像素高的画布留出尽可能多的表格显示空间。3. add_trace把 trace 定向填入指定网格单元fig.add_trace(trace, row..., col...)是向子图填充内容的入口。原文将两个go.Scatter分别填入row3与row2把go.Table填入row1。注意表格子图与散点子图在填充方式上的差异散点 trace 通过row/col关联到网格中对应的xaxis/yaxis表格 trace 属于domain子图类型row/col参数决定其domain绘图区域坐标详见下文原理分析。4. 表格样式header 与 cellsgo.Table的展示样式集中在header与cells两个子对象中可在 plotly/graph_objs/_table.py 的Table._valid_props中看到cells、header、domain、columnorder、columnwidth等全部有效属性go.Table( headerdict( values[Date, NumberbrTransactions, OutputbrVolume (BTC), ...], fontdict(size10), alignleft ), cellsdict( values[df[k].tolist() for k in df.columns[1:]], alignleft ) )header.values表头文本列表其中br是 Plotly 支持的换行标记用于在窄列中把Number Transactions折成两行显示header.font.size10缩小表头字号让 8 列内容在有限宽度内容纳cells.values每个列表对应一列数据示例用[df[k].tolist() for k in df.columns[1:]]把 DataFrame 中除第一列外的所有列批量转为列表alignleft统一左对齐原文同时在header与cells上设置。最后通过fig.update_layout(height800, showlegendFalse, title_text...)统一定制画布高度、图例开关与总标题。深入原理表格为何是 domain 子图类型从源码看make_subplots支持两类占位逻辑。在 plotly/_subplots.py 开头定义了子图类型常量_single_subplot_types {scene, geo, polar, ternary, map} _subplot_types set.union(_single_subplot_types, {xy, domain})table、pie、parcoords、parcats等 trace 没有关联的坐标轴对象而是通过自身的domain属性x/y两个归一化区间在画布上独立定位。_subplot_type_for_trace_type正是依据 trace 是否携带domain属性来判定trace trace_validator.validate_coerce([{type: trace_type}])[0] if domain in trace: return domain elif xaxis in trace and yaxis in trace: return xy也就是说当specs中写{type: table}时make_subplots会把它归一化为domain子图类型再由_init_subplot_domain生成子图引用def _init_subplot_domain(x_domain, y_domain): # No change to layout since domain traces are labeled individually subplot_ref SubplotRef( subplot_typedomain, layout_keys(), trace_kwargs{domain: {x: tuple(x_domain), y: tuple(y_domain)}}, ) return (subplot_ref,)这段实现说明了两点不需要修改 layoutlayout_keys()表示表格子图不创建任何xaxis/yaxis对象散点子图则会创建xaxis/yaxis对见同文件中SubplotXY命名元组坐标通过 trace_kwargs 注入子图网格计算出的domain.x/domain.y会在添加 trace 时写入go.Table(domain...)使表格精确占据网格中第 1 行对应的归一化区域。相应地make_subplots对specs的合法性有严格校验例如specs维度必须与rows/cols完全匹配、colspan/rowspan不能越界这些行为在 tests/test_core/test_subplots/test_make_subplots.py 中有系统性测试如test_specs_underspecified、test_specs_colspan_too_big。make_subplots 关键参数速查源自源码文档在 plotly/subplots.py 的make_subplots签名与 docstring 中与本例直接相关的参数及默认值如下参数默认值说明rows/cols1/1子图网格的行数/列数必须大于 0shared_xaxesFalse布尔或字符串True或columns表示同列子图共享 x 轴rows表示同行共享all表示全部共享shared_yaxesFalse同理控制 y 轴共享columns/True或rows/allhorizontal_spacing0.2 / cols列间距归一化坐标0~1vertical_spacing0.3 / rows行间距归一化坐标0~1start_celltop-left网格编号起点可选bottom-leftprint_gridFalse为True时打印网格字符串表示也可用结果Figure.print_grid()specsNone每个单元格的规格typexy/scene/polar/ternary/map/domain/trace 类型、secondary_y、colspan、rowspan、l/r/t/b内边距subplot_titlesNone每个子图的标题按行优先顺序的列表空字符串表示该格无标题column_widths/row_heightsNone各列宽度/各行高度比例insetsNone叠加在网格单元格上的内嵌子图规格原文示例中vertical_spacing0.03远小于默认的0.3 / 3 0.1正是为了让表格区域获得更大展示高度shared_xaxesTrue则让两条折线共用同一时间轴形成连贯的时间对比。进阶调优调试与排版用 print_grid 验证网格结构在make_subplots中传入print_gridTrue或在生成 figure 后调用fig.print_grid()会在控制台打印类似下面的网格示意图帮助确认每个单元格的类型与归属This is the format of your plot grid: [ (1, 1) table ] [ (2, 1) xy ] [ (3, 1) xy ]这是排查trace 没有出现在预期位置类问题的最快手段。表格区域与图表区域的精细控制若希望表格列宽更合理可在go.Table中设置columnwidth以比例控制各列宽度与columnorder调整列渲染顺序二者均为 plotly/graph_objs/_table.py 中Table声明的有效属性若子图较多需要各自标题使用subplot_titles[Table, Revenue, Hash rate]若希望网格中某些单元格留空可将specs对应位置设为None例如在 3 列布局中实现[{}, None, {}]的效果。参考与延伸阅读本文主题对应的原始文档doc/python/table-subplots.md纯表格场景的完整用法doc/python/table.md子图网格的整体编排、shared_xaxes与specs的通用说明doc/python/subplots.mdmake_subplots的完整参数文档与实现plotly/subplots.py子图类型判定与 domain 布局的底层实现plotly/_subplots.pygo.Tabletrace 的属性定义plotly/graph_objs/_table.pyspecs 校验与网格初始化测试tests/test_core/test_subplots/test_make_subplots.py。结合以上内容你可以用同样的specs机制自由组合table、scatter、bar、pie、heatmap等任意类型的子图把数据明细 可视化图表整合到单张交互式画布中。赞分享数据可视化数据分析【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址https://gitcode.com/gh_mirrors/pl/plotly.py点击查看免费下载相关推荐iOS菜单动画新标杆FlowingMenu如何彻底改变用户交互体验iOS菜单动画新标杆FlowingMenu如何彻底改变用户交互体验 想要为你的iOS应用添加令人惊艳的流畅菜单动画吗FlowingMenu正是你需要的终极解数据可视化数据分析OptiLLM推理技术深度解析从Chain-of-Thought到Monte Carlo Tree Search的演进OptiLLM推理技术深度解析从Chain of Thought到Monte Carlo Tree Search的演进 OptiLLM作为一款优化的LLM推理Cursor AI助手试用限制深度解析从设备标识符机制到实战破解指南Cursor AI助手试用限制深度解析从设备标识符机制到实战破解指南 Cursor免费试用重置工具 为开发者提供了解决AI助手试用限制的专业解决方案。本文将从开发工具CLI上一篇如何5步快速掌握COLMAP从零到三维重建专家的终极指南下一篇三步搞定文本大小Quill编辑器Size格式完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表