有没有办法动态改变每帧的情节动画轴比例?

Posted

技术标签:

【中文标题】有没有办法动态改变每帧的情节动画轴比例?【英文标题】:Is there a way to dynamically change a plotly animation axis scale per frame? 【发布时间】:2021-12-03 15:01:20 【问题描述】:

我有一个动画散点图,通常在 0-0.5 范围内绘制 x,y 坐标,日期/时间是帧键。但是有时我将不得不处理异常数据点,这些数据点将超出此范围。我希望图表能够动态缩放,以便点不会在屏幕外丢失。这可能吗?

def draw(x1,y1,timestamp):

    d = 
        "x1": x1_trim,
        "y1": y1_trim,
        "time": time_trim
    
    
    df = pd.DataFrame(d)
  
    fig = px.scatter(df, x="x1", y="y1", animation_frame="time")
    fig.update_yaxes(autorange=True)
    fig.update_xaxes(autorange=True)
    fig.show()

我尝试过使用带有 autorange 的 update_x/yaxes,但它似乎不起作用。

【问题讨论】:

每一帧都可以有自己的布局,plotly.com/python-api-reference/generated/…看看定义 【参考方案1】:

正如 cmets 中所指出的,有一种方法可以更改每帧的绘图动画轴比例。问题仍然是如何实现动态。但是,如果我们可以说您已经进行了一些计算,可以让您知道要调整哪些帧的范围,那么像 yranges = 2002:[0, 200] 这样的字典和帧上的 for 循环的组合应该可以诀窍。让我们以数据集px.data.gapminder 的一个子集为例。假设您想调整下图中显示年份2002 数据的框架的 y 轴范围:

那么就可以包含下面的sn-p,得到下图为year = 2002

yranges = 2002:[0, 200]
for f in fig.frames:
    if int(f.name) in yranges.keys():
        f.layout.update(yaxis_range = yranges[int(f.name)])

完整代码:

import plotly.express as px
df = px.data.gapminder()
df = df[(df['continent'] == 'Asia') & (df['year'].isin([1997, 2002, 2007]))]

scales = [2002]

fig = px.scatter(df, x="gdpPercap", y="lifeExp", animation_frame="year", animation_group="country",
           size="pop", color="continent", hover_name="country",
           log_x=True, size_max=55, range_x=[100,100000], range_y=[25,90])

yranges = 2002:[0, 200]

for f in fig.frames:
    if int(f.name) in yranges.keys():
        f.layout.update(yaxis_range = yranges[int(f.name)])

fig.show()

【讨论】:

很好......我们得出了非常相似的解决方案 @RobRaymond 是的,没错! 非常感谢您的回答,非常有帮助:)【参考方案2】: 每个框架都可以有自己的布局 构建图形后,遍历帧并定义 x 和 y 轴 范围 代码如下
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go

df = pd.DataFrame(
    
        "time": np.tile(pd.date_range("1-jan-2021", freq="1H", periods=12), 10),
        "x": np.random.uniform(1, 4, 120),
        "y": np.random.uniform(2, 5, 120),
    
)
fig = px.scatter(df, x="x", y="y", animation_frame=df["time"].dt.strftime("%H:%M"))

go.Figure(
    data=fig.data,
    frames=[
        fr.update(
            layout=
                "xaxis": "range": [min(fr.data[0].x) - 0.1, max(fr.data[0].x) + 0.1],
                "yaxis": "range": [min(fr.data[0].y) - 0.1, max(fr.data[0].y) + 0.1],
            
        )
        for fr in fig.frames
    ],
    layout=fig.layout,
)

【讨论】:

太棒了!谢谢

以上是关于有没有办法动态改变每帧的情节动画轴比例?的主要内容,如果未能解决你的问题,请参考以下文章

通过matplotlib中的因子更改绘图比例

有没有办法动态改变 Flutter TextField 的 maxLines?

Flash中帧的类型有( )种。

有没有办法将 Expo 应用程序与 firebase 动态链接集成而无需分离?

有没有办法将数据帧的一列中的所有行与另一个数据帧的另一列(火花)中的所有行进行比较?

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