【问题标题】:Plotly: How to show all the stacked y axis data values while hovering for three y layout and one x axis shared graph?Plotly:如何在悬停三个 y 布局和一个 x 轴共享图时显示所有堆叠的 y 轴数据值?
【发布时间】:2017-11-27 14:13:21
【问题描述】:

python 3.6 最新的情节使用: python Graph 是使用 plotly offline/Online 函数创建的,其中三个不同的数据框输入用于 y 轴绘图并共享 x 轴(通常是日期索引)。图表非常好。

仅针对特定子图布局显示当前布局图表上的活动区域数据,我希望在将鼠标悬停在任何布局中时显示所有三个布局数据。如何实现这一点?

eq_high = go.Scatter(
                    x=df.index,
                    y=df['High'],
                    name = "EQHigh",
                    line = dict(color = '#3EBF06'),
                    opacity = 0.8)

    eq_low = go.Scatter(
                    x=df.index,
                    y=df['Low'],
                    name = "EQLow",
                    line = dict(color = '#FD2D00'),
                    opacity = 0.8)

    ##
    op_high_ce = go.Scatter(
                    x=stock_opt_ce.index,
                    y=stock_opt_ce['High'],
                    name = "OpHighCE",
                    line = dict(color = '#15655F'),
                    opacity = 0.8)

    op_low_ce = go.Scatter(
                    x=stock_opt_ce.index,
                    y=stock_opt_ce['Low'],
                    name = "OpLowCE",
                    line = dict(color = '#0D7B7F'),
                    opacity = 0.8)

    op_last_ce = go.Scatter(
                    x=stock_opt_ce.index,
                    y=stock_opt_ce['Last'],
                    name = "OpLastCE",
                    line = dict(color = '#6AA6A2'),
                    opacity = 0.8)


    op_settlePr_ce = go.Scatter(
                    x=stock_opt_ce.index,
                    y=stock_opt_ce['Settle Price'],
                    name = "OpSettlePrCE",
                    line = dict(color = '#2AADD1'),
                    opacity = 0.8)

    ##
    op_high_pe = go.Scatter(
                    x=stock_opt_pe.index,
                    y=stock_opt_pe['High'],
                    name = "OpHighPE",
                    line = dict(color = '#FA6300'),
                    opacity = 0.8)

    op_low_pe = go.Scatter(
                    x=stock_opt_pe.index,
                    y=stock_opt_pe['Low'],
                    name = "OpLowPE",
                    line = dict(color = '#AC4C0D'),
                    opacity = 0.8)

    op_last_pe = go.Scatter(
                    x=stock_opt_pe.index,
                    y=stock_opt_pe['Last'],
                    name = "OpLastPE",
                    line = dict(color = '#E19B6D'),
                    opacity = 0.8)

    op_settlepr_pe = go.Scatter(
                    x=stock_opt_pe.index,
                    y=stock_opt_pe['Low'],
                    name = "OpSettlePrPE",
                    line = dict(color = '#A54E1F'),
                    opacity = 0.8)

     data = [eq_high,eq_low,op_high_ce,op_low_ce,op_settlePr_ce,op_high_pe,op_low_pe,op_settlepr_pe]

    #custome Date Range plotting
    layout = dict(
        title = "Graph",
        xaxis = dict(
            range = ['2017-10-1','2017-11-27'])
    )

    fig = dict(data=data, layout=layout)
    iplot(fig, filename = "CorrelationOfEquityAndOptionData")
    plot(fig,show_link = False)

1.在上面的代码中,鼠标悬停时显示所有三个布局数据值需要做哪些更改。目前它只显示一个布局图值。

2.如何在右侧或顶部或底部或左侧显示图形数据点,而不是在图形上显示图形数据。

3.任何更好的优化方式。

预期结果:

