为啥在添加 hline 或 vline 时 Plotly / Dash 混合图形和表格子图会中断?

Posted

技术标签:

【中文标题】为啥在添加 hline 或 vline 时 Plotly / Dash 混合图形和表格子图会中断?【英文标题】:Why do Plotly / Dash mixed graph and table subplots break when hline or vline are added?为什么在添加 hline 或 vline 时 Plotly / Dash 混合图形和表格子图会中断? 【发布时间】:2021-11-28 13:53:19 【问题描述】:

这是一个 5 x 3 的子图布局,如下所示:

    fig = make_subplots(rows=5, cols=3,
                        specs=[['secondary_y': True, 'secondary_y': False, 'type': 'table'],
                               ['secondary_y': False, 'secondary_y': False, 'secondary_y': False],
                               ['secondary_y': False, 'secondary_y': False, 'secondary_y': False],
                               ['secondary_y': False, 'secondary_y': False, 'secondary_y': False],
                               ['secondary_y': False, 'secondary_y': False, 'secondary_y': False]],
                        shared_xaxes=True, shared_yaxes=True,
                        vertical_spacing=0.01, horizontal_spacing=0,
                        row_heights=[0.775, 0.15, 0.025, 0.025, 0.025], column_widths=[0.8, 0.1, 0.1])

我们添加子图如下:

fig.add_trace(go.Scatter(x= ... row=1, col=1)
fig.add_trace(go.Scatter(x= ... row=1, col=2)
fig.add_trace(go.Scatter(x= ... row=2, col=1)
fig.add_trace(go.Scatter(x= ... row=3, col=1)
fig.add_trace(go.Scatter(x= ... row=4, col=1)
fig.add_trace(go.Scatter(x= ... row=5, col=1)

在位置 row=1 col=3 我们放置一张桌子。

fig.add_trace(go.Table(header=dict(line=dict(color='red'),
                              fill=dict(color='red')),
                       cells=dict(values=[df.A, df.B])),
              row=1, col=3)

这一切都很好。但是当我们在左上图添加hlinevline 时...

        fig.add_vline(x=42, line_width=1, line_dash='dot', line_color='rgba(255, 165, 0, 0.3)', row=1, col=1)

情节抛出和错误:

_plotly_utils.exceptions.PlotlyKeyError: Invalid property specified for object of type plotly.graph_objs.Table: 'xaxis'

Did you mean "cells"?

无论行方向(h 或 v)如何,或者行仅限于单行和 col 或跨越 all cols,都会发生这种情况。

我的规格或布局是否有问题,或者这可能是一个错误?

【问题讨论】:

【参考方案1】:

我不是 plotly 的开发者。这似乎是 plotly 中的一个错误。

添加Scatter() 跟踪,将go.Table() 添加到子图然后添加vline() 失败 添加Scatter() 跟踪,添加vline() 然后添加Table() 子图成功

下面的代码在可重现的示例中显示了这一点,更改表的创建位置意味着它成功或失败。我建议两种前进方式

    针对 plotly 提出错误/问题并等待修复 使用变通方法来创建内容以使其正常工作
import plotly.graph_objects as go
import pandas as pd
import numpy as np
from plotly.subplots import make_subplots

fig = make_subplots(rows=5, cols=3,
                        specs=[['secondary_y': True, 'secondary_y': False, 'type': 'table'],
                               ['secondary_y': False, 'secondary_y': False, 'secondary_y': False],
                               ['secondary_y': False, 'secondary_y': False, 'secondary_y': False],
                               ['secondary_y': False, 'secondary_y': False, 'secondary_y': False],
                               ['secondary_y': False, 'secondary_y': False, 'secondary_y': False]],
                        shared_xaxes=True, shared_yaxes=True,
                        vertical_spacing=0.01, horizontal_spacing=0,
                        row_heights=[0.775, 0.15, 0.025, 0.025, 0.025], column_widths=[0.8, 0.1, 0.1])
for r in range(5):
    for c in range(3):
        if r==0 and c==2:
            if False:
                df=pd.DataFrame("X":np.linspace(0,10,5), "Y":np.random.uniform(2,4,5))
                fig.add_trace(go.Table(header="values":df.columns, cells="values":df.T.values), row=r+1, col=c+1)
            else:
                pass
        else:
            fig.add_trace(go.Scatter(x=np.linspace(0,50,20), y=np.random.uniform(1,5,29)), row=r+1, col=c+1)
            
fig.add_vline(x=42, line_width=1, line_dash='dot', line_color='rgba(255, 165, 0, 0.3)', row=1, col=1)

# create table after the vline has been added
df=pd.DataFrame("X":np.linspace(0,10,5), "Y":np.random.uniform(2,4,5))
fig.add_trace(go.Table(header="values":df.columns, cells="values":df.T.values), row=1, col=3)

【讨论】:

感谢您彻底调查此问题并提出解决方法。我会提出一个错误并在此处指向您的帖子,看看团队是否有任何见解。

以上是关于为啥在添加 hline 或 vline 时 Plotly / Dash 混合图形和表格子图会中断?的主要内容,如果未能解决你的问题,请参考以下文章

数据为 POSIXct 时,ggplotly() 不显示 geom_vline / geom_hline

R语言ggplot2可视化:为不同的分面图添加不同的geom_vline和geom_hline为不同的分组数据添加不同的横线竖线

jcrop css 更新 vline 和 hline

R:将“vline”和“hline”语句组合在一起(ggplot2)

ggplot:geom_vline 和 geom_hline 的单独图例

如何在同一个散点图上使用 geom_vline() 和 geom_hline 避免图例中的交叉效应?