为什么添加 hline 或 vline 时 Plotly / Dash 混合图和 table 子图会中断?
Why do Plotly / Dash mixed graph and table subplots break when hline or vline are added?
这是一个 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
我们放置一个 table.
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)
一切正常。但是当我们在左上图添加 hline
或 vline
时...
fig.add_vline(x=42, line_width=1, line_dash='dot', line_color='rgba(255, 165, 0, 0.3)', row=1, col=1)
Plotly 抛出错误:
_plotly_utils.exceptions.PlotlyKeyError: Invalid property specified for object of type plotly.graph_objs.Table: 'xaxis'
Did you mean "cells"?
无论线条方向(h 或 v)如何,或者如果线条仅限于单行和单列或跨越 all
列,都会发生这种情况。
我的规格或布局是否有问题,或者这可能是一个错误?
我不是 plotly 的开发者。这确实是 plotly.
中的错误
- 添加
Scatter()
痕迹,将 go.Table()
添加到子图,然后添加 vline()
失败
- 添加
Scatter()
痕迹,添加 vline()
然后添加 Table()
子图成功
下面的代码在可重现的示例中显示了这一点,更改创建 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)
这是一个 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
我们放置一个 table.
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)
一切正常。但是当我们在左上图添加 hline
或 vline
时...
fig.add_vline(x=42, line_width=1, line_dash='dot', line_color='rgba(255, 165, 0, 0.3)', row=1, col=1)
Plotly 抛出错误:
_plotly_utils.exceptions.PlotlyKeyError: Invalid property specified for object of type plotly.graph_objs.Table: 'xaxis'
Did you mean "cells"?
无论线条方向(h 或 v)如何,或者如果线条仅限于单行和单列或跨越 all
列,都会发生这种情况。
我的规格或布局是否有问题,或者这可能是一个错误?
我不是 plotly 的开发者。这确实是 plotly.
中的错误- 添加
Scatter()
痕迹,将go.Table()
添加到子图,然后添加vline()
失败 - 添加
Scatter()
痕迹,添加vline()
然后添加Table()
子图成功
下面的代码在可重现的示例中显示了这一点,更改创建 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)