【问题标题】:How to animate chart with multiple y axis (python)如何为具有多个 y 轴的图表设置动画(python)
【发布时间】:2021-12-18 21:28:22
【问题描述】:

我正在尝试使用辅助 y 轴制作动画情节(目前使用 plotly.express 但对任何其他解决方案开放)。我已经阅读了有关如何使用多个组(Plotly: How to animate a bar chart with multiple groups using plotly express?)为条形图制作动画并在 plotly-express 上制作第二个轴(Plotly: How to plot on secondary y-Axis with plotly express)的不同主题,但是我还没有找到关于如何使用辅助 y 轴制作动画图的任何答案.

这是我的代码

import pandas as pd
import plotly.express as px
df = pd.read_csv("plotly_animation_stackoverflow.csv")
px.bar(data_frame=df,x="date",y=["A","B","C"],animation_frame="lag",barmode="group")

由于比例问题,我看不到 C 列的条形图

plotly-express 也存在问题,因为我的数据框随着额外的滞后而扩展。我可以在 Tableau 中轻松地做到这一点,但我正在努力保持这个开源。是否有另一种方法可以将函数传递给绘图,当我移动滑块时它会应用额外的滞后?

这是数据

date,A,B,C,lag
8/22/2016,54987,36488,0.3389,0
8/23/2016,91957,73793,0.3389,0
8/24/2016,91957,73793,0.3357,0
8/25/2016,91957,73793,0.3291,0
8/26/2016,91957,73793,0.3295,0
8/29/2016,91957,73793,0.3281,0
8/30/2016,107657,82877,0.3273,0
8/31/2016,107657,82877,0.3247,0
9/1/2016,107657,82877,0.322,0
9/2/2016,107657,82877,0.3266,0
8/22/2016,54987,36488,NA,1
8/23/2016,91957,73793,0.3389,1
8/24/2016,91957,73793,0.3389,1
8/25/2016,91957,73793,0.3357,1
8/26/2016,91957,73793,0.3291,1
8/29/2016,91957,73793,0.3295,1
8/30/2016,107657,82877,0.3281,1
8/31/2016,107657,82877,0.3273,1
9/1/2016,107657,82877,0.3247,1
9/2/2016,107657,82877,0.322,1
9/3/2016,,,0.3266,1
8/22/2016,54987,36488,,2
8/23/2016,91957,73793,,2
8/24/2016,91957,73793,0.3389,2
8/25/2016,91957,73793,0.3389,2
8/26/2016,91957,73793,0.3357,2
8/29/2016,91957,73793,0.3291,2
8/30/2016,107657,82877,0.3295,2
8/31/2016,107657,82877,0.3281,2
9/1/2016,107657,82877,0.3273,2
9/2/2016,107657,82877,0.3247,2
9/3/2016,,,0.322,2
9/4/2016,,,0.3266,2

【问题讨论】:

    标签: python plot plotly yaxis plotly-express


    【解决方案1】:
    • 构建图形后,更新所需的轨迹以使用辅助 y 轴。这需要包括框架内的跟踪以及图形内的跟踪
    • 配置辅助 y 轴
    import pandas as pd
    import plotly.express as px
    import io
    
    data = """date,A,B,C,lag
    8/22/2016,54987,36488,0.3389,0
    8/23/2016,91957,73793,0.3389,0
    8/24/2016,91957,73793,0.3357,0
    8/25/2016,91957,73793,0.3291,0
    8/26/2016,91957,73793,0.3295,0
    8/29/2016,91957,73793,0.3281,0
    8/30/2016,107657,82877,0.3273,0
    8/31/2016,107657,82877,0.3247,0
    9/1/2016,107657,82877,0.322,0
    9/2/2016,107657,82877,0.3266,0
    8/22/2016,54987,36488,NA,1
    8/23/2016,91957,73793,0.3389,1
    8/24/2016,91957,73793,0.3389,1
    8/25/2016,91957,73793,0.3357,1
    8/26/2016,91957,73793,0.3291,1
    8/29/2016,91957,73793,0.3295,1
    8/30/2016,107657,82877,0.3281,1
    8/31/2016,107657,82877,0.3273,1
    9/1/2016,107657,82877,0.3247,1
    9/2/2016,107657,82877,0.322,1
    9/3/2016,,,0.3266,1
    8/22/2016,54987,36488,,2
    8/23/2016,91957,73793,,2
    8/24/2016,91957,73793,0.3389,2
    8/25/2016,91957,73793,0.3389,2
    8/26/2016,91957,73793,0.3357,2
    8/29/2016,91957,73793,0.3291,2
    8/30/2016,107657,82877,0.3295,2
    8/31/2016,107657,82877,0.3281,2
    9/1/2016,107657,82877,0.3273,2
    9/2/2016,107657,82877,0.3247,2
    9/3/2016,,,0.322,2
    9/4/2016,,,0.3266,2"""
    
    df = pd.read_csv(io.StringIO(data))
    fig = px.bar(data_frame=df,x="date",y=["A","B","C"],animation_frame="lag",barmode="group")
    
    # update approprate traces to use secondary yaxis
    for t in fig.data:
        if t.name=="C": t.update(yaxis="y2")
    for f in fig.frames:
        for t in f.data:
            if t.name=="C": t.update(yaxis="y2")
    
    # configure yaxis2 and give it some space
    fig.update_layout(yaxis2={"overlaying":"y", "side":"right"}, xaxis={"domain":[0,.98]})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 2021-04-05
      • 2015-05-18
      相关资源
      最近更新 更多