有没有办法动态改变每帧的情节动画轴比例?
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,
)
【讨论】:
太棒了!谢谢以上是关于有没有办法动态改变每帧的情节动画轴比例?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法动态改变 Flutter TextField 的 maxLines?
有没有办法将 Expo 应用程序与 firebase 动态链接集成而无需分离?