Plotly:是不是可以在情节时间线上添加第二个 y 轴?

Posted

技术标签:

【中文标题】Plotly:是不是可以在情节时间线上添加第二个 y 轴?【英文标题】:Plotly: Is it possible to add a second y axis to plotly timeline?Plotly:是否可以在情节时间线上添加第二个 y 轴? 【发布时间】:2021-06-28 11:57:03 【问题描述】:

我正在尝试将第二个 y 轴添加到绘图图中。我在文档中找不到任何提示。这可能吗?

  fig = px.timeline(df, x_start="start", x_end="end", y="duration")

fig.update_yaxes(autorange="reversed", type='category')

fig.write_html('fig.html', auto_open=True)

在图的右侧,我想要另一个 y 轴将信息显示为字符串。

如果有人可以帮助我,我将非常感激。

【问题讨论】:

plotly.com/python/multiple-axes/… 这应该会有所帮助 @edgj4718 字符串形式的信息?你不希望次轴与图中的实际轨迹相关联吗? 我希望“yaxis”和“secondary yaxis”都与“start”和“end”值相关。你认为这可以通过在两条迹线中使用相同的 x_start 和 x_end 但不同的 y 然后将这两条迹线绘制在一个图中来实现吗? @edgj4718 我的建议对你有什么效果? 您好。不幸的是,它没有。实际上,我想要的正是上面的图片,右边还有一个额外的 Y 轴。右侧的 Y 轴将显示与左侧几乎相同的信息。左边的那个实际上显示了开始时间和结束时间(持续时间)之间的差异。右边的将显示特定机器在该持续时间内的 CycleTime。例如,在机器 x 上生产一件作品持续了 200 秒(左侧信息)。机器在这件作品上工作 170 年代(右侧信息)。 【参考方案1】:

是的,可以将辅助 y 轴添加到情节时间轴。但不是直接使用px.timeline。您将无法使用以下方法跳过辅助轴的“标准”方法:

fig = make_subplots(specs=[["secondary_y": True]])

但是一旦你这样做了,你可以使用以下方法构建多个 px.timeline 对象:

fx1 = px.timeline(df1, x_start="Start", x_end="Finish", y="Task")

然后从那里“窃取”组件,例如:

fx1.data[0]

fig.layout.xaxis = fx1.layout.xaxis

然后将它们包含在您的第一个 fig 对象中:

fig.add_trace(
    fx2.data[0],
    secondary_y=True,
)

这是一个例子:

这是完整的代码:

import plotly.graph_objects as go
from plotly.subplots import make_subplots

df1 = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28', Completion_pct=50),
    dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15', Completion_pct=25),
#     dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30', Completion_pct=75),
    dict(Task="Job C", Start='2009-04-02', Finish='2009-05-11', Completion_pct=75)
])

df2 = pd.DataFrame([
    dict(Task="Job D", Start='2009-01-01', Finish='2009-02-12', Completion_pct=50),
    dict(Task="Job E", Start='2009-03-05', Finish='2009-04-01', Completion_pct=25),
    dict(Task="Job F", Start='2009-02-20', Finish='2009-08-01', Completion_pct=75)
])


# Create figure with secondary y-axis
fx1 = px.timeline(df1, x_start="Start", x_end="Finish", y="Task")
fx2 = px.timeline(df2, x_start="Start", x_end="Finish", y="Task")

# fx1 = px.timeline(df1, x_start="Start", x_end="Finish", y="Task", color="Task")
# fx2 = px.timeline(df2, x_start="Start", x_end="Finish", y="Task", color="Task")

fig = make_subplots(specs=[["secondary_y": True]])
# Add traces
fig.add_trace(
    fx1.data[0],
    secondary_y=False,
)

fig.add_trace(
    fx2.data[0],
    secondary_y=True,
)

fig.layout.xaxis = fx1.layout.xaxis

# fx1.show()
# fx2.show()
fig.data[0].opacity = 0.2
fig.data[1].width = 0.5
fig.show()

【讨论】:

以上是关于Plotly:是不是可以在情节时间线上添加第二个 y 轴?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用情节提要为 ipad 的 xcode 中的第一个视图内的第二个视图添加动画

如何使用 plotly 在散点图中显示第三个变量的第二个图例?

Plotly:次要 y 轴导致右侧空白

plotly vs seaborn:python中的小提琴情节

从具有相同 ViewController 类的相同情节提要中调用第二个视图

在情节(python)中 - 是不是可以将子图放在子图中