【问题标题】:Plotly: How to add a horizontal scrollbar to a plotly express figure?Plotly:如何将水平滚动条添加到 plotly express 图形?
【发布时间】:2021-09-02 19:44:33
【问题描述】:

我开始了解有关 plotly 和 pandas 的更多信息,并且我希望使用 plotly.express 功能绘制多变量时间序列并与之交互。我还希望我的绘图到一个水平滚动条,以便初始绘图用于预先指定的初始时间间隔。这是我的示例,涉及三个时间序列以及 10 万个时间点:

import plotly.express as px
import numpy as np
import pandas as pd

np.random.seed(123)
e = np.random.randn(100000,3)  
df=pd.DataFrame(e, columns=['a','b','c'])

df['x'] = df.index
df_melt = pd.melt(df, id_vars="x", value_vars=df.columns[:-1])
fig=px.line(df_melt, x="x", y="value",color="variable")
fig.show()

(出于我的最终目的,时间序列会更大——可能在 900K+ 时间点中包含 40 到 70 个时间序列。)

这会创建一个图表,我可以使用 plotly.express 功能(如缩放、平移、矩形选择等)与之交互。

有没有一种方法可以增强它,使初始图仅显示前 500 个时间点,并且滚动条允许我调查随着时间的增加会发生什么?

使用带有 IDLE 的 Mac OS 10.15.4 和 Python 3.7。我希望在 IDLE 中而不是在 Jupyter 笔记本环境中创建它。

【问题讨论】:

  • 非常好——非常感谢。对于我自己的系列,时间点的数量非常多(~900K),通常有 40-70 个系列。我假设在我的网络浏览器中创建图形所需的时间实际上只是我机器的一个功能,除了下采样/抽取之外,我没有什么办法可以加快这个过程?
  • @hfshbacp 乐于助人!您会考虑将我的建议标记为已接受的答案吗?关于时间和速度,请考虑发布一个单独的问题。我非常希望看到自己的答案

标签: python plotly plotly-python


【解决方案1】:

最简单的方法是将以下内容添加到您的设置中:

fig.update_layout(xaxis=dict(rangeslider=dict(visible=True),
                             type="linear"))

你会得到:

这将使您能够对原始图形进行子集化和平移:

完整代码:

import plotly.express as px
import numpy as np
import pandas as pd

np.random.seed(123)
e = np.random.randn(100000,3)  
df=pd.DataFrame(e, columns=['a','b','c'])

df['x'] = df.index
df_melt = pd.melt(df, id_vars="x", value_vars=df.columns[:-1])
fig=px.line(df_melt, x="x", y="value",color="variable")

# Add range slider
fig.update_layout(xaxis=dict(rangeslider=dict(visible=True),
                             type="linear")
)

fig.show()

【讨论】:

  • 有什么方法可以设置滑块的初始宽度?默认情况下,它跨越整个情节,我只能找到一种方法来使用按钮为面向日期的情节设置宽度..
【解决方案2】:

使用plotly.graphing_objects离线使用plotly

您也可以使用plotly.graphing_objects,如下所示。

引用official documentation中的以下示例。

import plotly.graph_objects as go

import pandas as pd

# Load data
df = pd.read_csv(
    "https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv")
df.columns = [col.replace("AAPL.", "") for col in df.columns]

# Create figure
fig = go.Figure()

fig.add_trace(
    go.Scatter(x=list(df.Date), y=list(df.High)))

# Set title
fig.update_layout(
    title_text="Time series with range slider and selectors"
)

# Add range slider
fig.update_layout(
    xaxis=dict(
        rangeselector=dict(
            buttons=list([
                dict(count=1,
                     label="1m",
                     step="month",
                     stepmode="backward"),
                dict(count=6,
                     label="6m",
                     step="month",
                     stepmode="backward"),
                dict(count=1,
                     label="YTD",
                     step="year",
                     stepmode="todate"),
                dict(count=1,
                     label="1y",
                     step="year",
                     stepmode="backward"),
                dict(step="all")
            ])
        ),
        rangeslider=dict(
            visible=True
        ),
        type="date"
    )
)

fig.show()

【讨论】:

  • 您确实不需要需要使用在线 API 来应用 plotly express 的功能。 Plotly express 和 plotly_graphobjects 只是有一些不同的用例。而且你可以在同一张图中完美地结合两者的用法。
  • 也许我当时弄错了。我虽然 plotly.express 需要 api 访问。我稍后会回来查看并更新声明。谢谢。
  • 没问题!也许先看看px.express。您会发现其中最重要的事情之一是 express 非常适用于长数据,而 graphobjects 可以说适用于宽格式的数据,其中您在列中具有独特的值类别。实际上,我昨天在回复this post 时写了一小篇文章
  • 在旁注中,我必须说我真的很喜欢你的回答here。在我看到之前,我不知道 dict flattening 的概念。
  • @vestland 这是另一个宝石:plotly/jupyter-dash
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2020-03-20
  • 2021-12-08
  • 1970-01-01
  • 2021-10-27
相关资源
最近更新 更多