【问题讨论】:

  • 有解决办法吗,请反馈。
  • 如果您仍然对答案感兴趣,您可以从您的数据框中添加一些示例数据吗?
  • @MaximilianPeters 在上面的图表中捕获的预期输出是什么(单击链接查看...)。只需将鼠标悬停在直线相交处即可显示所有值。
  • 我已经在 plotly.js#2114(comment) 使用自定义 javascript 使其适用于 plotly Dash。或许可以通过 HTML 函数将 javascript 注入到 notebook 中,但非常 hacky。

标签: python python-3.x graph plotly timeserieschart


【解决方案1】:

在 cmets 进行简短讨论后,此答案已被大量编辑


问题 1:

经过各种尝试,目前看来这是不可能的。但是有一个issue on github

他们希望悬停标签出现在所有 y 轴上的所有轨迹上 共享 x 轴。现在,它们只出现在子图中 你在里面徘徊。

问题 2:

要更改悬停信息的显示方式,请使用fig['layout']['hovermode']。这里的问题是您的选项仅限于以下一个'x''y''closest'。如果您单击Compare data on hover 选项,则无法在不再次运行代码的情况下将其设置回fig['layout']['hovermode'] = 'y'。您还可以使用fig['data'][ser]['hoverinfo']= 'all' 更改每个系列的信息显示方式。在这里,您可以在列表中插入多个选项,例如 xx+y

这是一个带有一些随机数据的示例:

# imports
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
import pandas as pd
import plotly.graph_objs as go
import numpy as np

# setup
init_notebook_mode(connected=True)

# data
np.random.seed(1)
x = np.linspace(0, 1, 50)
y1 = np.cumsum(np.random.randn(50))
y0 = np.cumsum(np.random.randn(50))

# Data
trace0 = go.Scatter(
    x=x,
    y=y0,
)

trace1 = go.Scatter(
    x=x,
    y=y1,
)

# layout
layout = go.Layout(yaxis=dict(range=[-10,10])
)

# Plot
fig = go.Figure(data=[trace0, trace1], layout=layout)

# Edit hoveroptions
fig['layout']['hovermode'] = 'y'

for ser in range(0,len(fig['data'])):
    fig['data'][ser]['hoverinfo']= 'all'  


iplot(fig)

问题 3:

很抱歉,我不知道有任何其他优化方法可以做到这一点。

【讨论】:

  • 感谢您提供详细的答案,它有帮助,它没有解决真正的问题,请参阅我的帖子中的“点击链接查看:imageFormat 中的当前和预期输出”以获得实际和预期的输出。当图被堆叠时,意味着单一布局中有多层剖面图,当您将鼠标放在图表的一部分时,x、y 相交时,它必须显示数据点,目前它只显示当前活动区域的数据点。请求我聊天以详细讨论此问题。
  • 啊,我明白了。那我的回答就有点不对了。我在问题中合并了屏幕截图。稍后我会再看看它。如果我最初的建议确实以某种方式对您有所帮助,我会暂时搁置它。您会考虑共享数据样本吗?
  • 这将非常有用,所以尽管它没有解决问题,但让答案就在那里。 Plotly 不是很人性化,但人们仍然觉得你的答案很有帮助。邀请我聊天以进一步讨论这个话题。
  • 好的。不过,我做了一些更改,以便我回答您的实际挑战,尽管没有解决。
【解决方案2】:

问题一:

最简单的方法是使用子图将所有 3 个图表绘制在一个图表上。下面是制作子图和获取所有悬停信息的基本代码。

from plotly.subplots import make_subplots

fig=make_subplots(rows=3, cols=1, shared_xaxes=True)

fig.update_layout(hovermode='x unified')

将上述参数与您可能需要的其他参数一起使用。

问题2:

我一直在寻找达到相同结果的方法,但还没有成功。

如果你找到答案,请告诉我。

【讨论】:

猜你喜欢
  • 2023-02-04
  • 2020-03-15
  • 1970-01-01
  • 2022-09-25
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 2023-02-04
  • 1970-01-01
相关资源
最近更新 更多