Plot.ly:具有共享 X-Axes 的子图的不同高度
Plot.ly: Different height for subplots with shared X-Axes
背景
- 具有相同高度 (✘) 的不同子图 (✔)
我可以创建一个带有 子图和共享 X-Axes 的图表(示例改编自 Plot.ly doc),在子图和插入位置之间适当分隔通过 subplot_titles
:
每个子图的特定标题
from plotly import tools
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2],
y=[10, 11, 12]
)
trace2 = go.Scatter(
x=[2, 3, 4],
y=[100, 110, 120],
)
trace3 = go.Scatter(
x=[3, 4, 5],
y=[1000, 1100, 1200],
)
fig = tools.make_subplots(rows=3, cols=1, specs=[[{}], [{}], [{}]],
shared_xaxes=True, shared_yaxes=True,
vertical_spacing=0.1, subplot_titles=('subtitle 1',
'subtitle 2', 'subtitle 3'))
fig.append_trace(trace1, 3, 1)
fig.append_trace(trace2, 2, 1)
fig.append_trace(trace3, 1, 1)
fig['layout'].update(height=600, width=600, title='Subplots with Shared X-Axes')
py.plot(fig, filename='subplots-shared-xaxes')
- 具有不同高度 (✔) 的合并子图 (✘)
我还可以使用 Stacked Subplots 和共享 X-Axis 创建一个图表(示例改编自 Plot.ly doc),您可以在其中定义相对高度每个子图通过 domain
:
from plotly import tools
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2],
y=[10, 11, 12]
)
trace2 = go.Scatter(
x=[2, 3, 4],
y=[100, 110, 120],
yaxis='y2'
)
trace3 = go.Scatter(
x=[3, 4, 5],
y=[1000, 1100, 1200],
yaxis='y3'
)
data = [trace1, trace2, trace3]
layout = go.Layout(
yaxis=dict(
domain=[0, 0.25]
),
legend=dict(
traceorder='reversed'
),
yaxis2=dict(
domain=[0.25, 0.75]
),
yaxis3=dict(
domain=[0.75, 1]
)
)
fig = go.Figure(data=data, layout=layout)
fig['layout'].update(height=600, width=600, title='Stacked Subplots with Shared X-Axes')
py.plot(fig, filename='stacked-subplots-shared-x-axis')
问题
How to to create subplots with shared x-axes where you have both a title (fig 1) and different relative height (fig 2) for each subplot?
我试过的
- 使用
subplots
和rowspan
第一个 hack 是创建一个额外的行,使绘图跨越其中两个:
from plotly import tools
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2],
y=[10, 11, 12]
)
trace2 = go.Scatter(
x=[2, 3, 4],
y=[100, 110, 120],
)
trace3 = go.Scatter(
x=[3, 4, 5],
y=[1000, 1100, 1200],
)
fig = tools.make_subplots(
rows=4,
cols=1,
specs=[
[{}],
[{'rowspan':2}],
[None],
[{}],
],
shared_xaxes=True,
shared_yaxes=True,
vertical_spacing=0.1,
subplot_titles=(
'subtitle 1',
'subtitle 2',
None,
'subtitle 3',
)
)
fig.append_trace(trace3, 1, 1)
fig.append_trace(trace2, 2, 1)
fig.append_trace(trace1, 4, 1)
fig['layout'].update(height=600, width=600, title='Subplots with Shared X-Axes, span rows')
py.plot(fig, filename='subplots-shared-x-axis-span-rows', auto_open=True)
结果正是我想要达到的结果。但是,这个 hack 对我来说似乎错误:从句法上讲,我不不需要跨越两行的图表。此外,必须将 [None]
添加到 specs
并将 None
添加到 subplot_titles
是丑陋的,如果您想修改任何内容,则必须添加 error-prone。
还要考虑您想要子图的 13% | 70% | 17%
高度分布的情况!
- 使用
domain
一个稍微好一点的选择是使用 domain
的更新轴,但是子图标题会搞砸(它们仍然垂直均匀分布):
from plotly import tools
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2],
y=[10, 11, 12]
)
trace2 = go.Scatter(
x=[2, 3, 4],
y=[100, 110, 120],
)
trace3 = go.Scatter(
x=[3, 4, 5],
y=[1000, 1100, 1200],
)
fig = tools.make_subplots(
rows=3,
cols=1,
specs=[[{}], [{}], [{}]],
shared_xaxes=True,
shared_yaxes=True,
vertical_spacing=0.1,
subplot_titles=(
'subtitle 1',
'subtitle 2',
'subtitle 3'
)
)
fig.append_trace(trace1, 3, 1)
fig.append_trace(trace2, 2, 1)
fig.append_trace(trace3, 1, 1)
fig['layout'].update(height=600, width=600, title='Subplots with Shared X-Axes and `domain` hack')
fig['layout']['yaxis1'].update(domain=[0, 0.2])
fig['layout']['yaxis2'].update(domain=[0.3, 0.7])
fig['layout']['yaxis3'].update(domain=[0.8, 1])
py.plot(fig, filename='subplots-shared-x-axis-domain-hack', auto_open=True)
此错误已由 Kully 在 PR #1245 中解决并 在 dash v3.4.0
中修复。
以下代码 — 仅使用 3 个子图和 row_width=[0.2, 0.4, 0.2]
— 因此应该可以完美运行:
from plotly import tools
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2],
y=[10, 11, 12]
)
trace2 = go.Scatter(
x=[2, 3, 4],
y=[100, 110, 120],
)
trace3 = go.Scatter(
x=[3, 4, 5],
y=[1000, 1100, 1200],
)
fig = tools.make_subplots(rows=3, cols=1,
shared_xaxes=True,
vertical_spacing=0.1,
subplot_titles=('subtitle 1', 'subtitle 2', 'subtitle 3'),
row_width=[0.2, 0.4, 0.2]
)
fig.append_trace(trace1, 3, 1)
fig.append_trace(trace2, 2, 1)
fig.append_trace(trace3, 1, 1)
fig['layout'].update(height=600, width=600, title='Subplots with Shared X-Axes')
go.FigureWidget(fig)
背景
- 具有相同高度 (✘) 的不同子图 (✔)
我可以创建一个带有 子图和共享 X-Axes 的图表(示例改编自 Plot.ly doc),在子图和插入位置之间适当分隔通过 subplot_titles
:
from plotly import tools
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2],
y=[10, 11, 12]
)
trace2 = go.Scatter(
x=[2, 3, 4],
y=[100, 110, 120],
)
trace3 = go.Scatter(
x=[3, 4, 5],
y=[1000, 1100, 1200],
)
fig = tools.make_subplots(rows=3, cols=1, specs=[[{}], [{}], [{}]],
shared_xaxes=True, shared_yaxes=True,
vertical_spacing=0.1, subplot_titles=('subtitle 1',
'subtitle 2', 'subtitle 3'))
fig.append_trace(trace1, 3, 1)
fig.append_trace(trace2, 2, 1)
fig.append_trace(trace3, 1, 1)
fig['layout'].update(height=600, width=600, title='Subplots with Shared X-Axes')
py.plot(fig, filename='subplots-shared-xaxes')
- 具有不同高度 (✔) 的合并子图 (✘)
我还可以使用 Stacked Subplots 和共享 X-Axis 创建一个图表(示例改编自 Plot.ly doc),您可以在其中定义相对高度每个子图通过 domain
:
from plotly import tools
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2],
y=[10, 11, 12]
)
trace2 = go.Scatter(
x=[2, 3, 4],
y=[100, 110, 120],
yaxis='y2'
)
trace3 = go.Scatter(
x=[3, 4, 5],
y=[1000, 1100, 1200],
yaxis='y3'
)
data = [trace1, trace2, trace3]
layout = go.Layout(
yaxis=dict(
domain=[0, 0.25]
),
legend=dict(
traceorder='reversed'
),
yaxis2=dict(
domain=[0.25, 0.75]
),
yaxis3=dict(
domain=[0.75, 1]
)
)
fig = go.Figure(data=data, layout=layout)
fig['layout'].update(height=600, width=600, title='Stacked Subplots with Shared X-Axes')
py.plot(fig, filename='stacked-subplots-shared-x-axis')
问题
How to to create subplots with shared x-axes where you have both a title (fig 1) and different relative height (fig 2) for each subplot?
我试过的
- 使用
subplots
和rowspan
第一个 hack 是创建一个额外的行,使绘图跨越其中两个:
from plotly import tools
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2],
y=[10, 11, 12]
)
trace2 = go.Scatter(
x=[2, 3, 4],
y=[100, 110, 120],
)
trace3 = go.Scatter(
x=[3, 4, 5],
y=[1000, 1100, 1200],
)
fig = tools.make_subplots(
rows=4,
cols=1,
specs=[
[{}],
[{'rowspan':2}],
[None],
[{}],
],
shared_xaxes=True,
shared_yaxes=True,
vertical_spacing=0.1,
subplot_titles=(
'subtitle 1',
'subtitle 2',
None,
'subtitle 3',
)
)
fig.append_trace(trace3, 1, 1)
fig.append_trace(trace2, 2, 1)
fig.append_trace(trace1, 4, 1)
fig['layout'].update(height=600, width=600, title='Subplots with Shared X-Axes, span rows')
py.plot(fig, filename='subplots-shared-x-axis-span-rows', auto_open=True)
结果正是我想要达到的结果。但是,这个 hack 对我来说似乎错误:从句法上讲,我不不需要跨越两行的图表。此外,必须将 [None]
添加到 specs
并将 None
添加到 subplot_titles
是丑陋的,如果您想修改任何内容,则必须添加 error-prone。
还要考虑您想要子图的 13% | 70% | 17%
高度分布的情况!
- 使用
domain
一个稍微好一点的选择是使用 domain
的更新轴,但是子图标题会搞砸(它们仍然垂直均匀分布):
from plotly import tools
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2],
y=[10, 11, 12]
)
trace2 = go.Scatter(
x=[2, 3, 4],
y=[100, 110, 120],
)
trace3 = go.Scatter(
x=[3, 4, 5],
y=[1000, 1100, 1200],
)
fig = tools.make_subplots(
rows=3,
cols=1,
specs=[[{}], [{}], [{}]],
shared_xaxes=True,
shared_yaxes=True,
vertical_spacing=0.1,
subplot_titles=(
'subtitle 1',
'subtitle 2',
'subtitle 3'
)
)
fig.append_trace(trace1, 3, 1)
fig.append_trace(trace2, 2, 1)
fig.append_trace(trace3, 1, 1)
fig['layout'].update(height=600, width=600, title='Subplots with Shared X-Axes and `domain` hack')
fig['layout']['yaxis1'].update(domain=[0, 0.2])
fig['layout']['yaxis2'].update(domain=[0.3, 0.7])
fig['layout']['yaxis3'].update(domain=[0.8, 1])
py.plot(fig, filename='subplots-shared-x-axis-domain-hack', auto_open=True)
此错误已由 Kully 在 PR #1245 中解决并 在 dash v3.4.0
中修复。
以下代码 — 仅使用 3 个子图和 row_width=[0.2, 0.4, 0.2]
— 因此应该可以完美运行:
from plotly import tools
import plotly.plotly as py
import plotly.graph_objs as go
trace1 = go.Scatter(
x=[0, 1, 2],
y=[10, 11, 12]
)
trace2 = go.Scatter(
x=[2, 3, 4],
y=[100, 110, 120],
)
trace3 = go.Scatter(
x=[3, 4, 5],
y=[1000, 1100, 1200],
)
fig = tools.make_subplots(rows=3, cols=1,
shared_xaxes=True,
vertical_spacing=0.1,
subplot_titles=('subtitle 1', 'subtitle 2', 'subtitle 3'),
row_width=[0.2, 0.4, 0.2]
)
fig.append_trace(trace1, 3, 1)
fig.append_trace(trace2, 2, 1)
fig.append_trace(trace3, 1, 1)
fig['layout'].update(height=600, width=600, title='Subplots with Shared X-Axes')
go.FigureWidget(fig)