在 Plotly Python 中使用时间滑块绘制连续直方图

Posted

技术标签:

【中文标题】在 Plotly Python 中使用时间滑块绘制连续直方图【英文标题】:Plotting consecutive histograms with time slider in Plotly Python 【发布时间】:2017-08-11 11:03:45 【问题描述】:

我每天从数据中生成两个直方图,一个具有所需值,另一个具有不同站点的已达到值。我想并排绘制这些直方图,例如底部的粉色示例in Plotly here(参见源代码链接)。但是,由于这两个直方图都是每天生成的,所以我需要在图表中添加一个时间滑块,例如底部示例 'Simple Slider' from Plotly(参见源代码链接)。

我的问题是第一个例子使用了

fig = dict(data=data, layout=layout)
plotly.offline.plot(fig, filename='Sine Wave Slider')

绘制直方图,而对于滑块,则使用以下内容:

import plotly.graph_objs as go
fig = go.Figure(data=data, layout=layout)
plotly.offline.plot(fig, filename='styled histogram')

我的(不工作的)代码现在看起来像这样,我尝试在其中绘制相同的 2 个直方图 3 次。如何更改代码以生成同时使用直方图(均具有不同的随机数据)和滑块的图形?

import plotly
import plotly.graph_objs as go
import numpy as np

x0 = np.random.randn(500)
x1 = np.random.randn(500)+1

trace1 = go.Histogram(
    x=x0,
    histnorm='count',
    name='control',
    autobinx=False,
    xbins=dict(
        start=-3.5,
        end=3.0,
        size=0.5
    ),
    marker=dict(
        color='#FFD7E9',
    ),
    opacity=0.75
)
trace2 = go.Histogram(
    x=x1,
    name='experimental',
    autobinx=False,
    xbins=dict(
        start=-2.0,
        end=5,
        size=0.5
    ),
    marker=dict(
        color='#EB89B5'
    ),
    opacity=0.75
)
data = [trace1, trace2]

layout = go.Layout(
    title='Sampled Results',
    xaxis=dict(
        title='Value'
    ),
    yaxis=dict(
        title='Count'
    ),
    bargap=0.2,
    bargroupgap=0.1
)

steps = []
for i in range(len(trace1)):
    step = dict(
        method = 'restyle',
        args = ['visible', [False] * len(trace1)],
    )
    step['args'][1][i] = True # Toggle i'th trace to "visible"
    steps.append(step)

sliders = [dict(
    active = 20,
    currentvalue = "prefix": "Frequency: ",
    pad = "t": 3,
    steps = steps
)]

layout = dict(sliders=sliders)
fig = dict(data=data, layout=layout)
plotly.offline.plot(fig, filename='Histogram Slider')

【问题讨论】:

【参考方案1】: 您可以创建一个直方图列表,比如说 3 天(total_days = 3,奇数是实验性的,偶数是控制性的)。 仅显示第一条轨迹 (visible = day < 1)。 滑块中的每一步都显示/隐藏另一对轨迹。

import plotly
import numpy as np
plotly.offline.init_notebook_mode()

total_days = 3

data = list()

for day in range(total_days):
    data.append(plotly.graph_objs.Histogram(
        x=np.random.randn(500) + day * 0.5,
        histnorm='count',
        name='Day , control'.format(day),
        visible=day < 1
      )
    )
    data.append(plotly.graph_objs.Histogram(
        x=np.random.randn(500) + day,
        histnorm='count',
        name='Day , experimental'.format(day),
        visible=day < 1
      )
    )

steps = list()
for i in range(total_days):
    step = dict(
        method='restyle',
        args=['visible', [False] * total_days * 2],
        label='Day '.format(i)
    )
    step['args'][1][i * 2] = True
    step['args'][1][i * 2 + 1] = True
    steps.append(step)

sliders = [dict(
    active=0,
    steps=steps
)]

layout = dict(sliders=sliders)
fig = dict(data=data, layout=layout)
plotly.offline.iplot(fig)

【讨论】:

谢谢,这解决了我的问题!另一个问题,如果我可能:假设 x 轴不是用数字表示,而是用类表示,其计数每天都在变化,那么您提供的代码中会如何考虑这个因素?我的意思是,假设你有三个名字('Max'、'Ivo'、'Nina'),我们每天绘制它们的重量,预先存储在一个数组中。因此,“Max”将有一个包含 3 个值 [80 81 85] 的数组,其他两个值相同。 不确定我是否理解正确,但这不是一个包含 3 个分类 x 值的简单条形图吗?但我建议,只需发布​​另一个问题,cmets 是隐藏的,它也可能对其他用户有所帮助。 是的,基本上也是一个带有滑块的条形图。但是现在不需要另一个问题了,多亏了你上面的例子,我自己能够轻松地更改代码。再次感谢您! 非常感谢你们。这是一个很好的例子,它使滑块的行为非常清晰。官方文档中的示例非常混乱,应该改用这个:plot.ly/python/sliders

以上是关于在 Plotly Python 中使用时间滑块绘制连续直方图的主要内容,如果未能解决你的问题,请参考以下文章

Python使用plotly绘制数据图表的方法

在 jupyter notebook 中使用 plotly python 绘制具有不等热图的交互式树状图

Plotly Dash:在 Python 中绘制 networkx

在 python 中绘制 3D 绘图

Plotly Dash 回调错误更新输出图

如何使用 plotly.graph_objects 绘制 3D 线?