python 如何导出/保存用plotly制作的动画气泡图?

jvlzgdj9  于 2023-06-20  发布在  Python
关注(0)|答案(4)|浏览(143)

如何导出/保存用plotly制作的动画气泡图?(例如,一个是下面的链接)我想有一个礼物或一些格式更好的决议。先谢谢你。
https://www.kaggle.com/aashita/guide-to-animated-bubble-charts-using-plotly

erhoui1w

erhoui1w1#

在阴谋中不可能做到这一点。请使用gifmaker并将动画中的每个步骤保存为单个图片,以便稍后将它们合并为gif。Follow this source。plotly here提供了关于如何创建动画的进一步解释。
基本的方法是将此逻辑集成到plotly代码的动画过程中:

import ImageSequence
 import Image
 import gifmaker
 sequence = []

 im = Image.open(....)

 # im is your original image
 frames = [frame.copy() for frame in ImageSequence.Iterator(im)]

 # write GIF animation
 fp = open("out.gif", "wb")
 gifmaker.makedelta(fp, frames)
 fp.close()

如果你能提供你的实际代码,就有可能为你的问题提供更详细的答案。:)

kmb7vmvb

kmb7vmvb2#

另一种可能性是使用gif库,它与matplolib,altair和plotly一起工作,并且非常简单。在这种情况下,您将不会使用绘图动画。相反,您定义了一个返回plotly fig的函数,并构造了一个fig列表作为参数传递给gif。
你的代码看起来像这样:

import random
import plotly.graph_objects as go
import pandas as pd
import gif

# Pandas DataFrame with random data
df = pd.DataFrame({
    't': list(range(10)) * 10,
    'x': [random.randint(0, 100) for _ in range(100)],
    'y': [random.randint(0, 100) for _ in range(100)]
})

# Gif function definition
@gif.frame
def plot(i):
    d = df[df['t'] == i]
    fig = go.Figure()
    fig.add_trace(go.Scatter(
        x=d["x"],
        y=d["y"],
        mode="markers"
    ))
    fig.update_layout(width=500, height=300)
    return fig

# Construct list of frames
frames = []
for i in range(10):
    frame = plot(i)
    frames.append(frame)

# Save gif from frames with a specific duration for each frame in ms
gif.save(frames, 'example.gif', duration=100)
mfpqipee

mfpqipee3#

基于已经提供的答案。这将从一个有框架的plotly图形生成一个动画GIF(动画)

  • 首先生成一些测试数据
  • 使用plotly express生成动画图
  • 创建一个图像为每帧在plotly
  • 最后从图像列表中生成动画GIF
import plotly.express as px
import pandas as pd
import numpy as np
import io
import PIL

r = np.random.RandomState(42)

# sample data
df = pd.DataFrame(
    {
        "step": np.repeat(np.arange(0, 8), 10),
        "x": np.tile(np.linspace(0, 9, 10), 8),
        "y": r.uniform(0, 5, 80),
    }
)

# smaple plotly animated figure
fig = px.bar(df, x="x", y="y", animation_frame="step")

# generate images for each step in animation
frames = []
for s, fr in enumerate(fig.frames):
    # set main traces to appropriate traces within plotly frame
    fig.update(data=fr.data)
    # move slider to correct place
    fig.layout.sliders[0].update(active=s)
    # generate image of current state
    frames.append(PIL.Image.open(io.BytesIO(fig.to_image(format="png"))))
    
# create animated GIF
frames[0].save(
        "test.gif",
        save_all=True,
        append_images=frames[1:],
        optimize=True,
        duration=500,
        loop=0,
    )

p5fdfcr1

p5fdfcr14#

只是想我会张贴我发现这个问题的解决方案,我认为可能会容易一点,这取决于您的情况。这个解决方案对我很有效,只使用Pillow外部库。

import PIL.Image
import io
import plotly.express as px

# Generate your animated plot.
plot = px.bar(data_frame=your_data, x=your_x, y=your_y, animation_frame=your_af)

# Save each plot frame to a list that is used to generate the .gif file. 
frames = []
for slider_pos, frame in enumerate(plot.frames):
    plot.update(data=frame.data)
    plot.layout.sliders[0].update(active=slider_pos)
    frames.append(PIL.Image.open(io.BytesIO(plot.to_image(format="png"))))
    
# Create the gif file.
frames[0].save("out_dir",
               save_all=True,
               append_images=frames[1:],
               optimize=True,
               duration=1000,
               loop=0)

gif的循环状态可以用循环参数- 0控制,这意味着它将无限重复。duration参数表示帧之间的毫秒数。

相关问题